109

When I run mvn test I get this warning. How can I fix it?

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 

Here is my pom.xml. The only reference to JSON is

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

Apache Maven 3.5.3

3
  • 1
    You may want to drop your dependency to org.json because it is considered as non-free software. Spring Boot removed their dependency to it because of this but this sometimes results in conflicts like yours. Commented Nov 26, 2019 at 16:49
  • @DidierL is that still the case? github.com/stleary/JSON-java/blob/master/LICENSE it just says "public domain" Commented Oct 1, 2024 at 11:47
  • @wutzebaer the license has changed, but AFAICT the dependency didn’t come back in Spring, so you could maybe still have the conflict if you use it. Commented Oct 1, 2024 at 15:18

6 Answers 6

195

Add under

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

The following exclusion:

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

Similarly, for Gradle projects:

testCompile("org.springframework.boot:spring-boot-starter-test") { exclude group: "com.vaadin.external.google", module:"android-json" } 
Sign up to request clarification or add additional context in comments.

7 Comments

Has this issue been reported to the Spring Boot project? I can find a similar ticket for Spring Cloud but nothing for Spring Boot. It seems strange that they (transitively) depend on a library that repackages org.json:json.
@DidierL related github.com/spring-projects/spring-boot/issues/15967 resolved as don't want to make any changes to the starter.
Thanks! I dived a bit more into it and in fact it goes much deeper than that. In fact Spring Boot removed dependencies to org.json because it is considered as a non-free license due to the "not evil usage" clause. This is also causing some trouble with the module path apparently.
Classpath clashes even when using spring-boot-starter.. how unfortunate!
This worked for me on Spring Boot 2.6.3 with Gradle 7.3.3, but I had to delete the cached file for the warning to go away.
|
46

Background: org.json works great, but has a license clause that some people don't like ("The Software shall be used for Good, not Evil."). So Vaadin wanted to use the library, but couldn't be sure they wouldn't use it for evil someday. Instead, they re-implemented the interface, published android-json and used it as a drop in replacement for org.json. Others began to use android-json as well so that they too would not be bound by the requirement of not using their software for evil.

This is a fine solution, except that when the two libraries are on the classpath, they collide.

Solution: If you get this error from conflicting transitive dependencies, then your best bet is to exclude either Vaadin's android-json library (brought in by Spring), or exclude the org.json library (brought in by another dependency). Vaadin's version is meant to be an identical implementation, but there are subtle differences.

If you're using org.json in your code and it is conflicting with Spring's Vaadin dependency, then I would recommend trying open-json. It's a port of Vaadin's re-implementation of org.json, but they changed the packages so you won't have any conflicts with org.json:json or com.vaadin.external.google:android-json

https://github.com/openjson/openjson

Add gradle dependency:

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

Or in Maven:

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

Then update any imports that were being used by org.json classes.

2 Comments

Thanks, that seems to have removed my error. 1 down, 99 to go.
It's been some years and since 2022 the org.json lib is public domain.
5

This worked for me:

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

1 Comment

Thanks, it fixed the issue
3

Add the below line for gradle projects.

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

Comments

2

Gradle kotlin DSL version based on the accepted answer

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

Comments

2

You can exclude android-json module from testImplementation.

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

2 Comments

Gradle answer on a Maven question.
@martijnp exclusion strategy between maven and gradle are - in principal, the same.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.