我的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
答案 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-test
或jsonassert
会在内部屏蔽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>