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

15
我在Intellij Idea 2018社区版中有一些测试代码,其中有多个pom文件。当我运行任何测试ng注释测试时,会出现一个错误,显示“找不到测试”。看起来问题是由于异常堆栈跟踪的这部分引起的: java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge 我搜索了解决方案,并找到了这个网址:https://github.com/FasterXML/jackson-annotations/issues/119 和这个https://dev59.com/wlsV5IYBdhLWcg3w-i0C#46406070。看起来这个问题是由于我们在项目中没有同样版本的这些jar包引起的。
1) jackson-core (2.8.8)
2) jackson-databind (2.9.2)
3) jackson-annotations (2.8.5)
正如你所看到的,我没有所有jar包的相同版本。我查看了项目中所有的pom文件,没有发现所有这些依赖项都被添加的地方。我希望能够简单地在那里设置版本号。我应该在我的父pom文件中添加所有依赖项,还是做其他事情?
我如何在不影响项目的情况下解决此问题?我如何找出为什么这些jar包不是同一版本?
2个回答

10

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

您可以让 Maven 显示所谓的“有效 POM”,它将提供完整的依赖关系树,从中您可以看到包含什么内容的位置。

一些 IDE(如 IntelliJ)有一个选项可以以图形方式显示这个关系,这样查找冲突就容易得多。

排除较低版本,如果需要,显式添加较新版本的依赖项。


谢谢。我如何在IntelliJ IDEA中以图形方式查看“有效的POM”?另外,我如何排除较低版本或显式添加依赖项到新版本? - MasterJoe
1
在编辑器中打开pom文件或在Maven项目视图中选择它,右键单击->Maven->显示依赖项。这可能无法在社区版中使用。要排除某些内容,只需为其添加显式排除即可。要包含其他版本,只需将它们作为依赖项添加即可。 - jwenting
是的,在社区版中没有这个选项。我会尝试将其导入到Eclipse中,并使用其依赖视图功能。顺便说一下,我想学习如何以正确的方式解决此类问题。您能否提供一些相关链接或建议一些谷歌搜索词来获取这些链接?谢谢。 - MasterJoe
2
你也可以将Maven作为命令行工具使用,在项目目录中运行“mvn help:effective-pom”。此外,你还可以使用“mvn dependency:tree -Dverbose -Dincludes=commons-collections”来获取完整的依赖关系概述。 - mbruns42

8
你要找的关键词是“依赖排除”。Maven会自动包含传递依赖。你需要先确定依赖关系的来源。
你可以将输出重定向到文件中,并通过在生成的tree.txt文件中搜索“jackson”来进行详细分析。
mvn dependency:tree -Dverbose > tree.txt

下一步是查找是否可以升级某些库,以便它们自动使用正确版本的jackson库。
最后,如果您明确想要排除传递依赖项,可以在特定的标记内使用标记来排除添加到类路径中的某些第三方依赖项。例如,请参阅此SO问题

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接