2011-06-24 6 views
13

中コード: System.out.println( "myPackage.MyClass"); EclipseのコンソールでEclipse Consoleでテキストをソースコードファイルにハイパーリンクする方法は?

: は、私はコンソールの出力(myPackage.MyClass.myMethod)をクリックしますと、それが直接の例外スタックトレースのために何が起こるかに似て対応する方法を、示し

をmyPackage.MyClass.myMethod 。何か案が?

答えて

8

例外スタックトレースのハイパーリンクは、行の最後に指定されたファイル名と行番号に基づいています。例えば。

Stack trace: 

org.eclipse.jface.internal.databinding.provisional.BindingException: string property does not have a read method. 
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.doGetValue(JavaBeanObservableValue.java:102) 
at org.eclipse.jface.internal.databinding.internal.beans.JavaBeanObservableValue.setValue(JavaBeanObservableValue.java:83) 

最初のスタックトレースでは、ファイルJavaBeanObservableValue.javaの102行目です。ファイルは現在のクラスパスの後で検索されるので、同じ名前のクラスが複数ある場合は、最初に見つかる...

つまり、例に基づいて拡張ハイパーリンクを追加する場合は、コンソールビューを少し拡張する必要があります...

... org.eclipse.ui.console.consolePatternMatchListeners拡張ポイントで行うことができます。この拡張ポイントを使用するのはかなり簡単ですし、JDTの例を見ることで、あまりにも多くの作業をすることなく、あなたの例を得ることができます。

7

もっと簡単な方法は、あなたのためのリンク。形式はシンプルです:

System.out.println("(" + new TestBed().getClass().getSimpleName() + ".java:" + 18 + ")"); 

明らかに、クラスの種類と行番号は、必要に応じてコードで指定できます。

+0

現在の行の行番号を取得するには、例外をスローして行番号を取得します。おそらく、驚くほど効率的ではありませんが、もしあなたがこのようなことをしているのであれば、効率はおそらくあなたの後ろではありません。 –

+0

'Class.getName'は正規のクラス名を出力します - パッケージでは、これは悪いコードのためのインジケータであるパッケージを使わないと動くので、' getSimpleName'はすべての場合に有効です – specializt

3

それとも、あなたがlog4jのを使用している場合、あなたはこのようなあなたのアペンダを設定することができます。

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m (%F:%L) in %t%n"/> 
    </layout> 
</appender> 

あなたはそれがあまりにものIntelliJ IDEAに仕事をしたい場合は、あなたが使用することができます。たぶん

 <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p %m - at %c.%M(%F:%L) in %t%n"/> 
13

この他の人には明らかですが、私は正しいが、他の答えは混乱していることがわかりました。他の回答が指摘するように、コンソールに出力これまで多くの方法がある

(MyFile.java:2) 

:Eclipseのコンソールには、パターン(FileName.java:lineNumber)がそのファイル内のその行へのリンクであることを解析します。行内の位置は重要ではありませんが、パターンマッチングに過ぎません。 Colin Smithが示すように、log4j PatternLayoutは(%F:%L)を使用してファイル名と行番号を取得できます。プログラムでファイル名と行番号を取得するには、this questionを参照してください。

質問にはメソッドへのリンクが必要ですが、私はあなたがTonny Madsenが推奨し、this questionで詳細に説明されているconsolePatternMatchListenersメソッドを使用できると信じています。

0

私は、カスタムコンソールビューを使用して、私は、リスナーを使用しての重要な利点は、イベントは、ハイパーリンクを作成するために必要なオフセットを提供することである

console.addPatternMatchListener(...) 

でMessageConsoleにIPatternMatchListenerを追加します。

ハイパーリンクがここで見つけることができます作成​​IPatternMatchListenerの実施のための出発点:

https://github.com/mjwach/ErrorLinkyThing/blob/master/source/errorlinkything/ErrorLinkyPatternMatchListenerDelegate.java

トリッキーな部分は、ファイル名から完全なファイルパスを取得するためのようです(私はしないでくださいロガーを使用してください)。周りサンシェードプラグインが使用する作業がここで見つけることができ

http://sunshade.cvs.sourceforge.net/viewvc/sunshade/net.sourceforge.sunshade/src/net/sourceforge/sunshade/util/FileUtil.java?view=markup

参照方法「dereferenceWindowsLink」

私はまだ代替を探しています。

0

ここではEclipseのコンソールがgetSourceCodeLine(任意のファイルの行にリンクするようにフォーマットされた文字列を取得するためにどこでも使用することができ、誰も他の人の回答に基づいて、単純なラッパーの工法です)が呼び出されます。また、EclipseのSystem.errへの印刷がの赤色のに表示されることも発見しました。

public static String getSourceCodeLine() { 
    // An index of 1 references the calling method 
    StackTraceElement ste = new Throwable().getStackTrace()[1]; 
    return "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")"; 
} 

public static void main(String[] args) 
    System.out.println("Here's a link to " + getSourceCodeLine()); 
    System.err.println("And a red link to " + getSourceCodeLine()); 
} 
関連する問題