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

Java 8迁移至Java 11的Java EE项目AspectJ失效问题求助

Java 11迁移后AspectJ失效的解决思路

问题背景

基于Java EE 8的项目迁移至Java 11后,AspectJ切面功能失效,编译后的.class文件未被切面插件修改,切面逻辑未生效。当前依赖与插件配置如下:

依赖配置

<dependencies>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.9.5</version>
    </dependency>
</dependencies>

Maven插件配置

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.14.0</version>
            <configuration>
                <complianceLevel>11</complianceLevel>
                <source>11</source>
                <target>11</target>
            </configuration>
            <executions>
                <execution>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

曾尝试替换插件:

<plugin>
    <groupId>com.nickwongdev</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.12.6</version>
</plugin>

切面代码:

public aspect Aspect {
    Object around(): execution(* *(..)) && @annotation(annotation) {
    }
}

解决步骤

1. 统一AspectJ版本并升级至兼容Java 11的稳定版

Java 11要求AspectJ版本至少为1.9.0,建议使用1.9.20.1(最新稳定兼容版),确保aspectjrt依赖与插件使用的AspectJ版本一致:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.20.1</version>
</dependency>

2. 修正插件执行阶段与配置

  • 当前插件绑定的process-sources阶段过早,无法在Java编译完成后完成织入,改为compile阶段:
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    
  • 在插件配置中明确指定AspectJ版本,避免版本不一致:
    <configuration>
        <complianceLevel>11</complianceLevel>
        <source>11</source>
        <target>11</target>
        <aspectjVersion>1.9.20.1</aspectjVersion>
    </configuration>
    

3. 修复切面代码语法与逻辑问题

  • 切面中@annotation(annotation)未声明参数类型,需明确注解类型(假设你的注解为@MyAnnotation):
    public aspect Aspect {
        Object around(@annotation(MyAnnotation) MyAnnotation annotation): execution(* *(..)) && @annotation(annotation) {
            // 必须调用proceed()执行原方法,否则目标方法不会运行
            Object result = proceed();
            // 你的切面逻辑
            return result;
        }
    }
    
  • 注意:around通知必须调用proceed(),否则原方法不会执行,可能被误认为切面失效。

4. 明确插件织入范围

添加配置指定需要织入的包,确保插件能找到目标类与切面:

<configuration>
    <!-- 其他配置 -->
    <weavePackages>
        <weavePackage>com.your.project.service</weavePackage>
        <weavePackage>com.your.project.aspect</weavePackage>
    </weavePackages>
</configuration>

5. 处理Java模块兼容性(若使用模块化)

如果项目基于Java模块(module-info.java),需声明AspectJ依赖并开放织入权限:

module your.project.module {
    requires aspectjrt;
    // 允许AspectJ访问需要织入的包
    opens com.your.project.service to aspectjrt;
}

6. 验证Maven编译过程

执行mvn clean compile -X查看详细日志,检查:

  • AspectJ插件是否被触发
  • 是否出现类似weaving X classes的织入日志
  • 若插件未执行,排查Maven生命周期绑定是否正确

内容的提问来源于stack exchange,提问作者strugglewow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:18:19