You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:09:09