为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?
Posted
技术标签:
【中文标题】为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?【英文标题】:Why doesn't Gradle use Maven repositories declared in the plug-in's pom.xml?为什么 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库? 【发布时间】:2019-08-10 07:18:17 【问题描述】:考虑一下我制作了一个自定义 Gradle 插件,该插件可在 https://repo.example.com/xyz
获得,并按如下方式应用:
// build.gradle.kts
buildscript
repositories
jcenter()
maven("https://repo.example.com/xyz")
dependencies
classpath("com.example:xyz-gradle-plugin:1.2.3")
apply(plugin = "com.example.xyz")
现在考虑我需要我的插件依赖于 3rd 方库 (org.something:abc:4.5.6
),该库只能从另一个自定义 Maven 存储库(例如,https://repo.something.org/abc
)获得。我相应地生成了我的插件的pom.xml
:
<dependencies>
<dependency>
<groupId>org.something</groupId>
<artifactId>abc</artifactId>
<version>4.5.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>xyz</id>
<url>https://repo.example.com/xyz/</url>
</repository>
<repository>
<id>abc</id>
<url>https://repo.something.org/abc/</url>
</repository>
</repositories>
现在,当我重新构建并重新发布插件时,使用它的客户端代码无法构建,因为无法找到插件所依赖的org.something:abc:4.5.6
库。显然,插件的pom.xml
被误解了:从其中提取了依赖信息,而<repositories/>
部分被忽略了。
唯一的解决方法是将maven("https://repo.something.org/abc")
显式添加到使用我的插件的每个项目的buildscript
部分,我不想强迫我的用户这样做。
有其他解决方案吗?
更新:这已报告给 Gradle 团队issue #8811。
【问题讨论】:
【参考方案1】:引用 Gradle 团队的回复:
Gradle 的行为实际上有充分的理由:
Gradle 非常重视依赖项的源。对于 Gradle,来自 Maven Central 的
org:foo:1.0
和来自 JCenter 的org:foo:1.0
被认为是不同的东西。这就是存储库排序和filtering 很重要的原因。存储库劫持是demonstrated as an attack vector,因此拥有一个有效、可传递和透明地允许从任何存储库下载依赖项的系统是不安全的。
由于这些原因,这是一个不太可能发生的变化。
但是您的插件有一些选项:
Shadow 对您自己的插件的奇异依赖
激励该库的所有者将其发布到知名存储库或插件的存储库中
将插件的存储库配置为也镜像其他存储库
【讨论】:
以上是关于为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?的主要内容,如果未能解决你的问题,请参考以下文章
为啥maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖?