有没有办法用文件系统中的另一个替换 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 注意到 已更改 依赖项。
注意:在遗留/受限环境之外,我不建议这样做。您在给定的上下文中有效地隐藏了一个工件,使您的构建变得脆弱。
我在受限环境中有一个遗留项目。我们发现第三方 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 注意到 已更改 依赖项。
- 这可能需要 运行
注意:在遗留/受限环境之外,我不建议这样做。您在给定的上下文中有效地隐藏了一个工件,使您的构建变得脆弱。