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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:50:33