OkHttp出现java.lang.NoSuchFieldError: Companion异常求助
OkHttp 出现
java.lang.NoSuchFieldError: Companion 异常的解决方案 问题背景
使用OkHttp 3.x和4.x版本时均触发以下异常:
Exception in thread "main" java.lang.NoSuchFieldError: Companion at okhttp3.internal.Util.<clinit>(Util.kt:72) at okhttp3.internal.concurrent.TaskRunner.<clinit>(TaskRunner.kt:309) at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:41) at okhttp3.ConnectionPool.<init>(ConnectionPool.kt:47) at okhttp3.OkHttpClient$Builder.<init>(OkHttpClient.kt:471)
已尝试显式添加Okio依赖但无效,内部依赖依赖OkHttp 4.9.0,无论是否在pom.xml中显式声明OkHttp版本(包括显式声明4.12搭配Okio 3.6.0),都会触发该异常。
排查与解决步骤
- 强制统一依赖版本:该异常核心原因是OkHttp与Okio版本不兼容,或存在多版本依赖冲突。通过
<dependencyManagement>锁定OkHttp和Okio的兼容版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>3.6.0</version> </dependency> </dependencies> </dependencyManagement> - 排查依赖树:执行
mvn dependency:tree命令,查看是否有其他依赖间接引入了低版本或不兼容的OkHttp/Okio,找到后针对性排除。 - 清理本地仓库:删除本地Maven仓库中OkHttp和Okio的缓存目录(路径一般为
~/.m2/repository/com/squareup/okhttp3和~/.m2/repository/com/squareup/okio),再执行mvn clean install重新拉取依赖。 - 统一Kotlin版本:OkHttp 4.x基于Kotlin开发,若项目Kotlin版本与OkHttp依赖的版本差异过大,也会引发此类字段找不到的问题。可通过Kotlin BOM统一版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-bom</artifactId> <version>1.8.22</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 排除内部依赖的冲突包:如果内部依赖引入的OkHttp 4.9.0与你声明的版本冲突,在内部依赖的配置中添加排除规则:
<dependency> <groupId>你的内部依赖groupId</groupId> <artifactId>你的内部依赖artifactId</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </exclusion> <exclusion> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者janani
相关产品推荐
相关产品推荐

