使用shadowJar打包Kotlin项目时遇Jackson-Core Java21版本兼容错误
解决shadowJar打包时Jackson 2.16.1的Java 21类文件兼容问题(Java 17环境)
核心问题回顾
shadowJar 8.1.1依赖的ASM版本(9.5)不支持Java 21编译的类文件(major version 65),而jackson-core-2.16.1中包含这类文件,导致打包时抛出org.gradle.api.GradleException: Could not add zip entry错误。以下是针对Java 17环境的可行解决方案:
方案1:升级shadowJar插件到支持ASM 9.6+的版本
ASM 9.6及以上版本已支持Java 21类文件,shadowJar从8.2.0版本开始将ASM依赖升级到9.6。直接升级插件即可解决问题:
plugins { kotlin("jvm") version "1.9.20" // 保持你项目的Kotlin版本 id("com.github.johnrengelman.shadow") version "8.2.0" // 升级到兼容版本 }
方案2:强制替换shadowJar依赖的ASM版本(不升级插件)
如果无法升级shadowJar插件,可以在构建脚本中强制将ASM版本替换为9.6+,确保插件使用支持Java 21的ASM版本:
buildscript { configurations.all { resolutionStrategy.eachDependency { // 强制替换所有ASM相关依赖为9.6版本 if (requested.group == "org.ow2.asm") { useVersion("9.6") because("需要支持Java 21编译的类文件") } } } }
执行以下命令验证ASM版本是否生效:
./gradlew dependencies --configuration buildscriptClasspath | grep asm
方案3:排除jackson-core中的Java 21类文件(兜底方案,不推荐)
如果前两种方案都无法实施,可以尝试排除jackson-core中Java 21编译的类文件,但需确认这些类不会被项目使用(风险较高):
tasks.shadowJar { // 示例:排除jackson-core中Java21编译的类路径,需根据实际情况调整 exclude("com/fasterxml/jackson/core/tsm/*") // 保留你的原有包重定位配置 relocate("com.fasterxml.jackson", "your.custom.package.shaded.jackson") }
优先级建议
优先选择方案1,升级插件能获得官方的兼容性修复和最新特性;方案2适合受限于插件版本的场景;方案3仅作为最后兜底手段,需充分测试排除后的功能完整性。
内容的提问来源于stack exchange,提问作者Light_Sun
相关产品推荐
相关产品推荐

