java - plugin - mojo maven
¿Qué plugin de maven uso para AspectJ? (3)
Aquí hay una configuración que me funciona (utilizando el http://mojo.codehaus.org/aspectj-maven-plugin documentj http://mojo.codehaus.org/aspectj-maven-plugin ).
La estructura del proyecto es la siguiente:
$ tree . . ├── pom.xml └── src ├── main │ └── java │ └── com │ └── stackoverflow │ └── Q3651690 │ ├── App.java │ └── DontWriteToTheConsole.aj └── test └── java └── com └── stackoverflow └── Q3651690 └── AppTest.java
Con el siguiente pequeño aspecto de demostración:
public aspect DontWriteToTheConsole {
pointcut sysOutOrErrAccess() : get(* System.out) || get(* System.err);
declare error
: sysOutOrErrAccess()
: "Don''t write to the console";
}
Y el pom.xml está configurado así:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow.Q3651690</groupId>
<artifactId>Q3651690</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Q3651690</name>
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<goals>
<goal>compile</goal><!-- to weave all your main classes -->
<goal>test-compile</goal><!-- to weave all your test classes -->
</goals>
</execution>
</executions>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Las partes clave son:
- para configurar el compilador-plugin de maven para el nivel de fuente 1.6 (esto se hace usando las
properties
) - para configurar el plugin aspectj-maven para el nivel de fuente 1.6 (y reutilizé las
properties
utilizadas para configurar el plugin maven-compiler aquí)
El segundo paso parece redundante pero, bueno, así son las cosas.
De esta manera, pude tejer código usando anotaciones, etc.
$ mvn clean install [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building Q3651690 [INFO] task-segment: [clean, install] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean {execution: default-clean}] [INFO] [resources:resources {execution: default-resources}] [INFO] Using ''UTF-8'' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/Q3651690/src/main/resources [INFO] [compiler:compile {execution: default-compile}] [INFO] Compiling 1 source file to /home/pascal/Projects/stackoverflow/Q3651690/target/classes [INFO] [aspectj:compile {execution: default}] [ERROR] Don''t write to the console [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Compiler errors: error at System.out.println( "Hello World!" ); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/App.java:11:0::0 Don''t write to the console see also: /home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/DontWriteToTheConsole.aj:8::0 ...
Estoy tratando de agregar aspectj a un proyecto de maven usando Java 6.0. Al buscar alrededor encontré 2 complementos de Maven, ninguno de los cuales funciona como yo esperaba.
El primero http://mojo.codehaus.org/aspectj-maven-plugin no funcionó al principio a través de netbeans porque no pude obtener el código para compilar la fuente 5.0 o posterior (se quejó de las anotaciones, etc.) Después de intentar desde el comando La línea que funcionó y comparando los comandos ejecutados parece que su mavens instala un objetivo que no es compatible con el plugin y el código Java 5+, mientras que el objetivo de compilación funciona bien. Aunque puede ser posible evitar esto, es molesto y me lleva a la pregunta: ¿aún se está desarrollando el plugin aspect-maven? ¿Debo seguir usándolo?
El segundo es el de los apaches, que parece más activo y más propenso a funcionar. Sin embargo, no puedo encontrar ningún ejemplo completo y no puedo ejecutarlo. Sigo recibiendo una excepción de Maven:
java.lang.IllegalStateException: The plugin descriptor for the plugin Plugin [maven:maven-aspectj-plugin] was not found. Please verify that the plugin JAR /home/kristofer/.m2/repository/maven/maven-aspectj-plugin/4.0/maven-aspectj-plugin-4.0.jar is intact.
El archivo jar está ahí, intacto y tampoco importa la versión del complemento que use, siempre lanza la misma excepción. ¿Alguna idea sobre lo que podría ser el problema?
En resumen, ¿qué plugin y cómo debo usarlo?
Gracias
Puede usar el complemento del compilador de Maven y cambiar el compilador para usar AspectJ.
La configuración se ve así:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<compilerId>aspectj</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-aspectj</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</plugin>
Recursos:
- Complemento del compilador de Maven - Uso de compiladores no Javac
- Compilando con el compilador ajc de AspectJ de Maven
Sobre el mismo tema:
estamos utilizando el plugin aspectj-maven para construir varios sistemas J2EE de gran calidad de producción. Últimamente, el desarrollo de ese complemento no parece ser demasiado activo. La última recaída ha sido el invierno pasado, y hay algunos problemas graves con "AspectLib" y "WeaveDependencies", que se reportaron varias veces (incluso con correcciones de errores adjuntas), sin ninguna respuesta desde el principio.
Pero de todos modos, la funcionalidad básica está funcionando, y este complemento admite muchas configuraciones necesarias en proyectos del mundo real.
Pascal Thivent mostró en su (muy buena) respuesta sobre cómo configurar el complemento con una sección de dependencia especial. También puede utilizar este truco para configurar la versión real de AspectJ utilizada para la compilación , ya que la versión utilizada de forma predeterminada por este complemento es un tanto anticuada ...
<project xmlns=....
<properties>
<aspectjVer>1.6.9</aspectjVer>
....
....
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
....
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.3</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectjVer}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectjVer}</version>
</dependency>
</dependencies>
<configuration>
....
</build>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectjVer}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId><!-- only needed if you use Spring-AOP -->
<version>${aspectjVer}</version>
</dependency>
....
....
Tenga en cuenta el hecho de que el complemento tiene un entorno de classpath que es independiente de la classpath de su proyecto. Por lo tanto, debemos agregar el AspectJ-Runtime explícitamente a las dependencias del proyecto.