Gradle中解决com.google.http-client重复依赖及NoSuchMethodError问题
解决Groovy项目中Google HTTP Client依赖冲突导致的NoSuchMethodError错误
问题背景
在Groovy项目中调用Gmail API时遇到java.lang.NoSuchMethodError错误,排查发现com.google.http-client:google-http-client:1.42.1被多个子依赖作为传递依赖重复引入。原始的compileClasspath依赖树如下:
compileClasspath - Compile classpath for source set 'main'. +--- com.github.javafaker:javafaker:1.0.2 | +--- org.apache.commons:commons-lang3:3.5 | +--- org.yaml:snakeyaml:1.23 | \--- com.github.mifmif:generex:1.0.2 | \--- dk.brics.automaton:automaton:1.11-8 +--- com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0 | \--- com.google.api-client:google-api-client:2.0.0 | +--- com.google.oauth-client:google-oauth-client:1.34.1 | | +--- com.google.http-client:google-http-client:1.42.0 -> 1.42.1 | | | +--- org.apache.httpcomponents:httpclient:4.5.13 | | | | +--- org.apache.httpcomponents:httpcore:4.4.13 -> 4.4.15 | | | | +--- commons-logging:commons-logging:1.2 | | | | \--- commons-codec:commons-codec:1.11 | | | +--- org.apache.httpcomponents:httpcore:4.4.15 | | | +--- com.google.code.findbugs:jsr305:3.0.2 | | | +--- com.google.guava:guava:30.1.1-android -> 31.1-jre | | | | +--- com.google.guava:failureaccess:1.0.1 | | | | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava | | | | +--- com.google.code.findbugs:jsr305:3.0.2 | | | | +--- org.checkerframework:checker-qual:3.12.0 | | | | +--- com.google.errorprone:error_prone_annotations:2.11.0 | | | | \--- com.google.j2objc:j2objc-annotations:1.3 | | | +--- com.google.j2objc:j2objc-annotations:1.3 | | | +--- io.opencensus:opencensus-api:0.31.1 | | | | \--- io.grpc:grpc-context:1.27.2 | | | \--- io.opencensus:opencensus-contrib-http-util:0.31.1 | | | +--- io.opencensus:opencensus-api:0.31.1 (*) | | | \--- com.google.guava:guava:29.0-android -> 31.1-jre (*) | | +--- com.google.http-client:google-http-client-gson:1.42.0 -> 1.42.1 | | | +--- com.google.http-client:google-http-client:1.42.1 (*) | | | \--- com.google.code.gson:gson:2.9.0 | | \--- com.google.guava:guava:31.1-android -> 31.1-jre (*) | +--- com.google.http-client:google-http-client-gson:1.42.1 (*) | +--- com.google.guava:guava:31.1-jre (*) | +--- com.google.http-client:google-http-client-apache-v2:1.42.1 | | +--- com.google.http-client:google-http-client:1.42.1 (*) | | +--- org.apache.httpcomponents:httpclient:4.5.13 (*) | | \--- org.apache.httpcomponents:httpcore:4.4.15 | +--- org.apache.httpcomponents:httpcore:4.4.15 | +--- org.apache.httpcomponents:httpclient:4.5.13 (*) | \--- com.google.http-client:google-http-client:1.42.1 (*) \--- org.codehaus.groovy:groovy-all:2.4.7
当前build.gradle配置
plugins { id 'java' id "com.katalon.gradle-plugin" version "0.1.1" } repositories { mavenCentral() } dependencies { implementation 'com.github.javafaker:javafaker:1.0.2' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' }
尝试的错误解决方式
为消除重复依赖,尝试全局排除com.google.http-client:google-http-client:
configurations.all { exclude group: 'com.google.http-client', module: 'google-http-client' }
执行后compileClasspath中完全没有了该依赖:
compileClasspath - Compile classpath for source set 'main'. +--- com.github.javafaker:javafaker:1.0.2 | +--- org.apache.commons:commons-lang3:3.5 | +--- org.yaml:snakeyaml:1.23 | \--- com.github.mifmif:generex:1.0.2 | \--- dk.brics.automaton:automaton:1.11-8 +--- com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0 | \--- com.google.api-client:google-api-client:2.0.0 | +--- com.google.oauth-client:google-oauth-client:1.34.1 | | +--- com.google.http-client:google-http-client-gson:1.42.0 -> 1.42.1 | | | \--- com.google.code.gson:gson:2.9.0 | | \--- com.google.guava:guava:31.1-android -> 31.1-jre | | +--- com.google.guava:failureaccess:1.0.1 | | +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava | | +--- com.google.code.findbugs:jsr305:3.0.2 | | +--- org.checkerframework:checker-qual:3.12.0 | | +--- com.google.errorprone:error_prone_annotations:2.11.0 | | \--- com.google.j2objc:j2objc-annotations:1.3 | +--- com.google.http-client:google-http-client-gson:1.42.1 (*) | +--- com.google.guava:guava:31.1-jre (*) | +--- com.google.http-client:google-http-client-apache-v2:1.42.1 | | +--- org.apache.httpcomponents:httpclient:4.5.13 | | | +--- org.apache.httpcomponents:httpcore:4.4.13 -> 4.4.15 | | | +--- commons-logging:commons-logging:1.2 | | | \--- commons-codec:commons-codec:1.11 | | \--- org.apache.httpcomponents:httpcore:4.4.15 | +--- org.apache.httpcomponents:httpcore:4.4.15 | \--- org.apache.httpcomponents:httpclient:4.5.13 (*) \--- org.codehaus.groovy:groovy-all:2.4.7
但错误依然存在:
java.lang.NoSuchMethodError: com.google.api.client.http.HttpTransport.isMtls()Z at com.google.api.services.gmail.Gmail$Builder.chooseEndpoint(Gmail.java:11179) at com.google.api.services.gmail.Gmail$Builder.<init>(Gmail.java:11212) at com.signaturemd.utils.GmailQuickstart.GetLabels(GmailQuickstart.groovy:72) at com.signaturemd.utils.GmailQuickstart$GetLabels.call(Unknown Source) at SMDEmailUtils.run(SMDEmailUtils:6)
正确解决方案
核心原因
全局排除com.google.http-client:google-http-client是错误的——这个库是Google API客户端的核心依赖,HttpTransport.isMtls()方法就定义在该库中,完全移除会导致方法找不到。所谓的“重复引入”其实是Gradle自动做了版本统一(从1.42.0升级到1.42.1),本身不存在冲突问题,真正的问题可能是运行时类路径中存在更低版本的该库,或者之前的构建缓存残留。
解决方法
方法1:直接声明指定版本的依赖
在dependencies中显式引入com.google.http-client:google-http-client:1.42.1,Gradle会自动将所有传递依赖的版本统一为该版本:
dependencies { implementation 'com.github.javafaker:javafaker:1.0.2' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' // 显式声明,强制所有子依赖使用该版本 implementation 'com.google.http-client:google-http-client:1.42.1' }
方法2:使用Gradle版本强制策略
通过resolutionStrategy强制所有依赖使用指定版本:
configurations.all { resolutionStrategy.force 'com.google.http-client:google-http-client:1.42.1' } dependencies { implementation 'com.github.javafaker:javafaker:1.0.2' implementation 'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0' }
额外步骤
执行以下命令清理构建缓存,确保旧版本依赖不会残留:
./gradlew clean build
内容的提问来源于stack exchange,提问作者Mike Warren
相关产品推荐
相关产品推荐

