我的项目P依赖于依赖关系A依赖于依赖关系B.我的项目的pom.xml文件包含A作为依赖关系,其jar包含在P的类路径中。但是,在P的运行时抛出NoClassDefFoundError
,这是因为缺少B罐。
Maven不应该自动下载这些依赖项吗?
答案 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编程,你仍然会犯下新手的错误......