有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在Intellij Idea 2018社区版中有一些测试代码,它有多个pom文件。当我运行任何带有testng注释的测试时,我得到一个错误,上面写着“未找到任何测试”。问题似乎是由于异常堆栈跟踪的这一部分造成的:

爪哇。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)杰克逊数据绑定(2.9.2)

3)杰克逊注释(2.8.5)

正如你所看到的,我并没有为所有的罐子提供相同的版本。我查看了我项目中的所有POM,没有找到添加所有这些依赖项的地方。我只是希望在那里设置版本号。我应该简单地将所有依赖项添加到父pom文件中,还是执行其他操作

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    mvn dependency:tree -Dverbose > tree.txt
    

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

    最后,如果您显式地想要排除可传递依赖项,那么可以在某个<dependency>内使用<exclusions>标记来排除添加到类路径中的某些第三方依赖项。例如,请参见此SO question

  2. # 2 楼答案

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

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

    一些IDE(如IntelliJ)有一个以图形方式显示的选项,这使得查找此类冲突变得更加容易

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