AWS Glue作业中Jackson依赖版本冲突及方法缺失问题排查
解决AWS Glue作业中scala-maxmind-iplookups的Jackson版本冲突问题
我来帮你搞定这个头疼的Jackson版本冲突问题——这在AWS Glue里搭配第三方库时简直是家常便饭。咱们先理清楚问题根源,再给出具体的解决方案:
问题回顾
你在AWS Glue作业中使用scala-maxmind-iplookups库,用sbt-assembly打包包含所有依赖的Jar时遇到两种错误:
- 当用
dependencyOverrides指定Jackson 2.9.3版本时,触发Incompatible Jackson version: 2.9.3错误 - 当尝试排除Jackson依赖时,又出现
NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(...)错误
根源分析
AWS Glue本身内置了特定版本的Jackson库:
- Glue 1.x/2.x默认使用Jackson 2.6.7
- Glue 3.x默认使用Jackson 2.10.5
你的问题出在版本不兼容:
- 强行指定2.9.3时,和Glue内置的旧版本Jackson冲突,引发版本不匹配错误
- 完全排除Jackson依赖后,
scala-maxmind-iplookups需要的Jackson方法在Glue的旧版本中不存在,导致方法缺失错误
解决方案:对齐Glue的Jackson版本
核心思路是让你的Jar兼容Glue内置的Jackson版本,而不是强行覆盖或排除。具体步骤如下:
1. 修改sbt配置,对齐Jackson版本
在build.sbt中添加dependencyOverrides,强制所有依赖使用和Glue一致的Jackson版本:
针对Glue 1.x/2.x:
dependencyOverrides ++= Seq( "com.fasterxml.jackson.core" % "jackson-core" % "2.6.7", "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.7", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.6.7", "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.6.7" )
针对Glue 3.x:
dependencyOverrides ++= Seq( "com.fasterxml.jackson.core" % "jackson-core" % "2.10.5", "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.5", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.10.5", "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.5" )
2. 配置sbt-assembly的合并策略
Jackson的模块服务文件可能会冲突,需要在assembly配置中添加合并策略,避免打包时丢失必要的配置:
在build.sbt中添加:
assemblyMergeStrategy in assembly := { case PathList("META-INF", "services", "com.fasterxml.jackson.databind.Module") => MergeStrategy.concat case x => val defaultStrategy = (assemblyMergeStrategy in assembly).value defaultStrategy(x) }
3. 重新打包并验证
- 运行
sbt assembly重新生成Jar包 - 将Jar上传到S3,更新Glue作业的依赖配置
- 启动Glue作业,检查是否解决了版本冲突和方法缺失问题
为什么这能解决问题?
- 对齐Glue的Jackson版本,彻底避免版本冲突
- 合并Jackson的模块服务文件,确保Scala Jackson模块能被Glue的Jackson正确加载
- 不需要排除Jackson依赖,因为Glue已经提供了兼容版本,我们只是让第三方库使用这个版本
内容的提问来源于stack exchange,提问作者pwc




