Maven + AspectJ - 配置它的所有步骤 [英] Maven + AspectJ - all steps to configure it
问题描述
我在将方面应用于我的 Maven 项目时遇到问题.可能我遗漏了一些东西,所以我列出了一个步骤.你能检查一下它是否正确吗?
假设在 projectA
中是一个方面类,而在 projectB
类中,它们应该被方面改变.
- 使用
AspectJ
类 创建maven项目 - 添加
Aspectj
插件和依赖 - 将
ProjectA
作为依赖添加到projectB
pom.xml
- 添加到
projectB
pom.xml
插件
ProjectA
<groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.4</version><执行><执行><目标><目标>编译</目标><目标>测试编译</目标></目标></执行></执行><配置><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><方面库><方面库><groupId>ProjectA</groupId><artifactId>ProjectA</artifactId></aspectLibrary></aspectLibraries></配置></插件>
- 添加aspectj依赖
在所有这些步骤之后,我的问题是,在编译期间我得到:
[WARNING] AspectE 中定义的建议尚未应用 [Xlint:adviceDidNotMatch]
然后当我运行我的程序时:
线程FeatureExcutionThread"中的异常 java.lang.NoClassDefFoundError: AspectE
我追查了你的一些旧问题,试图找出你真正想要做什么.我想出了以下结构和代码,对我来说效果很好.
<前>$树..├── pom.xml├── 项目A|├── pom.xml|└── src|└── 主要|└── 方面|└── com|└── stackoverflow|└── 方面|├── AspectL.java|└── Trace.aj└── B项目├── pom.xml└── src└── 主要└── 爪哇└── com└── stackoverflow└── App.javapom.xml
<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><属性><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.6</maven.compiler.source><maven.compiler.target>1.6</maven.compiler.target></属性><模块><module>ProjectA</module><module>ProjectB</module></模块><依赖管理><依赖项><依赖><groupId>org.stackoverflow</groupId><artifactId>Q12423965-ProjectA</artifactId><version>${project.version}</version></依赖></依赖项></dependencyManagement><构建><插件管理><插件><插件><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.4</version><执行><执行><目标><目标>编译</目标><目标>测试编译</目标></目标></执行></执行><配置><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></配置></插件><插件><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><配置><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target></配置></插件></插件></pluginManagement></build></项目>
ProjectA/pom.xml
<modelVersion>4.0.0</modelVersion><父母><groupId>org.stackoverflow</groupId><artifactId>Q12423965</artifactId><version>1.0-SNAPSHOT</version></父母><artifactId>Q12423965-ProjectA</artifactId><name>${project.artifactId}-${project.version}</name><依赖项><依赖><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.11</version></依赖></依赖项><构建><插件><插件><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId></插件></插件></build></项目>
我创造了两个不同的方面.一个使用@AspectJ 注释,另一个定义为经典的 AspectJ 方面.
AspectL.java
package com.stackoverflow.aspects;导入 org.aspectj.lang.JoinPoint;导入 org.aspectj.lang.annotation.After;导入 org.aspectj.lang.annotation.Aspect;导入 org.aspectj.lang.annotation.Before;导入 org.aspectj.lang.annotation.Pointcut;/*** @author maba, 2012-09-18*/@方面公共类 AspectL {@Pointcut("执行(* main(..))")公共无效defineEntryPoint(){}@Before("defineEntryPoint()")公共无效aaa(JoinPoint joinPoint){System.out.println("之前的方面");}@After("defineEntryPoint()")public void bbb(JoinPoint joinPoint) {System.out.println("之后的方面");}}
Trace.aj
package com.stackoverflow.aspects;公共方面跟踪{切入点 publicMethodExecuted(): execution(public !static * *(..));after(): publicMethodExecuted() {System.out.printf("进入方法:%s.
", thisJoinPoint.getSignature());Object[] arguments = thisJoinPoint.getArgs();for (int i =0; i < arguments.length; i++){对象参数 = 参数[i];如果(参数!= null){System.out.printf("参数类型为 %s,值为 %s.
", argument.getClass().toString(), argument);}}System.out.printf("退出方法:%s.
", thisJoinPoint.getSignature());}}
这两个文件是 ProjectA 模块的一部分,也是 jar 的一部分.
现在我们要使用这些方面并将它们编织到ProjectB的代码中.
ProjectB/pom.xml
<modelVersion>4.0.0</modelVersion><父母><groupId>org.stackoverflow</groupId><artifactId>Q12423965</artifactId><version>1.0-SNAPSHOT</version></父母><artifactId>Q12423965-ProjectB</artifactId><name>${project.artifactId}-${project.version}</name><依赖项><依赖><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.6.11</version></依赖><依赖><groupId>org.stackoverflow</groupId><artifactId>Q12423965-ProjectA</artifactId></依赖></依赖项><构建><插件><插件><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><配置><方面库><方面库><groupId>org.stackoverflow</groupId><artifactId>Q12423965-ProjectA</artifactId></aspectLibrary></aspectLibraries></配置></插件><插件><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.2.1</version><执行><执行><目标><目标>java</目标></目标></执行></执行><配置><mainClass>com.stackoverflow.App</mainClass></配置></插件></插件></build></项目>
App.java
package com.stackoverflow;/*** @author maba, 2012-09-17*/公共类应用{公共无效你好(字符串名称){}公共静态无效主(字符串 [] args){App app = new App();app.hello("世界");}}
我从顶级 pom 构建一切:
mvn 全新安装
然后进入 ProjectB 目录并运行应用程序:
mvn exec:java
结果是:
方面之前进入方法:void com.stackoverflow.App.hello(String).带有类型类 java.lang.String 和值世界的参数.退出方法:void com.stackoverflow.App.hello(String).之后的方面
因此可以得出结论,这两个方面都有效,并且 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?
Let say in projectA
is an aspect class and in projectB
classes, which should be changed by aspects.
- Create maven project
ProjectA
withAspectJ
class - add
Aspectj
plugin and dependency - Add
ProjectA
as a dependency toprojectB
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>
- Add aspectj dependency
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>
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.
", 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.
", argument.getClass().toString(), argument);
}
}
System.out.printf("Exits method: %s.
", 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.
这篇关于Maven + AspectJ - 配置它的所有步骤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!