Две версии зависимости от библиотеки в Maven - PullRequest
0 голосов
/ 20 декабря 2018

В моем 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

Хорошо, хорошо.(Примечание: это класс программы, а не тест!)

Теперь я запускаю свой Unittest (Mockito, JUnit) с mvn test.Я получаю ошибку, связанную с версией 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, я не думаю, что это дубликат * двух версий зависимостей в 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 голосов
/ 20 декабря 2018

вам нужно добавить зависимости, которые вы хотите использовать для конкретной версии, когда есть конфликт в dependencyManagement.Это гарантирует, что maven использует версию json зависимости 20170516, даже если 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>

См. Различия между зависимостьюManagement и зависимостями в Maven

или вы можете использовать <exclusions>, чтобы исключить дочернюю зависимость.

0 голосов
/ 20 декабря 2018

Если spring-test или jsonassert не затенят внутреннюю зависимость org.json:json в будущей версии, вам придется использовать одну версию org.json:json для пути к классам.

Не все зависимости Java совместимы, см. classpath hell .

Вы можете попробовать определить Исключение зависимости для проблемной версии, но это может потенциальнотормоз 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...