【问题标题】:Two versions of library dependency in MavenMaven中两个版本的库依赖
【发布时间】:2018-12-20 15:12:48
【问题描述】:

在我的pom.xml 我有

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

我的程序需要并使用这个版本的 om 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?

即使几乎是 sam 的名字,我不认为这是重复的 * 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

【问题讨论】:

  • "如何配置 maven,程序使用 JSON 版本 20170516,但 spring-test 仍然可以使用 jsonassert" maven dependency scope 你在找什么?您可以在测试中使用某些版本,在编译和构建中使用其他版本。
  • 不,这没有帮助。正如我所写,使用新版本 JsonObject 的关键点是在类中,而不是在该类的测试中。

标签: java maven


【解决方案1】:

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

    <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

或者您可以使用&lt;exclusions&gt; 排除子依赖项。

【讨论】:

  • 我从 中删除了这两个并将您的代码放在 下,但现在我得到了很多错误。
  • 您不应该从dependencies 中删除上述内容。您应该保留它们,并且还需要将它们包含在 dependencyManagement 中。
【解决方案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>

【讨论】:

  • A 添加了此排除项,但我仍然在测试上下文中获得 JSON 的 0.0.20131108.vaadin1 版本。
  • mvn dependency:tree 你必须排除每一个。请注意,这可能是个坏主意,图书馆可能会刹车。
  • @Paflow 更新了答案,排除应与工件 groupIdartifactId 匹配。
  • 成功了。由于 JSONAssert 的用法很清楚(所有使用 mockMvc 的测试),我想我可以冒险。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2020-07-26
  • 2019-01-24
  • 2016-10-02
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多