Java17+Dropwizard4.0.1环境下Jackson Blackbird 2.15.2运行报错求助
报错java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/blackbird/ser/ToBooleanFunction的核心原因是Jackson Blackbird模块与Dropwizard 4.0.1依赖的Jackson核心版本不兼容。Dropwizard 4.0.x内置了Jackson 2.15.x系列版本,而ToBooleanFunction是Blackbird 2.15+版本新增的内部类,若你的Blackbird版本未同步升级到对应版本,就会出现类找不到的情况。另外Java 17的模块系统权限限制,也会影响Blackbird动态生成Lambda字节码的逻辑,加剧这个问题。
1. 强制统一Jackson及Blackbird版本
确保Blackbird模块版本与Dropwizard依赖的Jackson核心版本完全一致(Dropwizard 4.0.1对应Jackson 2.15.3)。在Gradle中显式指定版本并添加冲突规避规则:
dependencies { implementation "com.fasterxml.jackson.module:jackson-module-blackbird:2.15.3" // 保留其他原有依赖 } configurations.all { resolutionStrategy { // 强制所有Jackson相关依赖统一版本 force "com.fasterxml.jackson.core:jackson-core:2.15.3" force "com.fasterxml.jackson.core:jackson-databind:2.15.3" force "com.fasterxml.jackson.core:jackson-annotations:2.15.3" force "com.fasterxml.jackson.module:jackson-module-blackbird:2.15.3" } }
2. 补充Java 17所需的JVM参数
除已添加的参数外,Blackbird需要额外权限来生成Lambda类,更新Gradle的JVM参数配置:
doFirst { jvmArgs += '--add-opens=java.base/javax.security.auth.x500=ALL-UNNAMED' jvmArgs += '--add-opens=java.base/javax.crypto=ALL-UNNAMED' // 新增Blackbird动态字节码生成所需权限 jvmArgs += '--add-opens=java.base/java.lang.invoke=ALL-UNNAMED' jvmArgs += '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED' }
3. 验证依赖完整性
执行./gradlew dependencies | grep jackson命令,检查所有Jackson相关依赖的版本是否统一,确保没有混合不同版本的Jackson核心或模块。
Afterburner是Blackbird的前身,Dropwizard 4.0.x对其版本兼容性处理更完善,且Afterburner内部实现未依赖Blackbird新增的ToBooleanFunction类,因此不会出现版本错位问题。但只要完成上述步骤对齐版本并配置权限,Blackbird可以正常使用。
内容的提问来源于stack exchange,提问作者donnffd

