Maven中两个版本的库依赖

时间:2018-12-20 15:12:48

标签: java maven

我的pom.xml中有

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20170516</version>
</dependency>

我的程序需要并使用JSON版本。

import org.json.JSONObject;

当我放入

final JsonObject jsonObject = new JsonObject();
System.out.println( jsonObject.getClass().getPackage().getImplementationVersion());

我知道

20170516

好的,好的。 (注意:这是程序的类,而不是测试!)

现在,我使用mvn test运行单元测试(Mockito,JUnit)。我收到一个错误,该错误与JSONObject版本有关。日志显示:

0.0.20131108.vaadin1

我发现,此版本来自此依赖项

<dependency>
    <groupId>org.skyscreamer</groupId>
    <artifactId>jsonassert</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

如果我删除它,我的测试可以正常工作。

但是现在其他测试失败了,它使用了这种依赖性

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

和pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.4.RELEASE</version>
</dependency>

如何配置Maven,使程序使用JSON版本20170516,但是spring-test仍然可以使用jsonassert?

即使几乎是山姆名字,我也不认为这是 * two versions of dependencies in maven

-编辑1

mvn dependency:tree | grep json 
[INFO] +- org.skyscreamer:jsonassert:jar:1.5.0:test 
[INFO] |  \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test 
[INFO] +- com.jayway.jsonpath:json-path-assert:jar:2.2.0:test 
[INFO] |  +- com.jayway.jsonpath:json-path:jar:2.2.0:test 
[INFO] |  |  \- net.minidev:json-smart:jar:2.2.1:test 
[INFO] +- org.json:json:jar:20170516:compile

2 个答案:

答案 0 :(得分:3)

dependencyManagement中发生冲突时,您需要添加要实施特定版本的依赖项。即使json依赖于不同版本,这也可以确保maven使用jsonassert依赖的20170516版本。

    <dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20170516</version>
        </dependency>
        <dependency>
            <groupId>org.skyscreamer</groupId>
            <artifactId>jsonassert</artifactId>
            <version>1.5.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    </dependencyManagement>

请参阅Differences between dependencyManagement and dependencies in Maven

,或者您可以使用<exclusions>排除子依赖项。

答案 1 :(得分:2)

除非在将来的版本中spring-testjsonassert会在内部屏蔽org.json:json依赖性,否则您将不得不在类路径中使用org.json:json的一个版本。

并非所有Java依赖项都兼容,请参见classpath hell

您可以尝试为有问题的版本定义Dependency Exclusion,但这可能会破坏jsonassert的依赖性:

<dependency>
  <groupId>org.skyscreamer</groupId>
  <artifactId>jsonassert</artifactId>
  <version>1.5.0</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>com.vaadin.external.google</groupId>
      <artifactId>android-json</artifactId>
    </exclusion>
  </exclusions>
</dependency>