Maven + AspectJ - 配置它的所有步骤 [英] Maven + AspectJ - all steps to configure it

查看:93
本文介绍了Maven + AspectJ - 配置它的所有步骤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将问题应用于我的maven项目时遇到问题。可能我错过了一些东西,所以我已经列出了一系列步骤。你能检查一下是否正确吗?

I have a problem with applying aspects to my maven project. Probably I am missing something, so I've made a list of steps. Could you please check if it is correct?

让我们说 projectA 是一个方面类,在 projectB 类,应该由方面改变。

Let say in projectA is an aspect class and in projectB classes, which should be changed by aspects.


  • 使用 AspectJ ProjectA c $ c> class

  • 添加 Aspectj 插件和依赖

  • 添加 ProjectA 作为依赖 projectB pom.xml

  • 添加到 projectB pom.xml 插件

  • Create maven project ProjectA with AspectJ class
  • add Aspectj plugin and dependency
  • Add ProjectA as a dependency to projectB pom.xml
  • Add to projectB pom.xml plugin
<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>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>ProjectA</groupId>
                <artifactId>ProjectA</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
</plugin>




  • 添加aspectj依赖

  • 完成所有这些步骤之后我的问题是,在编译期间我得到:

    After all these steps my problem is, that during compilation I get:

    [WARNING] advice defined in AspectE has not been applied [Xlint:adviceDidNotMatch]
    

    然后当我跑步时我的程序:

    And then when I run my program:

    Exception in thread "FeatureExcutionThread" java.lang.NoClassDefFoundError: AspectE
    


    推荐答案

    我追踪了一些较旧的问题,试图找出你实际想要做的事情。我已经提出了以下结构和代码,对我而言,它运作良好。

    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>
    

    我创建了两个不同的方面。一个使用@AspectJ注释,另一个使用被定义为经典的AspectJ方面。

    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
     */
    @Aspect
    public 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());
        }
    }
    

    这两个文件是ProjectA模块的一部分,是jar的一部分。

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

    现在我们想要使用这些方面并将它们编织到ProjectB的代码中。

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

    我从顶级pom构建所有内容:

    I build everything from top pom:

    mvn clean install
    

    然后进入ProjectB目录并运行应用程序:

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

    mvn exec:java
    

    结果是:

    aspect before
    Enters 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
    

    所以总结两个方面都有效,maven设置也可以。

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

    这篇关于Maven + AspectJ - 配置它的所有步骤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆