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

问题描述 投票:12回答:2

我在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)jackson-core(2.8.8)

2)jackson-databind(2.9.2)

3)jackson-annotations(2.8.5)

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

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

java maven jackson
2个回答
6
投票

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

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

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

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


5
投票

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

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

mvn dependency:tree -Dverbose > tree.txt

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

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

© www.soinside.com 2019 - 2024. All rights reserved.