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

时间:2015-05-15 09:06:56

标签: java maven aspectj

我的项目:

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?

UPD:

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

1 个答案:

答案 0 :(得分:1)

尝试配置插件the documentation描述:

  

为了将已编译的方面应用于您自己的来源   需要设置你想在插件中编织的所有JAR文件   配置如下图所示。

将是

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

代码发布后更新:

但是,你的不是预先编译的方面。因此,您不需要配置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(“我在方面内部”)测试它,看它是否有效。

像:

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