Which maven plugin do I use for AspectJ?

Kristofer picture Kristofer · Sep 6, 2010 · Viewed 14.2k times · Source

I am trying to add aspectj to a maven project using java 6.0. Browsing around I found 2 maven plugins, none of which works the way I would expect.

The first one http://mojo.codehaus.org/aspectj-maven-plugin did not work at first through netbeans because I could not get the code to compile 5.0 or later source (it complained about annotations etc.) After trying from command line which worked and comparing the commands executed it seems that its mavens install goal that is not compatible with the plugin and java 5+ code while the compile goal works fine. Although it may be possible to work around this it is annoying and brings me to the question: is the aspectj-maven-plugin still being developed? Should I still use it?

The second one is apaches's own which seems more active and more likely to work. I can however not find any complete examples and I am unable to run it. I keep getting an exception from 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.

The jar file is there, intact and it also doesn't matter which version of the plugin I use, it always throws the same exception. Any ideas on what the problem might be?

In short, which plugin and how should I use it?

Thanks

Answer

Pascal Thivent picture Pascal Thivent · Sep 7, 2010

Here is a setup that works for me (using the under documented aspectj-maven-plugin).

The project structure is as follow:

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

With the following little demo aspect:

public aspect DontWriteToTheConsole {

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

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

}

And the pom.xml is configured like this:

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

The key parts are:

  • to configure the maven-compiler-plugin for 1.6 source level (this is done using the properties)
  • to configure the aspectj-maven-plugin for 1.6 source level (and I reused the properties used to configure the maven-compiler-plugin here)

The second step seems redundant but, well, that's how things are.

This way, I was able to weave code using annotations, 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
...