简体   繁体   中英

How to tell maven to compile a project as an aspectj project

My project:

src/main/aspects :

com
 |---badmitrii
        |---Trace.aj

src/main/java :

com
 |---badmitrii
        |---App.java

I wrote the following pom:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.badmitrii</groupId>
    <artifactId>aspectj-test</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>aspectj-test</name>
    <url>http://maven.apache.org</url>
    <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>
                <configuration>
                    <aspectLibraries>
                        <aspectLibrary>
                            <groupId>com.badmitrii</groupId>
                            <artifactId>aspectj-test</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.badmitrii.App</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.badmitrii.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

But the jar is still being compiled as a java-project and when I run it with java -jar <jar-name> I didn't get the desirable aspectJ result.

How to tell maven to compile the jar with respect to aspects?

UPD:

App.java:

package com.badmitrii;

public class App 
{
    public static void main( String[] args )
    {
        App  a = new App ();
        a.m();
    }

    public void m(){
        System.out.println("test");
    }
}

Trace.aj:

package com.badmitrii.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());
    }
}

Try configuring the plugin as the documentation describes:

In order to apply already compiled aspects to your own sources you need do setup all the JAR files you would like to weave in the plugin configuration as shown below.

which would be

       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <configuration>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>com.badmitrii</groupId>
                        <artifactId>aspectj-test</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
           <executions>
             <execution>
               <goals>
                 <goal>compile</goal>
               </goals>
             </execution>
           </executions>
        </plugin>

Updated after code post:

However, yours is not a pre-compiled aspect. So you don't need the configuration of aspectLibraries, you only need the goal:

       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
           <executions>
             <execution>
               <goals>
                 <goal>compile</goal>
               </goals>
             </execution>
           </executions>
        </plugin>

Also, you should add the version of the maven-plugin:

<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>

This will compile your aspect if you comment out the printf lines (they are not written correctly, and they are beyond the scope of this question). You may test it with a System.out.println("I am inside the aspect") inside the aspect to see it works.

Like:

package com.badmitrii.aspects;

public aspect Trace {
    pointcut publicMethodExecuted(): execution(public !static * *(..));

    after(): publicMethodExecuted() {
//        System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());
        System.out.println("inside the aspect - after");
        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());
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM