引入依赖性会破坏现有依赖性吗

时间:2014-03-26 18:54:19

标签: java maven junit intellij-idea

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

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

Maven似乎解决了这个问题并将其全部纳入(我使用的是Intellij,它现在出现在&#39; Devendencies&#39;&#39; Maven Projects&#39;&#39; Maven Projects&#39; ;选项卡,以及项目选项卡中的外部库&#39;。

但是,当我带来这种依赖关系时,IDE无法找到它(例如,如果我使用import net.sourceforge.jwebunit.junit.WebTester,它就无法找到它。)

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

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

我常常在带来新的依赖关系时看到有关依赖关系版本收敛的错误,我觉得要追逐这个&#39;没有找到类定义&#39;错误可能是一个红色的鲱鱼,但我不确定Maven中可能导致它的一般类型的问题。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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