Подтвердить что ты не робот

Как получить Eclipse Console для гиперссылки текста в файлы исходного кода?

В коде:  System.out.println( "myPackage.MyClass" );

В консоли Eclipse:  myPackage.MyClass.myMethod

Я хочу щелкнуть на выходе (myPackage.MyClass.myMethod) в Консоли, и он непосредственно показывает соответствующий метод, аналогичный тому, что происходит для трассировки стека исключений. Любая идея?

4b9b3361

Ответ 1

Гиперссылка на трассировки стека исключений основана на имени файла и номере строки, указанном в конце строки. Например.

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)

Для первой трассировки стека она находится в строке 102 в файле JavaBeanObservableValue.java. Поиск файла выполняется в текущем пути к классу, поэтому, если у вас есть несколько классов с тем же именем, первое всегда найдено...

Другими словами, если вы хотите добавить расширенную гиперссылку на основе вашего примера, вам нужно немного расширить консольный вид...

... который можно сделать с помощью точки расширения org.eclipse.ui.console.consolePatternMatchListeners. Достаточно просто использовать эту точку расширения и, посмотрев пример из JDT, вы сможете заставить ваш пример работать без особых усилий...

Ответ 2

Возможно, это ясно для других людей, но я нашел, что другие ответы сбивают с толку, хотя и правильны. Консоль eclipse анализирует шаблон (FileName.java:lineNumber) как ссылку на эту строку в этом файле:

(MyFile.java:2)

Как указывают другие ответы, есть много способов вывода этого на консоль. Расположение в строке не имеет значения, это просто совпадение с шаблоном. Как показывает Колин Смит, log4j PatternLayout может использовать (%F:%L) для получения имени файла и номера строки. Чтобы получить имя файла и номер строки программным способом, просмотрите этот вопрос.

Вопрос задает вопрос о ссылке на метод, и я считаю, что вы можете использовать метод consolePatternMatchListeners, рекомендованный Тонни Мэдсеном и более подробно описанный в этом вопросе.

Ответ 3

Более простой способ - обмануть консоль в создании ссылки для вас. Формат прост:

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

Очевидно, вы можете указать тип класса и номер строки в коде, как хотите.

Ответ 4

Или, если вы используете log4j, вы можете настроить свой appender следующим образом:

<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"/>

Ответ 5

Я использую пользовательское представление консоли и добавляю IPatternMatchListener к MessageConsole с помощью

console.addPatternMatchListener(...)

Важным преимуществом использования слушателя является то, что событие предоставляет смещение, которое требуется для создания гиперссылки.

Отправную точку для реализации 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"

Я все еще ищу альтернативу.

Ответ 6

Вот простой метод обертки, основанный на всех остальных ответах, которые можно использовать где угодно, чтобы получить строку, форматированную так, чтобы консоль Eclipse ссылалась на строку в любом файле, где вызывается getSourceCodeLine(). Я также обнаружил, что печать в System.err в Eclipse будет показана красным цветом.

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 a link to " + getSourceCodeLine());
    System.err.println("And a red link to " + getSourceCodeLine());
}