【问题标题】:Conflicting jars in Eclipse Maven DependenciesEclipse Maven 依赖项中的 jar 冲突
【发布时间】:2013-09-12 03:34:55
【问题描述】:

当到达Problem 类的新实例在TopLevelDebugClass.main() 中启动的行时,我的Eclipse 项目在运行时出错,显示“找不到源”。请注意,这只发生在 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 引用 dpdncyArtifactId,即)。

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

我有理由相信这种模棱两可导致了 Eclipse(但不是本机 JRE)内部的争用,因为它不知道从两个 jar 中的哪一个加载类。

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

最后但并非最不重要的一点是,请注意,我正在从事一项新工作,试图跟上环境的步伐。欢迎提出架构更改建议,但不是我正在寻找的答案,因为我还没有能力进行此类更改。本质上,这是由其他人设计的,而我只是一个新手。

【问题讨论】:

    标签: java eclipse maven dependencies classloader


    【解决方案1】:

    在您对com.google.code.jscep:api 的依赖项中,尝试使用exclusions 节来阻止Maven 拉入bcprov-jdk15 工件。请注意,这仅适用于您所描述的情况,即有人愚蠢地将同名的类分布在多个工件中,而不是正确地进行版本控制。

    【讨论】:

    • 谢谢。为什么在用完常规控制台 vs Eclipse 时不会破坏运行时?
    • 什么不是“破坏运行时”,“破坏”是什么意思?
    • 当我在 Linux 终端和 Eclipse 中独立运行应用程序时
    • @amphibient 我还是不知道你在问什么。
    • OK...当我从 Linux 命令行运行主类时,争用不会表现出来,即类加载正常。当我在 Eclipse 中运行它时,会发生“找不到源”。看起来 Eclipse 与 Maven 一起工作的方式是问题所在。 IOW,这个问题只出现在 Eclipse 中,而不会出现在其他执行模式中,例如命令行。
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 2013-06-24
    • 1970-01-01
    • 2014-02-24
    • 2017-09-25
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多