Eclipse Maven依赖项中的冲突jar

时间:2013-09-11 19:22:31

标签: java eclipse maven dependencies classloader

我的Eclipse项目在运行时显示“Source not found”错误,当到达Problem中正在启动类TopLevelDebugClass.main()的新实例的行时。请注意,这只发生在Eclipse中,而不是在我以正常控制台模式运行应用程序时。

我已将问题缩小到两个Bouncy Castle导入语句,当它们与使用它们的代码一起删除时,可以消除问题。当我使用mvn dependency:tree分析Maven带入项目的依赖项列表时,我得到了以下内容:

[INFO] myGroupId:myArtifactId:jar:1.0-SNAPSHOT
[INFO] +- dpdncyGroupId:dpdncyArtifactId:jar:master:1.0-SNAPSHOT:compile
[INFO] |  +- org.apache.httpcomponents:httpclient:jar:4.0:compile
[INFO] |  |  +- org.apache.httpcomponents:httpcore:jar:4.0.1:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile
[INFO] |  +- org.bouncycastle:bcmail-jdk16:jar:1.45:compile
[INFO] |  +- org.bouncycastle:bcprov-jdk16:jar:1.45:compile
[INFO] |  \- com.google.code.jscep:api:jar:1.1.4:compile
[INFO] |     +- org.bouncycastle:bcprov-jdk15:jar:1.45:compile
[INFO] |     \- org.bouncycastle:bcmail-jdk15:jar:1.45:compile

其中myArtifactId对应于我正在尝试调试的Eclipse项目,其中TopLevelDebugClassdpdncyArtifactId对应于同一Eclipse工作区中的另一个项目(myArtifactId引用{ {1}},即)。

冲突的罐子是 bcprov-jdk16 / bcprov-jdk15 bcmail-jdk16 / bcmail-jdk15 。我验证了16版本集来自依赖项工件dpdncyArtifactId(顶层下面的第一个节点),而15版本集是jscep(底层)的依赖项。与上面的树列表一致,Eclipse项目的Maven依赖项列出了两组bcprov-jdk和bcmail-jdk,它们包含许多相同的类,其中包括导致问题的导入(pom.xmlorg.bouncycastle.jce.PKCS10CertificationRequest)。

我有理由相信这种歧义导致Eclipse内部的争用(但不是原生JRE),因为它不知道从哪两个jar加载类。

我可以在Eclipse中做些什么来解决这个争用,以便我可以在调试器中运行我的项目?如果这是Eclipse中当前无法解决的错误,那么也可以考虑如何解决Maven中的问题。

最后但并非最不重要的是,请注意我正在尝试加快环境速度。建筑变更建议是受欢迎的,但不是我正在寻找的答案,因为我还没有能够做出这样的改变。从本质上讲,这是由其他人构建的,我只是一个新手。

1 个答案:

答案 0 :(得分:1)

com.google.code.jscep:api的依赖项中,尝试使用exclusions节来阻止Maven引入bcprov-jdk15工件。请注意,这仅适用于您似乎在描述的情况,其中有人愚蠢地在多个工件中分配同名的类而不是正确版本化。