Quarkus Java21 Lambda集成PowerTools时Record类AspectJ编译报错
问题描述
在Quarkus Java 21 Lambda函数应用中,按照PowerTools Java库的安装步骤操作后,所有record对象均出现AspectJ编译错误。
应用中的record示例:
package com.example; public record ProductDetails(String labelKey, String productType) {}
错误信息:
[ERROR] Failed to execute goal dev.aspectj:aspectj-maven-plugin:1.13.1:compile (default) on project lambda-java-quarkus-template: AJC compiler errors: [ERROR] error at public record CreateCustomerProductRequest(String externalProductCode) { [ERROR] /mnt/c/Users/me/IdeaProjects/quarkus-lambda-sample-a/src/main/java/be/company/template/adapter/in/alb/model/ProductDetails.java:7:0::0 Syntax error, insert "aspect Identifier" to complete aspect header
可复现项目执行mvn install即可触发错误,项目POM文件如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>quarkus-powertools-mcve</artifactId> <version>1.0-SNAPSHOT</version> <properties> <compiler-plugin.version>3.14.0</compiler-plugin.version> <maven.compiler.release>21</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id> <quarkus.platform.version>3.21.3</quarkus.platform.version> <skipITs>true</skipITs> <surefire-plugin.version>3.5.2</surefire-plugin.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>${quarkus.platform.artifact-id}</artifactId> <version>${quarkus.platform.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.21</version> </dependency> <dependency> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-logging</artifactId> <version>1.20.1</version> </dependency> <dependency> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-tracing</artifactId> <version>1.20.1</version> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-arc</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-rest</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-junit5</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>dev.aspectj</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.13.1</version> <configuration> <source>11</source> <target>11</target> <complianceLevel>11</complianceLevel> <aspectLibraries> <aspectLibrary> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-tracing</artifactId> </aspectLibrary> <aspectLibrary> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-logging</artifactId> </aspectLibrary> </aspectLibraries> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>build</goal> <goal>generate-code</goal> <goal>generate-code-tests</goal> <goal>native-image-agent</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> <configuration> <parameters>true</parameters> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${surefire-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> <configuration> <systemPropertyVariables> <native.image.path>${project.build.directory}/${project.build.finalName}-runner </native.image.path> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>native</id> <activation> <property> <name>native</name> </property> </activation> <properties> <skipITs>false</skipITs> <quarkus.native.enabled>true</quarkus.native.enabled> </properties> </profile> </profiles> </project>
问题原因及解决方案
原因
- AspectJ插件版本与Java版本不兼容:当前使用的
aspectj-maven-plugin版本1.13.1配置的编译级别为Java 11,而项目实际使用Java 21。Java Record是Java 16引入的特性,旧版本AspectJ编译器对Java 16+语法支持不完善,无法正确解析Record语法,误将其识别为Aspect定义的语法错误。 - 依赖版本不匹配:AspectJ运行时依赖
aspectjrt版本1.9.21虽支持Java 16+,但与插件版本的编译配置不匹配,进一步加剧兼容性问题。
解决方案
1. 更新AspectJ Maven插件并调整编译级别
使用支持Java 21的插件版本(如1.14.0+),同步修改编译配置的source、target、complianceLevel为21:
<plugin> <groupId>dev.aspectj</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <source>21</source> <target>21</target> <complianceLevel>21</complianceLevel> <aspectLibraries> <aspectLibrary> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-tracing</artifactId> </aspectLibrary> <aspectLibrary> <groupId>software.amazon.lambda</groupId> <artifactId>powertools-logging</artifactId> </aspectLibrary> </aspectLibraries> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin>
2. 同步更新AspectJ运行时依赖版本
将aspectjrt版本更新为与插件兼容的版本(如1.9.22+):
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.22</version> </dependency>
3. 强化Maven编译器配置
确保maven-compiler-plugin的编译级别与Java 21一致:
<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> <configuration> <parameters>true</parameters> <source>21</source> <target>21</target> <release>21</release> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Heschoon
相关产品推荐
相关产品推荐

