e: java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @0x64743a65) cannot access class com.sun.tools.javac.main.JavaCompiler (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module @0x64743a65
时间: 2025-07-05 18:12:32 浏览: 7
在使用 Kotlin 的 Kapt 工具进行 Java 注解处理时,可能会遇到 `java.lang.IllegalAccessError` 错误,具体表现为:
```
superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler cannot access class com.sun.tools.javac.main.JavaCompiler because module jdk.compiler does not export com.sun.tools.javac.main to unnamed module
```
此类问题的根本原因是 JDK 9 及以上版本引入了模块化系统(JPMS),限制了未命名模块对 `jdk.compiler` 模块中内部类的访问。Kapt 使用了 `com.sun.tools.javac` 包中的类,而这些类并未默认开放给外部模块,从而导致访问失败[^1]。
---
### 解决方案
#### 1. 添加 JVM 参数放宽模块访问限制
可以通过在构建命令中添加 `--add-exports` 参数,显式允许未命名模块访问 `jdk.compiler` 中的相关包。例如,在 Gradle 构建脚本中配置如下参数:
```properties
org.gradle.jvmargs=-Xmx2048m --add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
```
对于 Maven 项目,可以在 `pom.xml` 中配置 `maven-compiler-plugin` 插件以传递该参数:
```xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<fork>true</fork>
<compilerArgs>
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
```
此方法适用于需要继续使用 JDK 17 或更高版本的情况[^2]。
#### 2. 升级 Kotlin 和 Kapt 版本
较新的 Kotlin 版本已经优化了与 JDK 模块系统的兼容性。建议将 Kotlin 插件升级至最新稳定版本,例如 1.8.0 或更高:
```kotlin
plugins {
id("org.jetbrains.kotlin.kapt") version "1.8.0"
}
```
通过更新工具链可以减少因模块访问控制引发的异常,并获得更好的性能和稳定性[^1]。
#### 3. 切换回 JDK 8
如果当前项目对 JDK 新特性依赖不强,可以选择降级到 JDK 8。JDK 8 不包含模块系统,因此不会出现此类访问控制问题。只需确保所有开发环境和 CI 流程均使用 JDK 8 即可避免错误[^3]。
---
### 注意事项
- **避免直接依赖 JDK 内部 API**:如 `com.sun.tools.javac.*` 等类不属于公共 API,未来版本可能随时变更或移除。
- **统一构建环境配置**:确保所有开发者及 CI 系统使用的 JDK 版本和构建参数一致,避免因环境差异导致编译失败。
- **关注插件兼容性公告**:持续跟踪 Kotlin、Lombok 等第三方库的发布说明,及时获取针对新 JDK 的兼容性修复。
---
阅读全文
相关推荐
















