98 votes

Maven + Spring Boot : Il existe plusieurs occurrences de org.json.JSONObject dans le chemin des classes :

Quand je cours mvn test Je reçois cet avertissement. Comment puis-je le corriger ?

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

Voici mon pom.xml . La seule référence à JSON est

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

Apache Maven 3.5.3

1 votes

Vous voudrez peut-être abandonner votre dépendance à org.json car il est considéré comme un logiciel non libre. Spring Boot a supprimé sa dépendance à l'égard de ce dernier à cause de cela. mais cela entraîne parfois des conflits comme le vôtre.

181voto

user7294900 Points 16410

Ajouter sous

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

L'exclusion suivante :

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

De même, pour les projets Gradle :

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

0 votes

Ce problème a-t-il été signalé au projet Spring Boot ? Je peux trouver un billet similaire pour Spring Cloud mais rien pour Spring Boot. Il semble étrange qu'ils dépendent (de manière transitive) d'une bibliothèque qui reconditionne org.json:json .

0 votes

@DidierL related github.com/spring-projects/spring-boot/issues/15967 résolu comme ne veulent pas faire de changements dans le démarreur.

4 votes

Merci. Je me suis plongé un peu plus dans le sujet et en fait, c'est beaucoup plus profond que ça. En fait Spring Boot a supprimé les dépendances à org.json parce que elle est considérée comme une licence non libre en raison de la clause "not evil usage". . Cela cause également quelques problèmes avec le chemin du module apparemment.

38voto

Planky Points 1500

Contexte : org.json fonctionne très bien, mais possède une clause de licence que certaines personnes n'aiment pas ("Le logiciel doit être utilisé pour le bien, pas pour le mal"). Vaadin voulait donc utiliser la bibliothèque, mais ne pouvait pas être sûr de ne pas l'utiliser pour le mal un jour. Au lieu de cela, ils ont réimplémenté l'interface, publié android-json et l'a utilisé pour remplacer le org.json . D'autres ont commencé à utiliser android-json afin qu'eux aussi ne soient pas liés par l'obligation de ne pas utiliser leurs logiciels à des fins malveillantes.

C'est une bonne solution, sauf que lorsque les deux bibliothèques sont sur le classpath, elles entrent en collision.

Solution : Si vous obtenez cette erreur à cause de dépendances transitives conflictuelles, votre meilleure chance est d'exclure l'une ou l'autre des dépendances transitives de Vaadin. android-json (apporté par Spring), ou exclure la bibliothèque org.json (apportée par une autre dépendance). La version de Vaadin est censée être une implémentation identique, mais il existe des différences subtiles.

Si vous utilisez org.json dans votre code et qu'il entre en conflit avec la dépendance Vaadin de Spring, alors je vous recommande d'essayer open-json . Il s'agit d'un portage de la réimplémentation de Vaadin. org.json mais ils ont changé les paquets pour que vous n'ayez aucun conflit avec org.json:json o com.vaadin.external.google:android-json

https://github.com/openjson/openjson

Ajouter la dépendance de gradle :

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

Ou dans Maven :

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

Ensuite, mettez à jour toutes les importations qui étaient utilisées par org.json classes.

6 votes

Merci, cela semble avoir supprimé mon erreur. 1 de fait, 99 à faire.

4voto

Parthiban Points 136

Ajoutez la ligne ci-dessous pour les projets gradle.

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

3voto

Alex Stanovsky Points 230

Cela a marché pour moi :

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

0 votes

Merci, cela a réglé le problème

2voto

ihernandez Points 1

Vous pouvez exclure android-json module de testImplementation .

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

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

}

1 votes

Réponse de Gradle à une question de Maven.

0 votes

@martijnp stratégie d'exclusion entre maven et gradle sont - en principe - les mêmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X