有没有办法用文件系统中的另一个替换 Gradle 依赖项?

Is there a way to replace a Gradle dependency with another one from the filesystem?

我在受限环境中有一个遗留项目。我们发现第三方 OSS 库存在问题,已分叉并修复它。但是,这个其他工具期望工件的路径与硬编码到工件中的路径完全相同(它还期望它作为依赖项位于类路径上)。所以,dependencies 看起来有点像这样:

dependencies {
    compile group: 'org.foo', name: 'bar', version: '1.2.3', configuration: 'runtime'
}

其中 org.foo:bar:1.2.3 是我们需要修补的工件。

是否可以在其工件坐标保持不变的情况下覆盖此依赖项,但向其添加类似 files 部分的内容?如果是这样,如何?可以使用模块替换来完成吗?

我们使用的是 Gradle 的旧版本 -- 4.10.x.

虽然为 OSS 库提供修复应该是您的最终目标,但您可以通过以下方式解决此问题:

  • 将补丁文件添加到 <root>/org/foo/bar/1.2.3/bar-1.2.3.jar 下的本地存储库及其匹配的元数据文件,假设 Maven POM:<root>/org/foo/bar/1.2.3/bar-1.2.3.pom
  • 在您的构建中其他存储库之前定义此存储库

    repositories {
        maven {
            name = "localRepo"
            url = "<root>"
        }
        // Other repositories below
    }
    
  • 当 Gradle 解决此依赖关系时,它将从本地存储库中选择一个,因为它具有元数据并尊重存储库布局。
    • 这可能需要 运行 --refresh-dependencies 让 Gradle 注意到 已更改 依赖项。

注意:在遗留/受限环境之外,我建议这样做。您在给定的上下文中有效地隐藏了一个工件,使您的构建变得脆弱。