Search code examples
javaeclipsemavenaspectjaspectj-maven-plugin

Advice AspectJ a method call from different Maven project


I am trying to create an advice of a method of a project (test5) being called from another project (testMaven). I already included the project test5 as dependency in testMaven's pom.xml and set up an advice in testMaven's class but still it doesn't get executed. The calling of the method (dfg) is working just fine.

Here are the code for it:

MainApp.java (testMaven)

package testMaven;

import test5.yxc;

public class MainApp {

    public static void main(String[] args) {
        yxc b = new yxc();
        b.dfg(2);
    }
}

yxc.java (test5)

package test5;

public class yxc {

    public void dfg(int a){
        System.out.println(a);

    }
}

testAspect.java (testMaven)

package testMaven;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import test5.yxc;

@Aspect
public class testAspect {

    @Before("execution(* test5.yxc.dfg(..))")
    public void testBefore(){
        System.out.println("yooi");
    }
}

pom.xml(testMaven)

<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>testingMaven</groupId>
    <artifactId>testMaven</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <spring.version>4.2.5.RELEASE</spring.version>
        <java.version>1.8</java.version>
        <!-- Maven Plugin Versions -->
        <maven.compiler.plugin.version>3.2</maven.compiler.plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>test5</groupId>
            <artifactId>test5</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

    <build>

        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.8</version>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>

Could you help me what's wrong with this? Thanks


Solution

  • Checked your code in testMaven and checked out the code and changed the POM as follows:

    <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>testMaven</groupId>
    <artifactId>testMaven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <properties>
    
        <java.version>1.8</java.version>
        <aspectj.version>1.8.9</aspectj.version>
        <!-- Maven Plugin Versions -->
        <maven.compiler.plugin.version>3.2</maven.compiler.plugin.version>
    
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
    </dependencies>
    
    <build>
    
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
    
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.8</version>
                <configuration>
                    <complianceLevel>${java.version}</complianceLevel>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <showWeaveInfo>true</showWeaveInfo>
                </configuration>
                <executions>
                    <execution>
                        <id>AspectJ-Classes</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>AspectJ-Test-Classes</id>
                        <phase>process-test-classes</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjrt</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
    
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    
        </plugins>
    
    </build>
    

    NOTE: Added assembly plugin to make testing/verifying for myself easier.

    When I compile the project I see within the maven logs the following entry:

    [INFO] --- aspectj-maven-plugin:1.8:compile (AspectJ-Classes) @ testMaven ---
    [INFO] Showing AJC message detail for messages of types: [error, warning, fail]
    [INFO] Join point 'method-execution(void testMaven.aaaa.aa(int))' in Type 'testMaven.aaaa' (aaaa.java:5) advised by before advice from 'testMaven.aspecter' (aspecter.java:10)
    

    When I now execute the jar as follows I see the following result:

    ...>java -cp target/testMaven-0.0.1-SNAPSHOT-jar-with-dependencies.jar testMaven/MainApp
    yooi
    2
    

    Given the MainApp is as follows:

    package testMaven;
    
    public class MainApp {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            aaaa a = new aaaa();
            a.aa(2);
        }
    
    }
    

    The class that is initiated prints the passed argument

    package testMaven;
    
    public class aaaa {
    
        public void aa(int a){
            System.out.println(a);
        }
    }
    

    And the interceptor as follows

    package testMaven;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.annotation.Before;
    
    
    @Aspect
    public class aspecter {
        @Before("execution(*  testMaven.aaaa.aa(..))")
        public void testBefore(){
            System.out.println("yooi");
        }
    }
    

    I would say it works :)