2010-09-06 23 views
19

Estoy tratando de agregar aspectj a un proyecto maven usando java 6.0. Buscando alrededor encontré 2 plugins maven, ninguno de los cuales funciona de la manera que esperaría.¿Qué plugin maven uso para AspectJ?

El primero http://mojo.codehaus.org/aspectj-maven-plugin no funcionaba en primer lugar a través de NetBeans porque no podía obtener el código para compilar 5.0 o fuente posterior (que se quejaron de anotaciones etc.) Después de probar desde la línea de comandos, que funcionaba y la comparación de los comandos ejecutados parece que sus expertos instalan 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 siguiente pregunta: ¿el aspectj-maven-plugin aún se está desarrollando? ¿Debo seguir usándolo?

El segundo es el de Apaches, que parece más activo y más propenso a funcionar. Sin embargo, no puedo encontrar ejemplos completos y no puedo ejecutarlo. Me aparece un experto excepción de:

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í, intacta y también no importa qué versión del plugin que uso, es siempre la misma lanza una excepción. ¿Alguna idea sobre lo que podría ser el problema?

En resumen, ¿qué complemento y cómo debo usarlo?

Gracias

Respuesta

17

Aquí es una instalación que funciona para mí (con el bajo documentado aspectj-maven-plugin).

La estructura del proyecto es el siguiente:

 
$ tree . 
. 
├── pom.xml 
└── src 
    ├── main 
    │   └── java 
    │    └── com 
    │     └── stackoverflow 
    │      └── Q3651690 
    │       ├── App.java 
    │       └── DontWriteToTheConsole.aj 
    └── test 
     └── java 
      └── com 
       └── stackoverflow 
        └── Q3651690 
         └── AppTest.java 

Con el siguiente aspecto poco demo:

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 de esta manera:

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

El las piezas clave son:

  • para configurar el compilador maven-compiler para 1.6 nivel de fuente (esto se hace mediante el properties)
  • para configurar el aspectj-maven-plugin para el 1.6 nivel de fuente (y reutilizado el properties utilizado para configurar el experto compilador-plugin aquí)

El El segundo paso parece redundante pero, bueno, así son las cosas.

De esta manera, yo era capaz de tejer de código utilizando 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 
... 
+1

También estamos usando el aspectj-maven-plugin para compilar nuestros aspectos con Maven –

+0

Sería mucho mejor utilizar las anotaciones '@ Aspect' .. – yegor256

+0

@Pascal configurando el aspectj-maven-plugin para fuente 1.6 también arregló mi configuración. Gracias :) – stratwine

3

Usted puede utilizar el plugin de Maven Compilador y cambiar el compilador que utilice AspectJ.

La configuración es similar a esto:

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

Sobre el mismo tema:

+0

Lo intenté pero mis aspectos no se agregaron a las clases. ¿Cuál es la carpeta de aspecto predeterminada? ¿Puedo especificarlo? Actualmente uso src/main/aspect. ¿Los archivos .aj son recogidos? – Kristofer

+0

Si quiere que las cosas se copien oget en la carpeta de origen en compilación, ponga en src/main/resources – bwawok

+0

Aún no están entrelazadas, probé tanto src/main/java como src/main/resources – Kristofer

2

estamos usando la aspectj-maven-plugin para la construcción de varios sistemas J2EE grandes grado de producción. Últimamente, el desarrollo de ese complemento no parece ser demasiado activo. La última actualización ha sido el último invierno, y hay algunos problemas serios con "AspectLib" y "WeaveDependencies", que se informaron varias veces (incluso con correcciones de errores adjuntas), sin ninguna respuesta desde el inicio.

Pero, de todos modos, la funcionalidad básica está funcionando, y este complemento admite mucha configuración necesaria en proyectos del mundo real.

Pascal Thivent mostró en su (muy buena) respuesta anterior cómo configurar el complemento con una sección de dependencia especial. Puede utilizar este truco también para configurar la versión actual AspectJ utilizado para la compilación, como la versión utilizada por defecto por este plugin es un poco anticuado ....

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

Nota el hecho de que el plugin tiene un entorno classpath que es independiente del classpath de su proyecto. Por lo tanto, debemos agregar AspectJ-Runtime explícitamente a las dependencias del proyecto.

+0

Definitivamente sería interesante con un ejemplo de eso! – Kristofer