如何告诉maven将项目编译为aspectj项目

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

我的项目:

src/main/aspects:

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

src/main/java:

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

我写了下面的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>

但 jar 仍在编译为 java 项目,当我 运行 它与 java -jar <jar-name> 时,我没有得到理想的 aspectJ 结果。

如何告诉 maven 根据方面编译 jar?

更新:

App.java:

包 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());
    }
}

尝试按照 the documentation 描述的方式配置插件:

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.

这将是

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

在代码 post 之后更新:

但是,您的方面不是预编译方面。所以不需要aspectLibraries的配置,只需要目标:

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

此外,您应该添加 maven-plugin 的版本:

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

如果你注释掉 printf 行(它们写得不正确,它们超出了这个问题的范围),这将编译你的方面。 您可以在方面内使用 System.out.println("I am inside the aspect") 对其进行测试以查看其是否有效。

喜欢:

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());
    }
}