2011-06-24 14 views

Respuesta

8

El hipervínculo para los rastreos de la pila de excepciones se basa en el nombre del archivo y el número de línea que figura al final de la línea. P.ej.

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) 

Por primera traza de la pila, que está en la línea 102 en el archivo JavaBeanObservableValue.java. El archivo se busca después en la ruta de la clase actual, de modo que si tiene varias clases con el mismo nombre, siempre se encuentra el primero ...

En otras palabras, si desea agregar hipervínculos extendidos según su ejemplo, necesita ampliar un poco la vista de la consola ...

... que se puede hacer con el punto de extensión org.eclipse.ui.console.consolePatternMatchListeners. Es bastante fácil usar este punto de extensión y al ver el ejemplo de JDT, debería poder hacer que su ejemplo funcione sin demasiado trabajo ...

7

Un método mucho más fácil es engañar a la consola para crear un enlace para ti El formato es simple:

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

Obviamente, puede proporcionar el tipo de clase y el número de línea en el código que desee.

+0

para obtener el número de línea de la línea actual, se puede lanzar y agarrar excepción y el número de línea de eso. No sorprendentemente eficiente, probablemente, pero si estás haciendo este tipo de cosas, entonces la eficiencia probablemente no sea lo que buscas. –

+0

'Class.getName' te mostrará el nombre de la clase canónica - con paquetes para que esto sólo funcionará si no paquetes de uso (que es un indicador de mal código),' getSimpleName' debería funcionar en todos los casos – specializt

3

O, si utiliza log4j, puede configurar su appender así:

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

Si quieres que funcione en IntelliJ IDEA también, que puede utilizar:

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

Tal vez esto es claro para otras personas, pero encontré las otras respuestas confusas, aunque correctas. La consola Eclipse analiza el patrón (FileName.java:lineNumber) sea un enlace a esa línea en ese archivo:

(MyFile.java:2) 

Como las otras respuestas señalan, hay muchas maneras a la producción de este a la consola. La ubicación en la línea no importa, es solo una coincidencia de patrón. Como muestra Colin Smith, log4j PatternLayout puede usar (%F:%L) para obtener el nombre del archivo y el número de línea. Para obtener el nombre del archivo y el número de línea programáticamente, vea this question.

La pregunta se refiere a la vinculación a un método y creo que podría utilizar el método consolePatternMatchListeners recomendado por Tonny Madsen y descrito con más detalle en this question.

0

que utilizar una vista consola personalizada y agrego una IPatternMatchListener a la MessageConsole con

console.addPatternMatchListener(...) 

Una ventaja importante del uso del oyente es que el evento proporciona la desplazamiento que se requiere para crear el hipervínculo.

Un punto de partida para la implementación de IPatternMatchListener que crea hipervínculos se puede encontrar aquí:

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

La parte más difícil parece ser la de obtener la ruta completa del archivo del nombre de archivo (no lo hago usar un registrador).

un trabajo alrededor utilizado por el plugin sombrilla se puede encontrar aquí:

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

Véase el método de "dereferenceWindowsLink"

Todavía estoy buscando una alternativa.

0

Aquí es un método simple envoltorio basado en las respuestas de todos los demás que se puede utilizar en cualquier lugar para obtener una cadena formateada de manera que la consola de Eclipse se enlazará con la línea en cualquier archivo donde getSourceCodeLine() se llama. También descubrí que imprimir en System.err en Eclipse se mostrará en rojo.

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()); 
} 
Cuestiones relacionadas