2

I've added a github repo that show exactly my problem:

https://github.com/runefist/AspectJ-Stackoverflow-Q


In short, I have a project we'll call it ProjectA. ProjectA is a microprofile-REST-server. Another project, we'll call this ProjectB, is a dependency for ProjectA (and other projects).

  • ProjectA (microprofile-REST-server)
  • ProjectB (dependency of ProjectA)

ProjectB contains an Aspect:

@Aspect
public class ElasticSenderAspect {

    @After("@annotation(elasticsender)") // && execution(* *(..))
    public void after(JoinPoint joinPoint, ElasticSender elasticsender) {
         WebsiteBehaviour websiteBehaviour = new WebsiteBehaviour();  
         websiteBehaviour.setBehaviourFunc(elasticsender.behaviourFunction());
         websiteBehaviour.setBehaviourType(elasticsender.behaviourType());
         ElasticWebsiteBehaviour.sendWebsiteBehaviour(websiteBehaviour);
    }
}

In ProjectA I have a function:

@GET
@Operation(description = "Authenticate")
@ElasticSender(behaviourFunction = "Authenticate")
public Response authenticate(@HeaderParam("authorization") String authString) {
    if (authString == null) {
        return StandardResponseMessages.GENERAL_NO_AUTHENTICATION.getResponse();
    }
    WebAccount webAccount = webAccountService.find(getUsernameFromAuth(authString));
    boolean correct = false;
    //TODO: CHECK IF ACCOUNT IS VERIFIED
    if (webAccount != null) {
        if (webAccount.getUsername() != null && webAccount.getPassword() != null) {
            if (AuthenticatorUtility.basicAuthenticate(webAccount.getUsername(), webAccount.getPassword(), authString)) {
                correct = true;
            }
        }
    }
    if (correct) {
        return Response.ok(generateTokenString(webAccount)).build();
    } else {
        return StandardResponseMessages.GENERAL_WRONG_AUTHENTICATION.getResponse();
    }
}

I've tested the Aspect, which works when I use it in the SAME project, so NOT as dependency.

ProjectA - pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.runefist</groupId>
    <artifactId>FeestjesDoen-Server</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

    <name>FeestjesDoen-Server</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <repositories>
        <repository>
            <id>BendingHeroes-repo</id>
            <url>xxx</url>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <!-- MAIN DEPENDENCY -->
        <dependency>
            <groupId>com.runefist</groupId>
            <artifactId>WebRest-Utilities</artifactId>
            <version>1.0.0</version>
        </dependency>
        <!-- MICROPROFILE SWAGGER UI -->
        <dependency>
            <groupId>org.microprofile-ext.openapi-ext</groupId>
            <artifactId>swagger-ui</artifactId>
            <version>1.0.1</version>
            <scope>runtime</scope>
        </dependency>
        <!-- KAFKA NEEDED -->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <showWeaveInfo>true</showWeaveInfo>
                    <encoding>UTF-8 </encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ProjectB - pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<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>com.runefist</groupId>
    <artifactId>WebRest-Utilities</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- MICROPROFILE REPLACES JAVAEE -->
        <dependency>
            <groupId>org.eclipse.microprofile</groupId>
            <artifactId>microprofile</artifactId>
            <version>2.1</version>
            <type>pom</type>
        </dependency>
        <!-- FOR CREATING JWT TOKENS -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
            <type>jar</type>
        </dependency>
        <!-- FOR THE USE OF HIBERNATE -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.3.1.Final</version>
        </dependency>
        <!-- MYSQL CONNECTOR FOR HIBERNATE -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.26</version>
            <scope>compile</scope>
        </dependency>
        <!-- FOR JSON CONVERSION -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- ElasticSearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.2</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.5.4</version>
            <type>jar</type>
        </dependency>
        <!-- AspectJ | to add behaviour to methods -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
        <!-- Junit - TEMP added to test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
            <type>jar</type>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.7</version>
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                    <target>1.8</target>
                    <verbose>true</verbose>
                    <Xlint>ignore</Xlint>
                    <encoding>UTF-8</encoding>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                             <!--use this goal to weave all your main classes--> 
                            <goal>compile</goal>
                             <!--use this goal to weave all your test classes--> 
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <!-- put your configurations here -->
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Problem:

Aspect happens when tested in ProjectB, aspect does NOT happen when tested in ProjectA. What do I need to add to ProjectA pom to make it work, or what do I need to change to ProjectB pom to make it work?

kriegaex
  • 63,017
  • 15
  • 111
  • 202
runefist
  • 543
  • 1
  • 8
  • 19
  • I can suggest to move your aspects into some generic jar maven module, and use it in both projects as a dependency. As well as together with [apectj runtime](https://mvnrepository.com/artifact/org.aspectj/aspectjrt) – Victor Gubin Feb 15 '19 at 11:38
  • Euhm, I don't understand, moving the aspect to another module and adding the module as dependency to other projects, what's the difference of how I have it now? I've added the pom of ProjectA, maybe that helps. – runefist Feb 15 '19 at 12:47
  • Ok I got it finally, Project B is actually an aspect library. It seems like you've forgotten to add `aspectj-maven-plugin` to the Project A pom file, so aspect compiler not working on the web service, as well as no aspect code injected by the AspectJ compiler, and all what you have is just an elasticsender annotation. – Victor Gubin Feb 15 '19 at 12:59
  • Just copy-paste plugin configuration code into Project A, or make move it in the root pom parent module, so that whole modules will have the same. – Victor Gubin Feb 15 '19 at 13:01
  • I've done that, still does not work, I've created a github repo, which shows exactly the scope I am talking about, you can find it here: https://github.com/runefist/AspectJ-Stackoverflow-Q. I hope this helps solving the problem, if you need any other information, please ask :) – runefist Feb 15 '19 at 13:23

2 Answers2

2

In project A you need to add B as an aspect library in the AspectJ Maven configuration in addition to adding it as a Maven dependency as you already did:

            <configuration>
                <!-- (...) -->
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>com.runefist</groupId>
                        <artifactId>ProjectB</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>

I cloned and tested your project, it works this way.

kriegaex
  • 63,017
  • 15
  • 111
  • 202
  • Thank you for sharing this solution. I can confirm that it works for my project as well. I was having the same problem and got it solved with this fix. :) – FNL Jan 14 '22 at 08:01
0

I've got same problem and adding spring-aop dependency to projectB helped me.

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.3.18</version>
</dependency>

And there is no need to add aspectj plugin in projectA, just

    <dependency>
        <groupId>com.runefist</groupId>
        <artifactId>ProjectB</artifactId>
        <version>1.0.0</version>
    </dependency>
littl3rud3
  • 67
  • 7