当前位置: 首页 > 知识库问答 >
问题:

Gradle插件的传递依赖干扰和破坏构建

谯嘉懿
2023-03-14
root/
 build.gradle.kts loads kotlin("jvm")
 services/
   my-service/
     rest/
       build.gradle.kts loads id("com.google.cloud.tools.jib")

(有更多的模块,文件等,但这些是相关的。)

生成失败:

$ ./gradlew clean jibDockerBuild
...
* What went wrong:
Execution failed for task ':services:driver:rest:jibDockerBuild'.
> com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: 'org.apache.http.client.config.RequestConfig$Builder     
org.apache.http.client.config.RequestConfig$Builder.setNormalizeUri(boolean)'

我发现了这个问题:Kotlin和JIB插件都对org.apache.httpcomponents:httpclient有传递依赖性:Kotlin需要4.5.3和JIB 4.5.10。问题是,在这个项目中,安装程序只加载了4.5.3,并且由于新方法不可用,JIB失败了。可以使用./gradlew buildenv检查这一点。

我找到了一个解决办法,我需要在根级别加载两个插件(哪一个首先似乎是不相关的)在主梯度文件;现在./Gradlew Buildenv显示使用了更高依赖的版本,也用于Kotlin(输出缩短且不完整):

classpath
+--- org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.3.61
|    \--- org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61
|         +--- de.undercouch:gradle-download-task:3.4.3
|         |    \--- org.apache.httpcomponents:httpclient:4.5.3 -> 4.5.10

它可以在这种情况下工作,但可能是新的库版本破坏了Kotlin插件。问题是插件和它们的依赖关系在类路径上没有分离,这在Jigsaw等之前的Java上是正常的,有什么方法可以让Gradle能够分离依赖关系,以便每个插件使用它声明的版本吗?我是在Java11上构建的,所以模块系统可以被利用,但是Gradle有打开它的选项吗?

编辑:更新到Kotlin 1.3.70也修复了这个问题,因为它不再依赖于库了。不过,一般的问题仍然有效。

共有1个答案

叶俊郎
2023-03-14

Gradle有什么方法可以分离依赖关系,以便每个插件都使用它声明的版本

没有。

所有插件共享相同的构建脚本配置:类路径

buildscript {
    configurations {
        classpath {
            resolutionStrategy {
                force("org.apache.httpcomponents:httpclient:4.5.10")
            }
        }
    }
}

这只是控制构建脚本依赖项的依赖项解析的许多方法之一。您还可以使用一个平台来提供关于依赖版本的建议:

buildscript {
    dependencies {
        classpath(enforcedPlatform("org.springframework.boot:spring-boot-dependencies:2.2.5.RELEASE"))
    }
}

有关更多信息,请参阅文档:

  • https://docs.gradle.org/current/userguide/resolution_rules.html
  • https://docs.gradle.org/current/userguide/platforms.html
 类似资料:
  • 我在Scala项目中使用了官方的Gatling Gradle插件,我发现了一个问题,其中包含了依赖项,如 不包括可传递依赖项。也就是说,我有一个Gatling模拟类,它扩展了中的一个类,而依赖于这个类。但是,当我尝试运行模拟时,会出现如下错误 当我查看Gradle依赖时,我将视为的依赖项。我的IDE(IntelliJ)在点击代码时也能识别它。 我试着在一页文档中搜索这个插件,但是我没有看到任何有用

  • 我有一个巨大的java多模块应用程序,它使用gradle来管理构建和依赖关系。在其中一个模块中,假设模块1项目使用gretty插件 模块1/构建。格拉德尔 gretty对 我想将logback版本升级到最新版本。为此,我尝试了以下解决方案 但这些都不会对logback版本产生任何影响。现在需要一些建议吗

  • 首先,很抱歉我不得不用伪代码来展示这个问题,因为原始库代码是封闭源代码,整个构建过程稍微复杂一点。 问题如下: 我们有一个项目a,它使用了一个内部库B。这个库使用了几个opensource库,我们现在称之为C和D。 出于调试的目的,我希望创建项目a的一个分级复合构建,其中包括使用的库B。 项目A:安置。梯度 项目A在其构建中包括库B。Gradle: 库B有C和D作为依赖项。D有自己的存储库,C在M

  • 在应用中,您希望使用不同的类来处理不同的任务以保持代码的简洁。我们把这些类称为 依赖。如何将这些依赖关系传递给将在后台任务调用的方法呢? 当您在后台任务中调用静态方法时,仅限于应用程序的静态上下文,这需要您使用以下获取依赖关系的模式: 通过 new 手动实例化依赖 服务定位器模式 抽象工厂模式 或 建设者模式 单例模式 然而,所有这些模式使您的应用程序的单元可测试性方面变得非常复杂。为了解决这个问

  • 我有一个具有以下依赖结构的gradle项目: 这是由Jersey和ASM4.1之间的不兼容性引起的(Jersey使用3.3.1,它具有不同的组id),这是从另一个模块提取的传递依赖项。 顺便说一句,我知道Idea13有更好的Gradle集成,但是(a)我们有12的许可证,而且不会很快升级整个开发团队;(b)Idea13在多语Gradle项目(Java/Scala)方面仍然存在一些问题,所以它不符合

  • 我刚刚将我的项目升级到gradle 7,并且遇到了缺失的可传递依赖项。我试着改变我的身材。gradle文件在依赖项中使用“api”,但这并没有修复它。 projectA依赖于projectB,projectB依赖于projectC。 projectA-build。格拉德尔 projectB-构建。格拉德尔 ProjectA编译良好,但有运行时错误-从project ectC获取类的ClassNot