You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:24:07