Maven + Spring Boot: обнаружено несколько экземпляров org.json.JSONObject на пути к классу:

Когда я запускаю mvn test, я получаю это предупреждение. Как я могу это исправить?

Found multiple occurrences of org.json.JSONObject on the class path:

        jar:file:/C:/Users/Chloe/.m2/repository/org/json/json/20140107/json-20140107.jar!/org/json/JSONObject.class
        jar:file:/C:/Users/Chloe/.m2/repository/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar!/org/json/JSONObject.class

You may wish to exclude one of them to ensure predictable runtime behavior

Вот мой pom.xml. Единственная ссылка на JSON -

    <!-- https://mvnrepository.com/artifact/org.json/json -->
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
    </dependency>

Apache Maven 3.5.3

Вы можете отказаться от своей зависимости от org.json, потому что он считается несвободным программным обеспечением. Spring Boot удалил свою зависимость от него из-за этого, но это иногда приводит к таким же конфликтам, как у вас.

Didier L 26.11.2019 17:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
57
1
24 103
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Добавить под

 <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>

Следующее исключение:

 <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.vaadin.external.google</groupId>
            <artifactId>android-json</artifactId>
        </exclusion>
    </exclusions>

Аналогично для проектов Gradle:

testCompile("org.springframework.boot:spring-boot-starter-test") {
    exclude group: "com.vaadin.external.google", module:"android-json"
}

Сообщалось ли об этой проблеме проекту Spring Boot? Я могу найти аналогичный билет на Spring Cloud, но ничего для Spring Boot. Кажется странным, что они (транзитивно) зависят от библиотеки, которая переупаковывает org.json:json.

Didier L 25.11.2019 17:16

github.com/spring-projects/spring-boot/issues/15967, связанный с @DidierL, решен как не хочу вносить никаких изменений в стартер.

user7294900 26.11.2019 07:16

Спасибо! Я немного углубился в это, и на самом деле это намного глубже. Фактически Spring Boot удалил зависимости от org.json, потому что это считается несвободной лицензией из-за оговорки о недопустимости злонамеренного использования.. Это также, по-видимому, вызывает некоторые проблемы с путем к модулю.

Didier L 26.11.2019 12:08

Конфликты пути к классам даже при использовании Spring-Boot-Starter ... как прискорбно!

Nico Van Belle 30.04.2020 16:45

Спасибо, что показали, как это делается для Gradle!

Clawdidr 18.08.2020 03:00

Большое спасибо за то, что показали версию gradle !!!

patrickw 12.05.2021 20:17

Добавьте следующую строку для проектов Gradle.

testCompile('org.springframework.boot:spring-boot-starter-test'){
        exclude group: "com.vaadin.external.google", module:"android-json"
}

Это сработало для меня:

configurations {
     testImplementation.exclude group: 'com.vaadin.external.google', module: 'android-json'
}

Спасибо, проблема решена

AlexPes 16.03.2021 17:56

Фон: org.json отлично работает, но в нем есть пункт лицензии, который некоторым не нравится («Программное обеспечение должно использоваться во благо, а не во зло»). Итак, Ваадин хотел использовать библиотеку, но не был уверен, что когда-нибудь они не воспользуются ею во зло. Вместо этого они повторно реализовали интерфейс, опубликовали android-json и использовали его как каплю замены для org.json. Другие также начали использовать android-json, чтобы они тоже не были связаны требованием не использовать свое программное обеспечение во зло.

Это прекрасное решение, за исключением того, что когда две библиотеки находятся в пути к классам, они сталкиваются.

Решение: Если вы получаете эту ошибку из-за конфликтующих транзитивных зависимостей, то лучше всего исключить либо библиотеку Vaadin android-json (введенную Spring), либо исключить библиотеку org.json (введенную другой зависимостью). Версия Ваадина должна быть идентичной реализацией, но есть небольшие отличия.

Если вы используете org.json в своем коде и он конфликтует с зависимостью Spring от Vaadin, я бы рекомендовал попробовать open-json. Это порт повторной реализации org.json от Vaadin, но они изменили пакеты, поэтому у вас не будет конфликтов с org.json:json или com.vaadin.external.google:android-json.

https://github.com/openjson/openjson

Добавить зависимость Gradle:

    implementation('com.github.openjson:openjson:1.0.12')

Или в Maven:

    <dependency>
        <groupId>com.github.openjson</groupId>
        <artifactId>openjson</artifactId>
        <version>1.0.12</version>
    </dependency>

Затем обновите любой импорт, который использовался классами org.json.

Спасибо, похоже, моя ошибка устранилась. 1 готов, 99 осталось.

ASH 26.01.2021 12:35

это должен быть принят ответ

Santh 27.08.2021 21:26

Версия Gradle kotlin DSL на основе принятого ответа

testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude (
                group = "com.vaadin.external.google",
                module = "android-json"
        )
    }

Вы можете исключить модуль android-json из testImplementation.

testImplementation('org.springframework.boot:spring-boot-starter-test') {

         exclude group: "com.vaadin.external.google", module:"android-json"
    
}

Ответ Gradle на вопрос Maven.

martijn p 20.11.2020 10:32

Другие вопросы по теме