运行Kotlin应用时遭遇java.lang.IllegalAccessError错误求助
嘿,我碰到过类似的问题,这个错误本质是Kapt(Kotlin注解处理工具)和你当前使用的JDK版本不兼容导致的——JDK 9及以上引入了模块系统,而旧版Kapt没有适配这个系统,无法访问JDK内部被模块保护的com.sun.tools.javac.main包。
先把你遇到的错误信息整理出来:
java.lang.IllegalAccessError: superclass access check failed: class org.jetbrains.kotlin.kapt3.base.javac.KaptJavaCompiler (in unnamed module @0x54b60832) 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 @0x54b60832
对应的部分栈轨迹:
at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/...(你提供的内容未完整,可补充完整栈信息方便进一步排查)
下面是几个靠谱的解决办法:
优先升级Kotlin和Kapt版本:这是最彻底的方案。如果你的项目用了JDK 11+,建议把Kotlin版本升级到1.5.0及以上(最新稳定版更好),这些版本已经适配了JDK模块系统。修改项目的
build.gradle(或build.gradle.kts):plugins { id 'org.jetbrains.kotlin.jvm' version '1.9.20' // 替换为兼容的最新稳定版 id 'kotlin-kapt' version '1.9.20' }同步项目后重新编译运行,大概率能解决问题。
临时添加JVM参数(应急方案):如果暂时没法升级版本,可以在应用的运行配置里添加以下JVM参数,强制让JDK模块暴露需要的包给未命名模块:
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED注意这只是临时 workaround,长期不推荐,因为后续JDK版本可能会限制这类参数的使用。
检查依赖是否误用内部API:确认你的项目或第三方依赖有没有直接引用
com.sun.tools.javac.main这类JDK内部包,这类包属于非公开API,本来就不应该被外部代码调用,升级Kapt版本后会用规范的方式替代这类调用。
备注:内容来源于stack exchange,提问作者darknessww




