Maven的。传递依赖

时间:2010-05-26 17:17:36

标签: maven-2 dependencies

我的项目P依赖于依赖关系A依赖于依赖关系B.我的项目的pom.xml文件包含A作为依赖关系,其jar包含在P的类路径中。但是,在P的运行时抛出NoClassDefFoundError,这是因为缺少B罐。

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

4 个答案:

答案 0 :(得分:23)

  

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

除非B是A的optional dependency,否则B应该是P的依赖关系,具有“编译(*)”范围(参见Dependency Scope表并阅读说明),因此应该是在运行时可用。

  

但是,在P的运行时抛出NoClassDefFoundError,这是因为缺少B罐。

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

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

答案 1 :(得分:2)

如果此依赖关系A具有编译范围 - 当然,它应该已经下载,并且在项目的类路径中可以使用更多。但如果它具有提供范围,那么由于提供的deps不会与Maven的应用程序一起打包。

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

答案 2 :(得分:0)

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

在我的情况下,我的项目(ME)依赖于另一个项目(LIB),而另一个项目(open-csv)也依赖。

但是,我注意到open-csv的较早版本已经在我的项目中,因此这可能迫使第二个库(LIB)使用此较旧的open-csv库,其中不包含LIB使用的较新的类。

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

答案 3 :(得分:-1)

在我的情况下,我忘了使用-vm参数启动Eclipse,该参数应指向jdk / javaw.exe。

即使经过5年的Java EE编程,你仍然会犯下新手的错误......