Reputation: 27375
My project:
src/main/aspects
:
com
|---badmitrii
|---Trace.aj
src/main/java
:
com
|---badmitrii
|---App.java
I wrote the following 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>
But the jar is still being compiled as a java-project and when I run it with java -jar <jar-name>
I didn't get the desirable aspectJ
result.
How to tell maven to compile the jar with respect to aspects?
UPD:
App.java:
package 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());
}
}
Upvotes: 0
Views: 1501
Reputation: 6686
Try configuring the plugin as the documentation describes:
In order to apply already compiled aspects to your own sources you need do setup all the JAR files you would like to weave in the plugin configuration as shown below.
which would be
<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>
Updated after code post:
However, yours is not a pre-compiled aspect. So you don't need the configuration of aspectLibraries, you only need the goal:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
Also, you should add the version of the maven-plugin:
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
This will compile your aspect if you comment out the printf lines (they are not written correctly, and they are beyond the scope of this question). You may test it with a System.out.println("I am inside the aspect") inside the aspect to see it works.
Like:
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());
}
}
Upvotes: 1