【问题标题】:Introducing dependency breaks existing dependency?引入依赖会破坏现有的依赖?
【发布时间】:2014-03-26 18:54:19
【问题描述】:

我正在开发一个可以很好地构建和部署的项目。我正在尝试添加一些使用 JWebUnit 的代码,并使用以下 Maven 代码将其引入:

<dependency>
    <groupId>net.sourceforge.jwebunit</groupId>
    <artifactId>jwebunit-htmlunit-plugin</artifactId>
    <version>3.2</version>
    <scope>test</scope>
</dependency>

Maven 似乎很好地解决了这个问题,它把所有东西都带进来了(我正在使用 Intellij,它现在出现在“Maven 项目”选项卡的“依赖项”下,也出现在“项目”选项卡的“外部库”下)。

但是,当我引入此依赖项时,IDE 无法找到它(例如,如果我使用 import net.sourceforge.jwebunit.junit.WebTester,它就找不到它)。

但更大的问题是它实际上破坏了一些现有代码——我有一些使用 org.apache.commons.httpclient.HttpClient 的 JUnit 测试,现在在 Maven 的安装目标上我得到一个 NoClassDefFoundError - Could not initialize class 用于该课程。

如果我删除 JWebUnit 依赖项,Maven 安装目标将成功退出。

我习惯于在引入新依赖项时看到有关依赖项版本收敛的错误,我觉得追逐这个“没有找到类定义”错误可能是一个红鲱鱼,但我不确定问题的一般类型在 Maven 中可能会导致它。

编辑:拉入HttpClient的依赖代码是:

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

【问题讨论】:

    标签: java maven junit intellij-idea


    【解决方案1】:

    jwebunit-htmlunit-plugin 包含传递依赖项,它们似乎与您的某些依赖项冲突(可能是因为它们是不同的版本)。

    Maven 将类路径优先级放在前面声明的工件上。尝试将 jwebunit 移动到依赖项部分的末尾,或者至少在您拉入 httpclient 类之后。或者,您可以手动排除某些传递依赖项,但这可能很乏味。

    至于您的 IDE 不允许在库中导入,请记住您已在 test 范围内声明了此内容。生产类看不到 test 依赖项。

    【讨论】:

    • 好建议,因为我之前实际上遇到过由依赖顺序引起的问题;但是,在这种情况下,尝试将新依赖项放在开头(它是在结尾开始)似乎没有帮助。该项目的 pom 结构也非常简单——只有一个 pom——所以除了这个 pom 中的内容之外,不应该有任何其他内容被拉入。 (除非将它放在某些依赖项之间可能会有所帮助?)
    • @user3183922:您能否更新您的问题以显示 httpclient 的 Maven GAV?作为参考,jwebunit 引入了 htmlunit,它引入了 httpclient 4.3.2。
    • @user3183922:IntelliJ 的 Maven->Show Dependencies... 在那里非常有用。它向您显示传递依赖关系树,您可以使用 CTRL-F 搜索您要查找的内容。
    • 更新问题;幸运的是,它很容易识别。
    • 这变得很困难,因为您实际上正在查看主要版本差异...您可以尝试从 jwebunit-htmlunit-plugin 中排除 httpclient,但它可能与 3.1 不兼容。在一天结束时,您的测试使用一个简单的类加载器运行,该类加载器具有类路径优先级。它不像 OSGi,你可以让重复的类在它们自己的类加载器中运行沙盒。老实说,对您来说最简单的事情可能是将您的代码更新为 httpclient 4.3.2。
    猜你喜欢
    • 2019-12-29
    • 2013-08-05
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多