关于Java:Maven中的两个版本的库依赖

Two versions of library dependency in Maven

在我的pom.xml中我有

1
2
3
4
5
<dependency>
    <groupId>org.json</groupId>
    json</artifactId>
    <version>20170516</version>
</dependency>

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

1
import org.json.JSONObject;

当我放入

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

我得到

1
20170516

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

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

1
0.0.20131108.vaadin1

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

1
2
3
4
5
6
<dependency>
    <groupId>org.skyscreamer</groupId>
    jsonassert</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

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

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

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

和pom.xml

1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    spring-test</artifactId>
    <version>4.3.4.RELEASE</version>
</dependency>

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

即使几乎是山姆名字,我也不认为这是
* maven

中的两种依赖关系版本

-编辑1

1
2
3
4
5
6
7
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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    <dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>org.json</groupId>
        json</artifactId>
        <version>20170516</version>
        </dependency>
        <dependency>
            <groupId>org.skyscreamer</groupId>
            jsonassert</artifactId>
            <version>1.5.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    </dependencyManagement>

请参阅Maven中的dependencyManagement和依赖项之间的区别

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


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

并非所有Java依赖项都兼容,请参见类路径。

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

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
  <groupId>org.skyscreamer</groupId>
  jsonassert</artifactId>
  <version>1.5.0</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>com.vaadin.external.google</groupId>
      android-json</artifactId>
    </exclusion>
  </exclusions>
</dependency>