执行./gradlew build构建jar包报错IllegalAccessError问题求助
问题排查与解决方案
根因梳理
- 第一个报错
module jdk.compiler does not export com.sun.tools.javac.code to unnamed module:是JDK 16的模块化访问限制+低版本Lombok不兼容JDK16导致的,你当前使用的Lombok 1.18.20未适配JDK16的内部API访问规则。 - 第二个依赖处理报错+Gradle 7.0不兼容警告:Gradle 7.x版本已经彻底移除了废弃多年的
compile依赖配置,你在build.gradle中仍然使用compile声明依赖,属于非法配置。 - 额外的日志依赖问题:Spring Boot默认自带logback日志实现,你手动引入log4j-api、log4j-core如果没有排除默认日志,后续还会出现日志冲突报错。
具体修复步骤
1. 替换所有废弃的compile配置
将dependencies块中所有compile关键字替换为Gradle 7.x支持的implementation。
2. 升级Lombok版本适配JDK16
将Lombok版本升级到1.18.22及以上,该版本开始正式支持JDK16。如果升级后仍然出现模块化导出报错,可在build.gradle中添加编译参数开放对应模块访问权限。
3. 优化日志依赖配置
要么直接删除手动引入的log4j依赖,使用Spring Boot默认的logback实现;如果必须使用log4j2,使用官方提供的starter并排除默认日志依赖,无需单独引入api和core包。
修复后完整build.gradle示例
plugins { id 'org.springframework.boot' version '2.5.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'org.projects' version = '0.0.1-SNAPSHOT' sourceCompatibility = '16' // 与本地运行的JDK16版本对齐 def versionLombok = '1.18.30' // 升级到高版本适配JDK16 repositories { mavenCentral() } // 如仍有JDK模块导出报错,保留以下配置,无报错可删除 compileJava { options.forkOptions.jvmArgs += [ '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED' ] } dependencies { // 原来的compile全部替换为implementation // 如果需要使用log4j2可打开以下两行配置,否则直接删除自定义log4j依赖即可 // implementation 'org.springframework.boot:spring-boot-starter-log4j2' // configurations.implementation { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } implementation group: 'org.projectlombok', name: 'lombok', version: versionLombok annotationProcessor group: 'org.projectlombok', name: 'lombok', version: versionLombok implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() }
验证步骤
修改完成后执行./gradlew clean build即可正常生成jar包,Gradle废弃特性警告也会同步消失。
内容的提问来源于stack exchange,提问作者Deepjyoti De
相关产品推荐
相关产品推荐

