Maven + Spring Boot:在类路径中发现了多次org.json.JSONObject:

时间:2018-10-25 01:28:25

标签: java spring maven spring-boot build-dependencies

运行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

6 个答案:

答案 0 :(得分:15)

添加到

 <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"
}

答案 1 :(得分:5)

为gradle项目添加以下行。

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

答案 2 :(得分:5)

背景org.json的效果很好,但有一些人不喜欢的许可条款(“该软件应用于善良,而非邪恶。”)。因此,Vaadin想使用该库,但无法确定他们有一天不会将其用于邪恶。相反,他们重新实现了该接口,发布了android-json并将其用作org.json的替代品。其他人也开始使用android-json,以使他们也不会受到不使用软件作恶的要求的束缚。

这是一个很好的解决方案,除了当两个库位于类路径上时它们会发生冲突。

解决方案: 如果从冲突的传递依赖项中得到此错误,那么最好的选择是排除Vaadin的android-json库(由Spring带来),或排除org.json库(由另一种依赖关系带来)。 Vaadin的版本旨在实现相同的实现,但是存在细微的差异。

如果您在代码中使用org.json,并且与Spring的Vaadin依赖项冲突,那么我建议您尝试open-json。这是Vaadin重新实现org.json的一部分,但是它们更改了软件包,因此您不会与org.json:jsoncom.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类正在使用的所有导入。

答案 3 :(得分:0)

这对我有用:

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

答案 4 :(得分:0)

根据已接受的答案为Kotlin DSL版本

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

答案 5 :(得分:0)

您可以从android-json中排除testImplementation模块。

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

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