2010-09-06 11 views
19

Sto provando ad aggiungere aspectj a un progetto di maven usando java 6.0. Navigando in giro ho trovato 2 plugin Maven, nessuno dei quali funziona come mi aspetterei. Il primo http://mojo.codehaus.org/aspectj-maven-plugin non ha funzionato inizialmente tramite netbeans perché non è stato possibile ottenere il codice per compilare l'origine 5.0 o successiva (si è lamentato delle annotazioni ecc.) Dopo aver provato dalla riga di comando che ha funzionato e confrontato i comandi eseguiti sembra che i suoi esperti installano un obiettivo che non è compatibile con il plug-in e il codice java 5+ mentre l'obiettivo di compilazione funziona correttamente. Sebbene possa essere possibile aggirare questo problema, è fastidioso e mi porta alla domanda: è ancora in fase di sviluppo l'aspettoj-maven-plugin? Dovrei ancora usarlo?Quale plug-in maven devo usare per AspectJ?

Il secondo è quello degli apaches che sembra più attivo e più probabile che funzioni. Tuttavia, non riesco a trovare esempi completi e non riesco a eseguirlo. Continuo a ricevere un'eccezione da 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. 

Il file jar è lì, intatto e anche non importa quale versione del plugin che uso, getta sempre la stessa eccezione. Qualche idea su quale potrebbe essere il problema?

In breve, quale plugin e come dovrei usarlo?

Grazie

risposta

17

Ecco una configurazione che funziona per me (utilizzando il sotto documentato aspectj-maven-plugin).

La struttura del progetto è la seguente:

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

Con il seguente aspetto demo poco:

public aspect DontWriteToTheConsole { 

    pointcut sysOutOrErrAccess() : get(* System.out) || get(* System.err); 

    declare error 
     : sysOutOrErrAccess() 
     : "Don't write to the console"; 

} 

E la pom.xml è configurato in questo modo:

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

Il le parti chiave sono:

  • per configurare il plug-compilatore maven per 1.6 del livello della sorgente (questo viene fatto utilizzando il properties)
  • per configurare l'aspectj-maven-plugin per 1,6 livello di sorgente (e ho riutilizzato il properties utilizzato per configurare il Maven-compiler-plugin qui)

Il il secondo passo sembra ridondante ma, beh, è ​​così che vanno le cose.

In questo modo, sono stato in grado di tessere di codice che usano le annotazioni, ecc:

 
$ 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

Inoltre stiamo usando l'AspectJ-maven-plugin per compilare i nostri aspetti con Maven –

+0

Sarebbe molto meglio utilizzare '@ annotazioni Aspect' .. – yegor256

+0

@Pascal configurazione del aspectj-maven-plugin per 1,6 fonte fissato il mio setup troppo. Grazie :) – stratwine

3

È possibile utilizzare il plugin Maven compilatore e cambiare il compilatore di utilizzare AspectJ.

La configurazione si presenta così:

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

Risorse:

Sullo stesso argomento:

+0

Ho provato ma i miei aspetti non vengono aggiunti alle classi. Qual è la cartella di aspetto predefinita? Posso specificarlo? Attualmente utilizzo src/main/aspect. I file .aj vengono prelevati? – Kristofer

+0

Se volete roba OGET copiato la cartella di origine principale sul costruire, mettere in src/main/risorse – bwawok

+0

Ancora non sono intrecciati in, ho provato entrambe src/main/java e src/main/risorse – Kristofer

2

stiamo usando l'aspectj-maven-plugin per la costruzione di diversi grandi sistemi J2EE grado di produzione. Ultimamente, lo sviluppo su quel plugin non sembra essere eccessivamente attivo. L'ultimo relase è stato lo scorso inverno, e ci sono alcuni seri problemi con "AspectLib" e "WeaveDependencies", che sono stati segnalati più volte (anche con correzioni di bug allegate), senza alcuna risposta da parte dell'upstream.

Ma in ogni caso, la funzionalità di base funziona e questo plugin supporta molte configurazioni necessarie in progetti del mondo reale.

Pascal Thivent ha mostrato nella sua (molto buona) risposta sopra come configurare il plugin con una sezione di dipendenza speciale. È possibile utilizzare questo trucco anche per configurare la versione attuale AspectJ utilizzato per la compilazione, come la versione utilizzata di default da questo plugin è un po 'datato ....

<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 il fatto che il plugin ha un ambiente classpath che è indipendente dal classpath del progetto. Quindi dobbiamo aggiungere esplicitamente AspectJ-Runtime alle dipendenze del progetto.

+0

Sarebbe sicuramente interessante con un esempio di questo! – Kristofer

Problemi correlati