Utilizando Eclipse Java Compiler (ecj) en maven comstackciones

Eclipse usa su propio comstackdor (ECJ) para comstackr código Java. La depuración de un progtwig comstackdo con Eclipse es más fácil, ya que los cambios de código simples se pueden aplicar de forma instantánea (mediante el reemplazo del código activo).

Por otro lado, Maven usa (de forma predeterminada) oracle JDK, que genera un código de bytes diferente para evitar el reemplazo de códigos en caliente en una sesión de depuración de Eclipse.

Entonces, me gustaría usar el comstackdor ECJ de Eclipse con mi comstackción maven, si planeo depurar el progtwig. Una forma conveniente para mí sería un perfil “ecj“:

  • Comstackr lanzamiento

    $ mvn package 
  • Comstackr instantánea con reemplazo de código activo habilitado

     $ mvn -P ecj package 

Además, la activación del perfil se puede especificar en settings.xml o incluso en las propiedades del proyecto Eclipse.

Mis preguntas son:

  1. ¿Es este el camino correcto?
  2. ¿Cómo se puede configurar esto?
  3. ¿Se puede usar maven toolchain para esto?

Es posible cambiar el comstackdor javac predeterminado que es utilizado por maven-compiler-plugin . El comstackdor de Eclipse se incluye en el artefacto plexus-compiler-eclipse y se declara al establecer eclipse en el atributo compilerId del compilerId maven-compiler-plugin .

Si desea activar este cambio para un perfil personalizado , podría tener la siguiente configuración:

  ecj    maven-compiler-plugin 3.6.0  eclipse    org.codehaus.plexus plexus-compiler-eclipse 2.8.1       

El complemento se mantiene en el repository GitHub del plexus-compiler . La versión 2.8.1 usa 3.11.1.v20150902-1521 de JDT , aunque puede usar su propia versión agregando una dependencia en org.eclipse.tycho:org.eclipse.jdt.core después de la dependencia del comstackdor Plexus.

El comstackdor Eclipse Java (ecj) tiene muchas ventajas sobre el comstackdor javac estándar. Es rápido y tiene muchas más advertencias y errores que se pueden configurar, lo que mejora la calidad del código. Una de las cosas más interesantes en el comstackdor es la adición de tipos nulos dentro del comstackdor : anotando su código con anotaciones @Nullable y @NotNull puede forzar al comstackdor Eclipse a verificar accesos nulos en tiempo de comstackción en lugar de tiempo de ejecución. Cuando se aplica rigurosamente, esto le enseña a codificar de manera más segura (evitando valores nulos) y previene las excepciones de NPE durante las pruebas o la producción.

Usar el comstackdor de Eclipse dentro de Maven no es demasiado difícil, pero hay mucha desinformación e información antigua en Internets que causa mucha confusión. Espero que esto ayude a aclarar las cosas.

Para hacer que Eclipse use el comstackdor ecj, necesita usar el plugin plexus-compiler-eclipse y nada más. Una configuración típica sería la siguiente:

    org.apache.maven.plugins maven-dependency-plugin   org.apache.maven.plugins maven-compiler-plugin 3.7.0  eclipse ${source.jdk.version} ${target.jdk.version}   ${project.basedir}/.settings/org.eclipse.jdt.core.prefs  true true    org.codehaus.plexus plexus-compiler-eclipse 2.8.3   org.eclipse.jdt ecj 3.13.101     

Ponga esta parte en la sección pluginManagement o build de su pom padre / raíz.

Ahora expliquemos las diferentes partes;)

El plugin maven-compiler necesita ser de una versión reciente. Los parámetros de origen y destino definen las versiones de Java que se usarán para el código fuente y el código de bytes, y generalmente son los mismos.

Pasar argumentos al comstackdor es un completo tren de guerra. Vea la sección separada sobre eso debajo aquí. En este ejemplo utilizo la configuración de propiedades que me permite proporcionar una configuración detallada de los errores y advertencias que quiero tener al comstackr cosas. Al usar la variable $ {project.basedir} dentro del parámetro, tengo estas configuraciones por proyecto: se requiere que cada proyecto tenga un archivo .settings / org.eclipse.jdt.core.prefs presente (que es por casualidad la ubicación donde el Eclipse IDE deja su configuración de comstackdor).

La dependencia de plexus-codehaus-eclipse define el complemento que sabe cómo ejecutar el comstackdor de Eclipse. La versión 2.8.3 fue la última en el momento de la redacción, pero esta versión tiene algunos problemas. La versión 2.8.4 debería venir con una interfaz reescrita para el comstackdor que corrige muchos problemas, pero esta versión todavía está en proceso en el momento de la redacción. Puede encontrar detalles sobre el complemento aquí , para que se pueda seguir el progreso en las nuevas versiones / cambios de código.

La otra dependencia importante es la dependencia org.eclipse.jdt: ecj: esta especifica la versión exacta del comstackdor ecj que se debe usar . Siempre debe especificarlo porque, de lo contrario, la estabilidad de la comstackción sufrirá cuando el complemento decida usar otra versión del comstackdor un día antes de tener una versión grande;) El número de versión que se utilizará para el comstackdor ecj es un problema. Es posible que pueda encontrar el número de versión de la lista de versiones y luego verifique en este repository de maven algo parecido. Pero este repository solo contiene las versiones anteriores. Cuando necesite una versión más reciente, aparentemente debería mirar aquí : aquí es donde Eclipse actualmente impulsa sus versiones . Este nuevo repository elimina los números de versión fácilmente reconocibles del anterior; usa números de versión como 3.1xx como se ve arriba. Eclipse generalmente tiene una versión principal una vez al año más uno o dos lanzamientos de solución intermedia. La segunda parte en el número 3.13.x corresponde a las versiones internas utilizadas dentro del proyecto de la plataforma Eclipse para versiones. Es difícil obtener una lista, pero al menos se conocen:

 Version Eclipse Release Compiler Version 3.13.0 Oxygen Release 4.7 3.13.50 Oxygen 1a 4.7.1a 3.13.100 Oxygen R2 4.7.2 

La versión siempre comienza con 3, la 13 es más o menos el “año” del lanzamiento. Entonces cuando 13 es Oxígeno (2017, 4.7) 14 será probablemente Fotón (2018, 4.8).

Versiones del plugin plexo-comstackdor-eclipse: anterior a 2.8.4

Las versiones anteriores a 2.8.4 de plexus-compiler-plugin usaban una API interna para iniciar el comstackdor de Eclipse. Esto hace que muchas cosas no funcionen tan bien, ya que esta API interna, por ejemplo, no interpreta los parámetros habituales de línea de comandos del comstackdor ecj. Esto hace que sea bastante difícil de usar y algunas cosas no son compatibles. La siguiente es una lista de restricciones:

  • El procesamiento de anotaciones no está implementado. Cualquier configuración se ignora silenciosamente.

  • Agregar parámetros específicos mediante el uso de la etiqueta es difícil, ya que existen múltiples problemas con la implementación:

  • El comstackdor mojo parece agregar guiones a todos los parámetros ingresados ​​aquí. La API interna utilizada por esta versión del complemento, sin embargo, necesita parámetros sin guiones. Entonces el complemento los elimina nuevamente. Como los parámetros aquí no son realmente parámetros de ecj de línea de comandos, es difícil saber cuáles usar: mira la clase Compiler.java y las clases CompilerOptions.java dentro del código fuente de Eclipse para más detalles.

  • El complemento acepta algunos parámetros, pero estos son interpretados por el plugin y luego “traducidos” a la API interna.

Este complemento acepta los siguientes parámetros en la etiqueta >:

  • nombre de archivo : define un archivo de propiedades que se pasará al parámetro -properties del comstackdor. Se pueden encontrar ejemplos del formato de este archivo mirando el archivo .settings / org.eclipse.jdt.core.prefs en un proyecto de Eclipse: este archivo almacena la configuración del comstackdor. Contiene configuraciones de advertencias, errores y mensajes informativos, además de la configuración de cumplimiento del comstackdor.

  • lo que sea . Cuando esto es válido, el complemento ignorará cualquier error generado por el comstackdor y lo informará como advertencias. Por supuesto, la comstackción aún falló, por lo que dependiendo del error, un archivo .class podría haber sido escrito / actualizado o no. Esto lo maneja el plugin en sí: simplemente cambia todos los errores a advertencias y le dice al mundo que la comstackción funcionó.

Desde 2.8.4

La versión 2.8.4 del plugin plexus-compiler-eclipse ha sido reescrita en su mayoría. Ahora usa la API pública del comstackdor ECJ que más o menos es el comstackdor ECJ. Esto, por ejemplo, significa que todo lo que ECJ puede hacer (como el procesamiento de anotaciones) ahora también puede hacerlo, y los parámetros ingresados ​​en la etiqueta ahora se pasan al comstackdor, lo que significa que usted debe poder usar la página de ayuda de ecj para descubrir parámetros para agregar.

Al igual que la versión anterior, esta versión también requiere que elimines el ‘-‘ de todos los nombres de los parámetros; el tablero se agrega automágicamente de nuevo antes de que el nombre del parámetro se agregue a la línea de comando ecj.

Esta versión admite el procesamiento de anotaciones según lo definido por Maven; agregando las partes necesarias al blob de comstackción, puede hacer que se ejecuten los procesadores de anotación. Por ejemplo:

  org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version}   db.annotationprocessing.EntityAnnotationProcessor    to.etc.domui property-annotations-processor 1.2-SNAPSHOT      to.etc.domui property-annotations-processor 1.2-SNAPSHOT    

Esta parte puede parecer incompleta porque no hay ninguna referencia al complemento plexus-comstackdor-eclipse en absoluto, pero recuerda que en Maven esa configuración hereda: el POM padre en este caso contenía la parte anterior, y esto simplemente agrega un poco de configuración para este proyecto de POM solamente.

Intereting Posts