【问题标题】:Maven. Transitive dependencies马文。传递依赖
【发布时间】:2020-07-10 04:24:44
【问题描述】:

我的项目 P 依赖于依赖项 A,而依赖项 A 又依赖于依赖项 B。我的项目的 pom.xml 文件包含 A 作为依赖项,并且它的 jar 包含在 P 的类路径中。但是,在 P 的运行时抛出了一个NoClassDefFoundError,它源于缺少 B jar。

Maven 不应该自动下载这些依赖项吗?

【问题讨论】:

    标签: maven-2 dependencies


    【解决方案1】:

    我的项目 P 依赖于依赖项 A [具有编译范围],它依赖于依赖项 B [具有编译范围]。

    除非 B 是 A 的 optional dependency,否则 B 应该是具有“compile(*)”范围的 P 的依赖项(请参阅 Dependency Scope 的表并阅读注释),因此应该在运行时可用。

    但是,在 P 的运行时会抛出 NoClassDefFoundError,这源于缺少 B jar。

    由于您是在 Eclipse 下运行项目,因此已为您设置了类路径,因此我将排除此级别的错误。这给我们留下了可选依赖的情况。

    PS:调查此类问题的一个非常有用的工具是dependency:tree

    【讨论】:

    • 最后一句话:m2eclipse中的依赖层次视图比dependency:tree更加人性化,它甚至给你一个“排除”向导
    • @seanizer: True(假设 OP 使用 m2eclipse)。注意dependency:tree也支持filtering
    • 我假设任何同时使用 maven 和 eclipse 的人也使用 m2eclipse,因为它比 maven-eclipse-plugin(pom 编辑器、存储库索引、pom 时自动配置更改)更加强大和舒适被编辑等)。当然它还包括过滤:单击层次结构中的任何工件,仅显示该工件的层次结构...
    • @Jake:我知道这个问题很老,但我有同样的问题,不知道这个答案是如何解决问题的 - 你能告诉我你是如何解决的吗?顺便提一句。一种解决方法是将传递依赖项添加为直接依赖项,但我想要“真正的”解决方案。
    • @kutschkem 你知道了吗?经过这么多年:)
    【解决方案2】:

    如果此依赖项 A 具有 compile 范围 - 当然,它应该已被下载并且更多 - 在项目的类路径中可用。但如果它具有 provided 范围,情况就会如此,因为 Maven 不会将提供的 deps 与应用程序打包在一起。

    顺便说一句,您是如何运行这个项目的 - 没有以正确的方式运行也可能导致此类问题,这是一个很好的猜测。例如 - 如果你使用 maven exec plugin - maven 会为你正确设置类路径,但否则 - 你应该自己设置它(或使用 assembly plugin 构建一个具有依赖关系的 jar)。

    【讨论】:

    • A 将 B 列为具有“编译”范围的依赖项; P 将 A 列为具有“编译”范围的依赖项。 B 没有被添加到 P 的类路径中。
    • 你没有回答“你是如何运行它的?”的问题
    • @bmargulies 请原谅。我生成 Eclipse 元数据并从 Eclipse 调试器中运行它。
    • 你用 mvn eclipse:eclipse 生成它?
    • 是的,我使用mvn eclipse:clean eclipse:eclipse 生成元数据。然后 A 的 jar 包含在 P 的 Eclipse“引用库”中,但不包含 A 的依赖项(因此也不包含 B)。
    【解决方案3】:

    我正在编写自己的解决方案/情况,因为其他答案都没有解决我的问题。

    就我而言,我的项目 (ME) 依赖于另一个项目 (LIB),而另一个项目 (LIB) 又依赖于另一个项目 (open-csv)。

    但是,我注意到 open-csv 的旧版本已经是我项目中的一个依赖项,这可能会迫使第二个库 (LIB) 使用这个旧版本的 open-csv 库,它不包含更新的LIB 使用的类。

    我通过在我的主项目依赖列表中更新open-csv 的版本解决了这个问题。

    【讨论】:

      【解决方案4】:

      在我的例子中,我忘记使用 -vm 参数启动 Eclipse,它应该指向 jdk/javaw.exe。

      即使在 Java EE 编程 5 年后,您仍然会犯新手错误...

      【讨论】:

      • 这不是一个答案,而是一个与问题没有明确关系的轶事。
      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2019-10-29
      • 2021-07-28
      相关资源
      最近更新 更多