Pregunta

Estoy escribiendo un complemento de eclipse para admitir el Fragmentar lenguaje de programación. Yo uso el DIABLILLO Meta Tooling Platform y Eclipse Indigo (3.7). El entorno de tiempo de ejecución es Java 1.7.

El complemento utiliza el mismo código que el compilador de lotes para el análisis de token, el análisis de sintaxis, etc. Sin embargo, noté un comportamiento diferente cuando se ejecuta desde el complemento Eclipse y lo trazé hasta el siguiente método que lee un archivo de clase de un módulo previamente compilado a Obtenga metainformación que se almacena allí en forma de anotaciones Java:

public static MD.Operator[] getOperators(ClassLoader loader, String pack) 
                                              throws ClassNotFoundException {
    Class<?> cl = null;
    cl = loader.loadClass(pack);
    MD.FregePackage os = cl.getAnnotation(MD.FregePackage.class);
    if (os == null) return null;        // <-- no annotation present
    return os.ops();
}    

Tenga en cuenta que el código crea su propia instancia de un URLClassLoader, que se pasa como argumento. Si no estableció la ruta de clase correctamente, el método GetOperators arroja correctamente una ClassNotFoundException, por lo tanto, creo que puedo estar seguro de que carga la clase. Un mensaje de rastreo me dice que el cargador de clase está construido con la siguiente ruta (que es solo la classpath de forma predeterminada):

mkClassLoader:[C:\opt\eclipse\plugins\org.eclipse.equinox.launcher_1.2.0.v20110502.jar, X:\dev\frege\build]

Porque un archivo de clase no creado por el compilador Frege normalmente no puede tener el MD.FregePackage Anotación Esto generalmente indica que el usuario intentó importar una clase Java simple y, de hecho, recibo el siguiente mensaje en el complemento:

X:/dev/runtime-EclipseApplication/TestJFrege/src/Neu.fr:1: `frege.prelude.Base` is not a frege package

Sin embargo, desde la línea de comando puedo compilar esto bien. Incluí esto aquí como prueba de que las anotaciones en cuestión se pueden cargar desde la misma ubicación:

X:\dev\frege>java -cp ./build frege.compiler.Main X:/dev/runtimeEclipseApplication/TestJFrege/src/Neu.fr
mkClassLoader: [./build]
running: javac -cp ./build -d . -encoding UTF-8 ./Neu.java

Reanudando los hechos:

  1. El código que se supone que carga las anotaciones funciona bien cuando el compilador se invoca a través de la interfaz de línea de comandos.
  2. El código que se supone que carga las anotaciones no sabe si se invoca desde el complemento o la línea de comando. De hecho, el complemento ni siquiera existió hasta la semana pasada, mientras que la interfaz de línea de comandos solía funcionar bien durante meses.
  3. Las anotaciones tienen, por supuesto, RetentionPolicy.RUNTIME De lo contrario, la compilación de la línea de comando tampoco los reconocería. Pero prooviblemente lo hace.

Entonces, la única conclusión que puedo sacar es que Class.getAnnotation() De alguna manera no funciona correctamente. Esto es muy desafortunado, ya que esto destruye efectivamente la funcionalidad básica que necesito para el sistema de módulos.

Si esto importa de todos modos: el código del compilador Frege que usa el complemento es sí mismo Escrito en frege y el frege.prelude.Base La clase mencionada anteriormente es una biblioteca básica que necesita cada módulo, por lo tanto, ya debe haberse cargado en la activación del complemento, aunque, por supuesto, con un cargador de clase diferente.

¿Alguien tiene experiencias similares? ¿Es posible resolver esto y cómo? Cualquier sugerencia sobre cómo eludir esto es bienvenido.

¿Fue útil?

Solución

Fue el MD.FregePackage ¿La clase cargada por el cargador de clases utilizado en su método? Posiblemente intente cargarlo primero, ya que dos clases no son equal() Si fueron cargados por diferentes cargadores de clase. Eso podría explicar por qué no se encuentra.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top