tutorial - Maven: compilar el proyecto aspectj que contiene la fuente Java 1.6
aspectj tutorial (4)
¿Cómo se especifica un compilerId personalizado que apunta a su propio compilador ajc (que es make compile: compile usa un compilador aspectj que no sea el del plexo)?
No sé cómo especificar otro compilerId
de compilerId
que los "official" . No estoy seguro de que sea posible.
Tengo entendido que http://jira.codehaus.org/browse/MCOMPILER-107 resolvería su problema (AspectJ 1.6+ es compatible con Java 1. 6, ¿no?). Lamentablemente, todavía está abierto.
¿Cómo ignoras el fallo de compilar: compilar?
El compiler:compile
objetivo de compilación del complemento del compilador de Maven tiene un parámetro opcional failOnError
que permite indicar si la compilación continuará incluso si hay errores de compilación .
<project>
...
<build>
...
<plugins>
...
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnError>false</failOnError>
...
</configuration>
</plugin>
</plugins>
</build>
</project>
Esto podría ser una solución fea para el problema anterior.
¿Cómo lograr que Maven ejecute el aspectj: compile el objetivo directamente, sin ejecutar nunca compile: compile?
El problema es que el compiler:compile
está vinculado a la fase de compile
y no se puede eliminar un enlace de ciclo de vida predeterminado . Entonces, tal vez haya otra opción, pero la única que se me ocurre sería apagar todo usando un <packaging>pom<packaging>
y volver a vincular todos los objetivos manualmente (al menos para estas fases: process-resources
, compile
, process-test-resources
, test-compile
, test
, package
). Esquemáticamente, algo como esto:
process-resources resources:resources compile aspectj:compile process-test-resources resources:testResources test-compile compiler:testCompile test surefire:test package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war install install:install deploy deploy:deploy
Eso podría ser otra solución fea. Descargo de responsabilidad: no probado, pero debería funcionar.
Pregunta primaria
Lo que quiero hacer es bastante fácil. O al menos eso pensarías. Sin embargo, nada está funcionando correctamente.
Requisito: utilizando maven, compile el proyecto Java 1.6 usando el compilador AspectJ.
Nota: Nuestro código no puede compilar con javac. Es decir, falla la compilación si los aspectos no están entretejidos (porque tenemos aspectos que suavizan las excepciones).
Actualización del 21 de febrero de 2011: existen dos soluciones igualmente viables para esto (en ambos casos se utiliza el plugin aspectj-maven en conjunción con el plugin de maven-compiler ):- Agregue
<failOnError>false</failOnError>
al complemento del compilador (gracias a Pascal Thivent ) - Agregue
<phase>process-sources</phase>
al plugin aspectj compiler (gracias Andrew Swan )
Más información sobre estas soluciones se encuentra en la sección de respuestas. Creo que la solución # 2 es el mejor enfoque.
preguntas relacionadas
Preguntas (basadas en intentos fallidos a continuación):
- ¿Cómo lograr que Maven ejecute el aspectj: compile el objetivo directamente, sin ejecutar nunca compile: compile?
- ¿Cómo ignoras el fallo de compilar: compilar?
- ¿Cómo se especifica un compilerId personalizado que apunta a su propio compilador ajc (que es make compile: compile usa un compilador aspectj que no sea el del plexo)? *
Intento 1 (error): especifique aspectJ como el compilador para el complemento-compilador-maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerId>aspectj</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-aspectj</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</plugin>
Esto falla con el error:
org.codehaus.plexus.compiler.CompilerException: The source version was not recognized: 1.6
No importa qué versión del compilador de plexus use (1.8, 1.6, 1.3, etc.), esto no funciona. De hecho, leí el código fuente y descubrí que a este compilador no le gusta el código fuente que está por encima de Java 1.5.
Intento 2 (falla): use el plugin aspect-Maven adjunto a los objetivos de compilación y prueba-compilación:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
Esto falla cuando se ejecuta:
mvn clean test-compile
mvn clean compile
porque intenta ejecutar compile: compile antes de ejecutar aspectj: compile. Como se indicó anteriormente, nuestro código no se compila con javac; se requieren los aspectos. Así que mvn tendría que saltarse la compilación: compilar el objetivo por completo y ejecutar solo aspectj: compilar.
Intento 3 (funciona pero es inaceptable):
Use la misma configuración de arriba, pero ejecute:
mvn clean aspectj:compile
Esto funciona, ya que se construye con éxito, pero es inaceptable ya que necesitamos poder ejecutar el objetivo de compilación y el objetivo de compilación de prueba directamente (la compilación automática de m2eclipse depende de esos objetivos). Además, ejecutarlo de esta manera requeriría que definamos todos los objetivos que queremos en el camino (por ejemplo, necesitamos recursos distribuidos y pruebas para ejecutar y probar recursos desplegados, etc.)
¿Qué le parece decirle a maven-compiler-plugin que omita todos los archivos * .java y deje que aspectj-maven-plugin haga el trabajo?
...
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>utf-8</encoding>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal> <!-- weave main classes -->
<goal>test-compile</goal> <!-- weave test classes -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
La versión 1.3 del complemento AspectJ cambió deliberadamente la fase predeterminada de su objetivo de compilación de "fuentes de proceso" a "compilar". Para restaurar el comportamiento anterior de ejecutar ajc antes de javac, solo necesita agregar una etiqueta de "fase" a la etiqueta de "ejecución" relevante, como esto:
<execution>
<phase>process-sources</phase> <!-- or any phase before compile -->
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
Usé esta configuración en un proyecto para compilar AspectJ y Java 6 usando Maven:
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ref: aspectj-maven-plugin