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
相关产品推荐
相关产品推荐

