Kotlin+Java10+Maven+Java Modules组合构建失败求助
解决Kotlin 1.2.31 + Java 10模块系统编译报错问题
首先得明确:你遇到的核心问题是Kotlin 1.2.x版本对Java 9+模块系统(module-info.java)的支持不完善,再加上Kotlin Maven插件自带的重打包/着色版ASM库版本过旧,无法解析Java 9+的字节码格式,才会在ClassReader.java:2659处抛出错误。下面是具体的解决步骤:
1. 优先升级Kotlin版本(最有效方案)
Kotlin 1.2.31是2018年的老版本,当时Java模块系统刚推出,Kotlin对它的支持还处于早期阶段。官方在Kotlin 1.3.70及以上版本大幅改进了对Java模块系统的兼容性,同时更新了依赖的ASM库,能完美处理Java 9-10的字节码。
具体操作:
修改你的pom.xml中的Kotlin版本和插件版本,保持两者一致:
<properties> <kotlin.version>1.3.70</kotlin.version> <!-- 也可以用更高的稳定版,比如1.6.x --> <java.version>10</java.version> </properties> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/kotlin</sourceDir> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> <jvmTarget>${java.version}</jvmTarget> </configuration> </execution> </executions> </plugin> </plugins> </build>
升级后大部分模块相关的编译问题都会直接消失。
2. 旧版本临时兼容方案(不推荐,仅应急)
如果暂时无法升级Kotlin版本,可以尝试以下配置来强制编译器适配模块系统,但效果有限:
在kotlin-maven-plugin的配置中添加JVM目标和模块相关参数:
<configuration> <jvmTarget>10</jvmTarget> <args> <arg>-Xjvm-default=enable</arg> <arg>-Xmodule-path=${project.build.outputDirectory}</arg> </args> </configuration>
注意:这个方案不一定能解决ASM的底层解析错误,因为1.2.31依赖的ASM确实不支持Java 9的字节码属性。
3. 排查重打包ASM的具体错误
如果你想深入排查ClassReader.java:2659的问题,可以反编译Kotlin插件中的着色版ASM:
- 找到本地Maven仓库中
kotlin-maven-plugin-1.2.31.jar的位置(路径一般是~/.m2/repository/org/jetbrains/kotlin/kotlin-maven-plugin/1.2.31) - 用IntelliJ IDEA或JD-GUI等反编译工具打开该Jar,定位到
org.jetbrains.org.objectweb.asm.ClassReader类(注意包名是Kotlin重命名后的,不是原生的org.objectweb.asm) - 查看2659行的代码,通常是因为Java 9新增的
ModuleAttribute等字节码属性导致解析失败。
4. 拆分模块规避问题
如果以上方案都不行,可以暂时拆分模块:
- 将
module-info.java放到一个纯Java的子模块中,单独编译 - 让Kotlin代码所在的模块不添加
module-info.java,作为自动模块(automatic module)依赖Java子模块
这样可以避免Kotlin编译器直接处理模块系统相关的字节码。
内容的提问来源于stack exchange,提问作者Jeff McClure
相关产品推荐
相关产品推荐

