使用JDK15编译Java8项目时mvn package出现Lombok编译错误求助
Maven打包时Lombok编译错误解决方案
问题场景
从GitHub克隆了基于Java 8、Spring Boot 2.1.8.RELEASE、MySQL的项目,IntelliJ中配置了OpenJDK 15(本地同时存在OpenJDK 17),项目能正常运行,但执行mvn package时出现编译错误。
错误信息
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile) on project platform: Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x16a9eb2e) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x16a9eb2e
项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ezlearning</groupId> <artifactId>platform</artifactId> <version>0.0.1-SNAPSHOT</version> <name>platform</name> <description>Ez learning platform</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- Thymeleaf Spring Security --> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <!-- MySql dependency --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Database versioning --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> <!-- Spring Boot Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
解决方案
方案一:改用JDK8编译打包(推荐)
项目本身基于Java8,使用对应版本JDK编译最稳妥:
- 打开IntelliJ的项目设置(
File -> Project Structure),将Project SDK设置为OpenJDK8,Project language level设置为8。 - 配置Maven运行环境:在IntelliJ的Maven设置中,确保Runner的JRE为OpenJDK8;或者命令行先切换到JDK8环境,再执行
mvn package。
方案二:升级Lombok并适配JDK9+编译参数
若坚持用JDK15打包,需调整以下配置:
- 在pom.xml中显式升级Lombok到支持JDK9+的版本(如1.18.24):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <optional>true</optional> </dependency>
- 添加maven-compiler-plugin配置,允许Lombok访问JDK内部API:
在pom.xml的build -> plugins节点下新增:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg> <arg>--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg> <arg>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg> <arg>--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin>
方案三:临时跳过测试编译(应急用)
若需快速打包跳过测试代码编译,执行以下命令:
mvn package -Dmaven.test.skip=true
注意:此方式会跳过测试代码的编译与执行,不建议作为长期解决方案。
内容的提问来源于stack exchange,提问作者montassar omrani
相关产品推荐
相关产品推荐

