Maven + AspectJ - all steps to configure it Maven + AspectJ - all steps to configure it java java

Maven + AspectJ - all steps to configure it


I traced some of your older questions to try to find out what you actually are trying to do. I have come up with the following structure and code and for me it works well.

$ tree ..├── pom.xml├── ProjectA|   ├── pom.xml|   └── src|       └── main|           └── aspect|               └── com|                   └── stackoverflow|                       └── aspects|                           ├── AspectL.java|                           └── Trace.aj└── ProjectB    ├── pom.xml    └── src        └── main            └── java                └── com                    └── stackoverflow                        └── App.java

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.stackoverflow</groupId>    <artifactId>Q12423965</artifactId>    <packaging>pom</packaging>    <version>1.0-SNAPSHOT</version>    <name>${project.artifactId}-${project.version}</name>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <maven.compiler.source>1.6</maven.compiler.source>        <maven.compiler.target>1.6</maven.compiler.target>    </properties>    <modules>        <module>ProjectA</module>        <module>ProjectB</module>    </modules>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.stackoverflow</groupId>                <artifactId>Q12423965-ProjectA</artifactId>                <version>${project.version}</version>            </dependency>        </dependencies>    </dependencyManagement>    <build>        <pluginManagement>            <plugins>                <plugin>                    <groupId>org.codehaus.mojo</groupId>                    <artifactId>aspectj-maven-plugin</artifactId>                    <version>1.4</version>                    <executions>                        <execution>                            <goals>                                <goal>compile</goal>                                <goal>test-compile</goal>                            </goals>                        </execution>                    </executions>                    <configuration>                        <source>${maven.compiler.source}</source>                        <target>${maven.compiler.target}</target>                    </configuration>                </plugin>                <plugin>                    <groupId>org.apache.maven.plugins</groupId>                    <artifactId>maven-compiler-plugin</artifactId>                    <version>2.5.1</version>                    <configuration>                        <source>${maven.compiler.source}</source>                        <target>${maven.compiler.target}</target>                    </configuration>                </plugin>            </plugins>        </pluginManagement>    </build></project>

ProjectA/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.stackoverflow</groupId>        <artifactId>Q12423965</artifactId>        <version>1.0-SNAPSHOT</version>    </parent>    <artifactId>Q12423965-ProjectA</artifactId>    <name>${project.artifactId}-${project.version}</name>    <dependencies>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjrt</artifactId>            <version>1.6.11</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.codehaus.mojo</groupId>                <artifactId>aspectj-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

I have created two differenct aspects. One that uses @AspectJ annotations and another one that is defined as a classic AspectJ aspect.

AspectL.java

package com.stackoverflow.aspects;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;/** * @author maba, 2012-09-18 */@Aspectpublic class AspectL {    @Pointcut("execution(* main(..))")    public void defineEntryPoint() {    }    @Before("defineEntryPoint()")    public void aaa(JoinPoint joinPoint) {        System.out.println("aspect before");    }    @After("defineEntryPoint()")    public void bbb(JoinPoint joinPoint) {        System.out.println("aspect after");    }}

Trace.aj

package com.stackoverflow.aspects;public aspect Trace {    pointcut publicMethodExecuted(): execution(public !static * *(..));    after(): publicMethodExecuted() {        System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());        Object[] arguments = thisJoinPoint.getArgs();        for (int i =0; i < arguments.length; i++){            Object argument = arguments[i];            if (argument != null){                System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);            }        }        System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());    }}

Those two files are part of the ProjectA module and are part of a jar.

Now we want to use these aspects and weave them into the code of ProjectB.

ProjectB/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.stackoverflow</groupId>        <artifactId>Q12423965</artifactId>        <version>1.0-SNAPSHOT</version>    </parent>    <artifactId>Q12423965-ProjectB</artifactId>    <name>${project.artifactId}-${project.version}</name>    <dependencies>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjrt</artifactId>            <version>1.6.11</version>        </dependency>        <dependency>            <groupId>org.stackoverflow</groupId>            <artifactId>Q12423965-ProjectA</artifactId>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.codehaus.mojo</groupId>                <artifactId>aspectj-maven-plugin</artifactId>                <configuration>                    <aspectLibraries>                        <aspectLibrary>                            <groupId>org.stackoverflow</groupId>                            <artifactId>Q12423965-ProjectA</artifactId>                        </aspectLibrary>                    </aspectLibraries>                </configuration>            </plugin>            <plugin>                <groupId>org.codehaus.mojo</groupId>                <artifactId>exec-maven-plugin</artifactId>                <version>1.2.1</version>                <executions>                    <execution>                        <goals>                            <goal>java</goal>                        </goals>                    </execution>                </executions>                <configuration>                    <mainClass>com.stackoverflow.App</mainClass>                </configuration>            </plugin>        </plugins>    </build></project>

App.java

package com.stackoverflow;/** * @author maba, 2012-09-17 */public class App {    public void hello(String name) {    }    public static void main(String[] args) {        App app = new App();        app.hello("world");    }}

I build everything from top pom:

mvn clean install

And then go into the ProjectB directory and run the app:

mvn exec:java

The result is:

aspect beforeEnters on method: void com.stackoverflow.App.hello(String). With argument of type class java.lang.String and value world. Exits method: void com.stackoverflow.App.hello(String). aspect after

So to conclude both aspects are working and the maven setup also works.


This worked for me, a had to add the lookup for external dependencies (see weaveDependencies) in order to perform weaving to them, you should include this in ProjectA pom file:

<dependencies>  <dependency>    <groupId>com.ProjectB</groupId>    <artifactId>ProjectB</artifactId>  </dependency>  <dependency>    <groupId>org.aspectj</groupId>    <artifactId>aspectjrt</artifactId>    <version>1.6.5</version>  </dependency></dependencies><build>  <plugins>    <plugin>      <groupId>org.codehaus.mojo</groupId>      <artifactId>aspectj-maven-plugin</artifactId>      <version>1.2</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>        <weaveDependencies>          <weaveDependency>            <groupId>com.ProjectB</groupId>            <artifactId>ProjectB</artifactId>          </weaveDependency>        </weaveDependencies>        <showWeaveInfo>true</showWeaveInfo>        <source>${maven.compiler.source}</source>        <target>${maven.compiler.target}</target>      </configuration>    </plugin>  </plugins></build>

Hope it helps...


I had had the same problem as you. The only solution i found was to create a wrapper for each aspect class inside the aspectJ project to let external projects get access to it