首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maven中的库依赖的两个版本

Maven中的库依赖的两个版本
EN

Stack Overflow用户
提问于 2018-12-20 23:12:48
回答 2查看 685关注 0票数 1

在我的pom.xml

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20170516</version>
</dependency>

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

代码语言:javascript
运行
复制
import org.json.JSONObject;

当我输入的时候

代码语言:javascript
运行
复制
final JsonObject jsonObject = new JsonObject();
System.out.println( jsonObject.getClass().getPackage().getImplementationVersion());

我得到了

代码语言:javascript
运行
复制
20170516

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

现在我用mvn test运行我的单元测试(Mockito,JUnit)。我得到一个错误,它与JSONObject版本相关。日志上写着:

代码语言:javascript
运行
复制
0.0.20131108.vaadin1

我发现,这个版本来自于这个依赖

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.skyscreamer</groupId>
    <artifactId>jsonassert</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

如果我删除它,我的测试就能正常工作。

但是现在其他测试失败了,这些测试使用了这个依赖项

代码语言:javascript
运行
复制
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

在pom.xml中

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-20 23:19:26

除非spring-testjsonassert会在未来的版本中对org.json:json依赖进行内部遮蔽,否则您将不得不跨类路径使用一个版本的org.json:json

并不是所有的Java依赖都是兼容的,请参见classpath hell

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

代码语言:javascript
运行
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2018-12-20 23:20:16

dependencyManagement中存在冲突时,您需要添加要强制执行特定版本的依赖项。这确保了maven使用20170516版本的json依赖,即使jsonassert依赖于不同的版本。

代码语言:javascript
运行
复制
    <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>来排除子依赖项。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53871333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档