非Spring项目中AspectJ注解无法拦截被增强方法问题求助
问题排查与解决方案
看起来你遇到的是AspectJ增强逻辑未生效的问题,我帮你梳理了几个关键的配置和代码细节,按以下步骤修正应该就能解决:
1. 修复AOP.xml的结构错误
你把<weaver>标签嵌套在了<aspects>标签内部,这不符合AspectJ的配置规范,正确的结构应该让<weaver>和<aspects>作为<aspectj>的直接子节点。修正后的src/main/resources/META-INF/aop.xml:
<aspectj> <aspects> <aspect name="pl.bart.Advice"/> </aspects> <weaver options="-verbose -showWeaveInfo"> <include within="pl.bart.*"/> </weaver> </aspectj>
2. 统一AspectJ版本并适配Java 17
你当前使用的AspectJ 1.5.4是非常老旧的版本,完全不支持Java 17,而且pom.xml里版本混乱(aspectjrt/weaver用1.5.4,javaagent却用1.8.9),建议升级到支持Java 17的稳定版本,比如1.9.20:
修正后的依赖配置
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.20</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.20</version> </dependency> </dependencies>
给aspectj-maven-plugin指定AspectJ版本
插件需要明确知道要使用的AspectJ版本,避免版本不一致:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <aspectjVersion>1.9.20</aspectjVersion> <source>17</source> <target>17</target> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> </plugin>
3. 修复JavaAgent的路径问题
你pom.xml里的javaagent路径有多余的空格,导致无法正确定位jar包,而且要和依赖版本统一。同时,maven-surefire-plugin的forkMode已经废弃,改用forkCount和reuseForks:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <!-- 升级到新版本更稳定 --> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.9.20/aspectjweaver-1.9.20.jar" </argLine> <useSystemClassLoader>true</useSystemClassLoader> <forkCount>1</forkCount> <reuseForks>false</reuseForks> </configuration> </plugin>
4. 优化PointCut表达式(避免歧义)
你的PointCut用@annotation(Annotation)可能会因为类路径的问题找不到自定义注解,建议使用全限定类名来明确指定:
@Pointcut("@annotation(pl.bart.Annotation)") public void callAt() { }
5. 验证织入效果
- 如果使用编译时织入(CTW):执行命令
mvn clean compile exec:java -Dexec.mainClass="pl.bart.Main",控制台会输出织入的详细日志(因为weaver配置了-verbose -showWeaveInfo),同时能看到Advice的输出。 - 如果使用加载时织入(LTW):确保
aop.xml在src/main/resources/META-INF目录下,执行mvn clean test或者直接运行Main类时指定javaagent参数。
完成以上修正后,运行Main类应该会先输出Hello from advice,然后输出Hello from sample class,说明你的AOP增强逻辑已经生效了。
内容的提问来源于stack exchange,提问作者Bartek
相关产品推荐
相关产品推荐

