首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Gradle中包含的依赖项中排除传递的com.google.http-client:google-http-client:1.42.1子依赖项

从Gradle中包含的依赖项中排除传递的com.google.http-client:google-http-client:1.42.1子依赖项
EN

Stack Overflow用户
提问于 2022-10-01 22:13:12
回答 1查看 176关注 0票数 0

我面对的是这个在我的Groovy项目中,而且基本上可以归结为存在一些传递的大子依赖关系,它被包含在多个子依赖项中(下面是compileClasspath):

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
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'
}

注意,在不同的子依赖项中存在多个实例。

我试图通过以下方式消除那些传递的依赖关系:

代码语言:javascript
复制
configurations.all { 
    exclude group: 'com.google.http-client', module: 'google-http-client' 
}

但是我的compileClasspath看起来像:

代码语言:javascript
复制
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

在任何地方都没有com.google.http-client:google-http-client:1.42.1的实例!它也不能解决错误。

代码语言:javascript
复制
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:1.42.1实例,并且这个错误消失了?

EN

回答 1

Stack Overflow用户

发布于 2022-10-02 11:24:14

当你说依赖的“多个实例”时,你的意思是什么?我假设您在依赖关系图中看到同一个依赖项的多个版本而感到困惑。

但是,这与将多少物理实例(jar文件)打包到您自己产生的工件中没有任何关系。在由Gradle或Maven管理的结果工件中,总是只有一个物理实例。但是,如果依赖关系图中有多个不同版本的同一依赖项,则它们都会根据需要选择最合适的one物理实例的版本:

在冲突的情况下,Gradle默认使用最新的冲突版本。

依赖中介--这决定了当遇到多个版本作为依赖项时,将选择哪个版本的工件。Maven选择“最近的定义”。也就是说,它使用依赖树中与项目最接近的依赖项的版本。始终可以通过在项目的POM中显式声明版本来保证版本。请注意,如果两个依赖关系版本在依赖树中处于相同的深度,则第一个声明将获胜。

你可以推翻那个版本。因此,如果是Gradle,而不是从任何地方排除依赖关系的configuration.all { exclude {...} },您可以尝试像这样配置resolutionStrategy

代码语言:javascript
复制
configuration.all {
  resolutionStrategy {
    force "com.google.http-client:google-http-client:1.42.1"
  }
}

这将(从下面的文档中摘录):

允许强制某些版本的依赖项,包括传递依赖项。

这就是你最初的问题所需要的。显然,您不想排除依赖关系,而是希望强制执行它的特定版本。

要获得更多信息,您可以参考官方文档:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73922100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档