【发布时间】:2020-07-10 04:24:44
【问题描述】:
我的项目 P 依赖于依赖项 A,而依赖项 A 又依赖于依赖项 B。我的项目的 pom.xml 文件包含 A 作为依赖项,并且它的 jar 包含在 P 的类路径中。但是,在 P 的运行时抛出了一个NoClassDefFoundError,它源于缺少 B jar。
Maven 不应该自动下载这些依赖项吗?
【问题讨论】:
标签: maven-2 dependencies
我的项目 P 依赖于依赖项 A,而依赖项 A 又依赖于依赖项 B。我的项目的 pom.xml 文件包含 A 作为依赖项,并且它的 jar 包含在 P 的类路径中。但是,在 P 的运行时抛出了一个NoClassDefFoundError,它源于缺少 B jar。
Maven 不应该自动下载这些依赖项吗?
【问题讨论】:
标签: maven-2 dependencies
我的项目 P 依赖于依赖项 A [具有编译范围],它依赖于依赖项 B [具有编译范围]。
除非 B 是 A 的 optional dependency,否则 B 应该是具有“compile(*)”范围的 P 的依赖项(请参阅 Dependency Scope 的表并阅读注释),因此应该在运行时可用。
但是,在 P 的运行时会抛出 NoClassDefFoundError,这源于缺少 B jar。
由于您是在 Eclipse 下运行项目,因此已为您设置了类路径,因此我将排除此级别的错误。这给我们留下了可选依赖的情况。
PS:调查此类问题的一个非常有用的工具是dependency:tree。
【讨论】:
dependency:tree也支持filtering。
如果此依赖项 A 具有 compile 范围 - 当然,它应该已被下载并且更多 - 在项目的类路径中可用。但如果它具有 provided 范围,情况就会如此,因为 Maven 不会将提供的 deps 与应用程序打包在一起。
顺便说一句,您是如何运行这个项目的 - 没有以正确的方式运行也可能导致此类问题,这是一个很好的猜测。例如 - 如果你使用 maven exec plugin - maven 会为你正确设置类路径,但否则 - 你应该自己设置它(或使用 assembly plugin 构建一个具有依赖关系的 jar)。
【讨论】:
mvn eclipse:clean eclipse:eclipse 生成元数据。然后 A 的 jar 包含在 P 的 Eclipse“引用库”中,但不包含 A 的依赖项(因此也不包含 B)。
我正在编写自己的解决方案/情况,因为其他答案都没有解决我的问题。
就我而言,我的项目 (ME) 依赖于另一个项目 (LIB),而另一个项目 (LIB) 又依赖于另一个项目 (open-csv)。
但是,我注意到 open-csv 的旧版本已经是我项目中的一个依赖项,这可能会迫使第二个库 (LIB) 使用这个旧版本的 open-csv 库,它不包含更新的LIB 使用的类。
我通过在我的主项目依赖列表中更新open-csv 的版本解决了这个问题。
【讨论】:
在我的例子中,我忘记使用 -vm 参数启动 Eclipse,它应该指向 jdk/javaw.exe。
即使在 Java EE 编程 5 年后,您仍然会犯新手错误...
【讨论】: