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

41106 次浏览

加在下面

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

为分级项目添加下面一行。

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

背景资料 : org.json工作得很好,但有一个许可条款,有些人不喜欢(“软件应该用于好的,而不是邪恶。”).所以瓦丁想用这个图书馆,但不确定他们是否有一天会用它来作恶。相反,他们重新实现了接口,发布了 android-json,并将其用作 org.json的替代品。其他人也开始使用 android-json,这样他们也不会被不使用他们的软件作恶的要求所束缚。

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

解决方案: 如果从冲突的传递依赖关系中得到这个错误,那么最好的办法是排除 Vaadin 的 android-json库(由 Spring 引入) ,或者排除 org.json库(由另一个依赖关系引入)。Vaadin 的版本是一个完全相同的实现,但是有一些细微的差别。

如果您在代码中使用 org.json,并且它与 Spring 的 Vaadin 依赖关系有冲突,那么我建议尝试使用 open-json。这是 Vaadin 重新实现 org.json的一个港口,但是他们改变了包,所以你不会与 org.json:json或者 com.vaadin.external.google:android-json有任何冲突

Https://github.com/openjson/openjson

增加等级依赖:

    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类使用的任何导入。

基于公认答案的 Gradle kotlin DSL 版本

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

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

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


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

}