Spring Boot+Maven+Java 16栈集成AspectJ构建可运行Jar的配置问题
适配Java 16 + AspectJ 操作步骤
- 第一步:替换过时的AspectJ Maven插件
原org.codehaus.mojo:aspectj-maven-plugin已停止维护,最高仅支持Java 8,改用社区持续维护的dev.aspectj:aspectj-maven-plugin,最新稳定版支持Java 16及以上版本。 - 第二步:统一版本配置
升级AspectJ相关依赖版本到1.9.7及以上(该版本开始正式支持Java 16),同时升级Lombok版本到1.18.20及以上,避免和高版本ajc编译冲突。 - 第三步:调整插件配置,兼容Lombok
新增Lombok绑定依赖解决Lombok和AspectJ的编织顺序冲突,调整maven-compiler-plugin和aspectj-maven-plugin的执行顺序,确保先由ajc完成编译编织。 - 第四步:IDEA配置对齐
打开IDEA的Preferences -> Build, Execution, Deployment -> Compiler -> Java Compiler,将Use compiler改为Ajc,在Path to aspectjtools.jar处选择和pom中版本一致的aspectjtools jar包,勾选Delegate to IDEA build/run actions to Maven避免IDE和Maven编译结果不一致。
适配后完整pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>groupId</groupId> <artifactId>MyAopWithoutSpring</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.14</version> </parent> <properties> <java.version>16</java.version> <aspectj.version>1.9.7</aspectj.version> <aspectj-maven-plugin.version>1.13.1</aspectj-maven-plugin.version> <lombok.version>1.18.28</lombok.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <skipMain>true</skipMain> </configuration> </plugin> <plugin> <groupId>dev.aspectj</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>${aspectj-maven-plugin.version}</version> <configuration> <complianceLevel>${java.version}</complianceLevel> <source>${java.version}</source> <target>${java.version}</target> <showWeaveInfo>true</showWeaveInfo> <verbose>true</verbose> <Xlint>ignore</Xlint> <encoding>UTF-8</encoding> <excludes> <exclude>**/pointcutadvice/**</exclude> </excludes> <forceAjcCompile>true</forceAjcCompile> <weaveDirectories> <weaveDirectory>${project.build.directory}/classes</weaveDirectory> </weaveDirectories> <classpathElements> <classpathElement>${project.build.directory}/classes</classpathElement> </classpathElements> </configuration> <executions> <execution> <phase>process-classes</phase> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
验证方法
- 执行
mvn clean package完成编译打包 - 启动Jar包,验证切面逻辑是否正常触发
- 若IDEA本地运行异常,执行
mvn clean install后重新同步Maven项目即可
内容的提问来源于stack exchange,提问作者Eduard
相关产品推荐
相关产品推荐

