Spark单元测试调用parallelize报Jackson版本不兼容如何解决
你之前配置不生效的原因
- 排除规则写在了
testCompileOnly下的jersey依赖闭包中,但冲突的Jackson 2.9.7是从主依赖的dropwizard-core引入的,和jersey依赖没有关联,自然不会生效 - Gradle的
exclude语法不支持指定版本号,仅需指定group和module参数即可 testCompileOnly声明的依赖仅作用于编译阶段,不会加入测试运行时的类路径,就算写对了排除规则也不会影响测试运行时的依赖版本
解决方案(仅对单元测试生效,不改动生产环境依赖)
首先确认你使用的Spark版本对应的兼容Jackson版本,比如Spark 2.4.x对应Jackson 2.6.x系列,Spark 3.2+对应Jackson 2.13.x系列,同时注意jackson-module-scala的后缀要和Spark依赖的Scala版本一致(比如Spark用Scala 2.12就选后缀为_2.12的包),下面两种方案任选其一即可:
方案1:测试阶段强制指定Spark兼容的Jackson版本(最简便)
在build.gradle中添加如下配置:
configurations { // 老版本Gradle替换为testCompile testRuntimeClasspath { resolutionStrategy { // 替换成Spark兼容的对应版本即可 def jacksonVersion = "2.6.7" def scalaVersion = "2.11" // 和Spark依赖的Scala版本保持一致 force "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" force "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" force "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" force "com.fasterxml.jackson.module:jackson-module-scala_${scalaVersion}:${jacksonVersion}" } } }
方案2:测试阶段排除所有Jackson依赖后手动引入适配版本
如果强制版本仍存在冲突,可以选择在测试运行时全局排除Jackson系列依赖,再单独引入适配版本:
configurations { testRuntimeClasspath { exclude group: 'com.fasterxml.jackson.core' exclude group: 'com.fasterxml.jackson.module' } } dependencies { // 替换成Spark兼容的对应版本,Scala版本和Spark保持一致 def jacksonVersion = "2.6.7" def scalaVersion = "2.11" testImplementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}" testImplementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}" testImplementation "com.fasterxml.jackson.core:jackson-databind:${jacksonVersion}" testImplementation "com.fasterxml.jackson.module:jackson-module-scala_${scalaVersion}:${jacksonVersion}" }
配置完成后可以执行./gradlew dependencies --configuration testRuntimeClasspath命令查看测试运行时的Jackson依赖版本,确认已经切换到目标版本后再执行单元测试即可。
内容的提问来源于stack exchange,提问作者Laodao
相关产品推荐
相关产品推荐

