由于java.lang.NoClassDefFoundError而无法运行代码:com / fasterxml / jackson / annotation / JsonMerge

时间:2018-08-26 07:07:24

标签: java maven jackson

我在Intellij Idea 2018社区版中有一些测试代码,其中包含多个pom文件。当我运行任何带testng注释的测试时,出现错误,提示“未找到测试”。看来问题出在这是由于异常堆栈跟踪的这一部分所致:

java.lang.NoClassDefFoundError:com / fasterxml / jackson / annotation / JsonMerge

我用Google搜索了一个解决方案,并找到了这个-https://github.com/FasterXML/jackson-annotations/issues/119和这个https://stackoverflow.com/a/46406070。当我们在项目中没有相同版本的jar时,似乎是由于这个问题引起的。

1)杰克逊核心(2.8.8)

2)jackson-databind(2.9.2)

3)杰克逊注释(2.8.5)

如您所见,所有罐子的版本都不相同。我查看了项目中的所有poms,但没有找到添加所有这些依赖项的任何地方。我希望在那里简单地设置版本号。我应该只在父pom文件中添加所有依赖项还是做其他事情?

如何在不损害项目的情况下解决此问题?我如何找出这些罐子为何不是同一版本?

2 个答案:

答案 0 :(得分:6)

您很可能通过不同的依赖项作为子依赖项导入了不同的版本。

您可以通过maven向您展示所谓的“有效pom”,它将为您提供完整的依赖树,然后您可以从中查看其中的内容。

某些IDE(例如IntelliJ)可以选择以图形方式显示此内容,从而使查找此类冲突变得更加容易。

排除较低的版本,并在需要时显式添加对较新版本的依赖。

答案 1 :(得分:5)

您要查找的关键字是“依赖项排除”。 Maven自动包含传递依赖项。您首先需要确定依赖项来自何处。

您可以将输出重定向到文件并通过在如下生成的tree.txt文件中搜索“ jackson”来对其进行详细分析:

mvn dependency:tree -Dverbose > tree.txt

下一步将确定您是否可以升级某些库,以便它们自动为您使用正确版本的杰克逊库。

最后,如果您明确希望排除传递性依赖项,则可以在特定<exclusions>中使用<dependency>标签来排除添加到您的类路径中的某些第三方依赖项。例如,请参见此SO question