【问题标题】:Cannot run code due to java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonMerge由于 java.lang.NoClassDefFoundError 无法运行代码:com/fasterxml/jackson/annotation/JsonMerge
【发布时间】:2019-02-01 02:03:29
【问题描述】:

我在 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) 杰克逊数据绑定 (2.9.2)

3) 杰克逊注解 (2.8.5)

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

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

【问题讨论】:

    标签: java maven jackson


    【解决方案1】:

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

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

    某些 IDE(例如 IntelliJ)可以选择以图形方式显示此内容,这样可以更轻松地查找此类冲突。

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

    【讨论】:

    • 谢谢。如何在 intellij idea 中以图形方式查看“有效 pom”?另外,如何排除较低版本或显式将依赖项添加到较新版本?
    • 在编辑器中打开pom或者在maven项目视图中选择,右键->Maven->显示依赖。可能无法在社区版中使用。要排除事物,只需为其添加显式排除。要包含其他版本,只需将它们本身添加为依赖项即可。
    • 是的,社区版中没有该选项。我将尝试将其导入 eclipse 并使用其依赖项视图功能。顺便说一句,我想学习如何以适当的方式解决这些问题。您能否为此建议一些链接或建议一些谷歌搜索词来获取此类链接?谢谢。
    • 您也可以只使用 maven 作为命令行工具并在您的项目目录中运行“mvn help:effective-pom”。此外,您可以使用“mvn dependency:tree -Dverbose -Dincludes=commons-collections”来全面了解您的依赖项源自何处。
    【解决方案2】:

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

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

    mvn dependency:tree -Dverbose > tree.txt
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 2021-11-10
      • 2020-11-24
      • 2015-08-02
      • 1970-01-01
      • 2018-04-26
      • 2022-09-20
      相关资源
      最近更新 更多