Maven + AspectJ - all steps to configure it

前端 未结 5 409
迷失自我
迷失自我 2020-12-07 16:52

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?

<
相关标签:
5条回答
  • 2020-12-07 17:14

    I remember having this problem too, but solved it by switching to Java annotation-based aspects. You could give that a try.

    0 讨论(0)
  • 2020-12-07 17:14

    Take a look at a real-life example:

    • This is a module where we define aspects and compile them: pom.xml.
    • This is how we use them, in another project: pom.xml (pay attention to highlighted lines).

    The problem in your case is that you don't include ProjectA as a runtime dependency of ProjectB.

    0 讨论(0)
  • 2020-12-07 17:22

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

    0 讨论(0)
  • 2020-12-07 17:25

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

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

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

    0 讨论(0)
  • 2020-12-07 17:33

    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

    0 讨论(0)
提交回复
热议问题