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

2022-09-03 14:21:28

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

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

我用谷歌搜索了一个解决方案,发现了这个 - 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)

如您所见,我没有为所有jars提供相同的版本。我查看了项目中的所有pom,没有找到添加所有这些依赖项的任何地方。我希望简单地在那里设置版本号。我应该简单地在我的父 pom 文件中添加所有依赖项还是执行其他操作?

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


答案 1

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

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

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

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


答案 2

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

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

mvn dependency:tree -Dverbose > tree.txt

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

最后,如果显式想要排除传递依赖项,则可以在某个对象中使用标记来排除添加到类路径中的某些第三方依赖项。例如,请参阅此 SO 问题<exclusions><dependency>


推荐