为啥 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 被误解了:从其中提取了依赖信息,而&lt;repositories/&gt; 部分被忽略了。

唯一的解决方法是将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?

为啥maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖?

如何把springboot插件删除干净

Android Gradle插件开发

为啥 Maven 命令“mvn sonar:sonar”在我的“pom.xml”中没有任何插件配置就可以工作?

如何从build.gradle导入依赖关系到pom.xml