Java17+OkHttp4.9.3出现NoClassDefFoundError:okio/Buffer问题求助
这个NoClassDefFoundError: okio/Buffer异常本质是模块系统下的依赖访问权限或依赖传递问题,结合你的配置,问题出在两个核心点:
1. 重复的Okio依赖导致模块冲突
你同时添加了okio-3.3.0和okio-jvm-3.3.0依赖,这两个是Okio针对JVM平台的重复发布(Okio 3.x的多平台库中,okio包已经包含完整的JVM变体)。重复依赖会导致模块路径中出现两个同名模块,JVM无法正确加载Okio的类文件。
解决: 删除implementation ':okio-jvm-3.3.0',只保留implementation ':okio-3.3.0'(建议使用完整Maven坐标com.squareup.okio:okio:3.3.0,避免本地依赖的路径或版本匹配问题)。
2. Module-info缺少依赖传递声明
在JPMS模块系统中,requires关键字默认不会传递依赖。即使你的模块显式声明了requires okio;,OkHttp模块自身可能因无法正确解析到Okio模块的依赖链路,导致初始化时找不到okio/Buffer类。
解决: 在module-info.java中修改OkHttp的依赖声明,添加transitive关键字,让OkHttp的依赖(包括Okio、Kotlin标准库)自动传递到你的模块:
module your.module.name { requires transitive okhttp3; requires okio; requires kotlin.stdlib; }
这个配置会确保OkHttp模块自身能加载所需的依赖类,同时也让你的模块无需重复声明OkHttp的间接依赖。
额外验证点
确保你使用的OkHttp 4.9.3和Okio 3.3.0 jar包是带有module-info.java的正式模块化版本(如果是本地jar,可解压检查是否包含module-info.class文件)。
内容的提问来源于stack exchange,提问作者Thomas

