Gradle项目依赖包冲突:org.json版本致JSONTokener运行时错误
解决Gradle项目中org.json版本冲突问题
嘿,这个问题我之前帮好几个开发者解决过——本质就是依赖冲突导致的类加载优先级问题:你的项目里同时存在两个版本的org.json,编译时Gradle能找到新版的类,但运行时JVM先加载了com.test.myapi内置的旧版,所以调用新构造方法就报错了。别慌,按下面的步骤来就能搞定:
1. 排除依赖包中的旧版org.json
首先要做的就是把com.test.myapi:1.0.1里带的旧版org.json给排除掉,不让它混入你的最终产物。修改你的build.gradle(或build.gradle.kts)文件:
Groovy DSL 写法:
dependencies { implementation('com.test.myapi:1.0.1') { // 排除该依赖内置的org.json模块 exclude group: 'org.json', module: 'json' } // 引入你需要的最新版org.json(替换成你实际要用的版本号) implementation 'org.json:json:20240303' }
Kotlin DSL 写法:
dependencies { implementation("com.test.myapi:1.0.1") { exclude(group = "org.json", module = "json") } implementation("org.json:json:20240303") // 替换为最新版本号 }
2. 验证依赖树,确认冲突已解决
改完依赖后,一定要验证一下旧版org.json是不是真的被排除了。执行下面的Gradle命令:
./gradlew dependencies --configuration implementation
在输出结果里搜索org.json,正常情况下应该只能看到你刚引入的最新版本,找不到任何来自com.test.myapi的旧版本条目。
3. 清理缓存,避免打包残留
如果排除依赖后还是报错,大概率是构建缓存或者打包残留搞的鬼。试试执行下面的命令彻底清理后重新构建:
./gradlew clean build --no-build-cache
同时可以检查一下生成的jar/tgz包,确认里面只包含你引入的新版org.json文件。
4. 备选方案:调整类加载顺序(仅极端情况用)
如果上面的方法都不管用(比如com.test.myapi是直接把org.json的类编译到自己的jar里,不是通过依赖引入的),那只能用类加载优先级调整的hack方案了——让JVM优先加载你引入的新版org.json。不过这个方法不推荐,尽量优先用排除依赖的方式。
启动时添加JVM参数:
java -Xbootclasspath/p:/path/to/your/latest/org.json.jar -jar your-project.jar
或者在Gradle的application插件里配置:
application { applicationDefaultJvmArgs = ["-Xbootclasspath/p:${configurations.runtimeClasspath.find { it.name.startsWith('json-') }.absolutePath}"] }
注意:
-Xbootclasspath/p在Java 9+已经被废弃,替代的--patch-module操作更复杂,所以不到万不得已别用这个方案。
内容的提问来源于stack exchange,提问作者gabi
相关产品推荐
相关产品推荐

