Maven项目中使用AspectJ注解:织入功能无法正常工作
解决非Spring项目中AspectJ织入失效的问题
嘿,我刚碰到和你一模一样的情况——在纯Java项目里用AspectJ,代码看着没问题就是织入不生效,折腾了好一阵才找到几个关键排查点,结合你的环境(Eclipse Oxygen 4.7.3、JDK7、Maven3.5.2,没装AJDT),给你列几个最可能的原因和解决办法:
先确认Maven插件的核心配置
你的pom.xml里必须正确配置aspectj-maven-plugin,这是Maven环境下实现编译期织入的关键。我猜你可能没把插件配置全,给你个标准的参考配置:
<dependencies> <!-- 引入AspectJ运行时依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.13</version> <!-- 这个版本完美兼容JDK7 --> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.11</version> <configuration> <complianceLevel>1.7</complianceLevel> <!-- 匹配你的JDK7 --> <source>1.7</source> <target>1.7</target> <showWeaveInfo>true</showWeaveInfo> <!-- 开启织入日志,方便排查 --> <verbose>true</verbose> <Xlint>ignore</Xlint> <aspectLibraries> <!-- 如果你的切面在自定义依赖里,这里要配置,否则不需要 --> </aspectLibraries> </configuration> <executions> <execution> <goals> <goal>compile</goal> <!-- 编译主代码时织入 --> <goal>test-compile</goal> <!-- 测试代码织入 --> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.8.13</version> <!-- 和aspectjrt版本保持一致 --> </dependency> </dependencies> </plugin> </plugins> </build>
几个容易踩的坑
- 切面类的注解和切点别写错:切面类一定要加
@Aspect注解,切点表达式的路径要精准,比如你要切com.example.service下的所有方法,得写execution(* com.example.service..*(..)),别漏了星号和括号。另外,切面类本身要被Maven编译到,别放在src/main/resources这种目录里。 - 别依赖Eclipse自动编译:因为你没装AJDT,Eclipse自带的编译器不支持AspectJ织入,必须手动触发Maven构建——右键项目→
Run As→Maven clean,再Run As→Maven install,看控制台输出里有没有织入相关的日志(比如Weaving into com.example.xxx.YourClass),如果有就说明织入成功了。 - 版本兼容性要匹配:AspectJ 1.9+开始只支持JDK8及以上,你用JDK7必须用AspectJ 1.8.x系列,插件版本也要对应(比如aspectj-maven-plugin 1.11对应AspectJ 1.8.13),版本不匹配大概率会导致织入失败。
- 检查编译后的class文件:去项目的
target/classes目录下找到你的目标类,用反编译工具打开看看,里面有没有AspectJ插入的切面逻辑代码,如果有说明织入成功,只是你的切面逻辑有问题;如果没有,那就是织入过程没执行,回到插件配置排查。
最后验证一下
你可以在切面的通知方法里加个System.out.println("切面触发了!"),然后运行主方法,如果控制台能打印这句话,就说明织入生效了。
内容的提问来源于stack exchange,提问作者Rin Ori
相关产品推荐
相关产品推荐

