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

我在Intellij Idea 2018社区版中有一些测试代码,它有多个pom文件。 当我运行任何testng注释测试时,我收到一条错误,上面写着“没有找到测试”。 看起来问题是由于exception堆栈跟踪的这一部分:

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

我搜索了一个解决方案并找到了这个 – https://github.com/FasterXML/jackson-annotations/issues/119和这个https://stackoverflow.com/a/46406070 。 当我们在项目中没有相同版本的这些jar时,看起来会出现此问题。

1)jackson-core(2.8.8)

2)jackson-databind(2.9.2)

3)jackson-annotations(2.8.5)

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

如何在不损害项目的情况下解决此问题? 我怎么知道为什么这些jar子的版本不一样?

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

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

某些IDE(如IntelliJ)可以选择以图形方式显示,这使得发现这样的冲突变得更加容易。

排除较低版本,如果需要,则明确地将依赖项添加到较新版本。

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

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

mvn dependency:tree -Dverbose > tree.txt 

下一步是找出是否可以升级一些库,以便它们自动为您使用正确版本的jackson库。

最后,如果您明确要排除传递依赖项,则可以在某个使用标记来排除添加到类路径中的某些第三方依赖项。 例如,请参阅此SO问题 。