首页 > 解决方案 > 为什么 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?

问题描述

考虑我已经制作了一个自定义 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")

org.something:abc:4.5.6现在考虑我需要我的插件依赖于第三方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使用我的插件的每个项目的部分,我不想强​​迫我的用户这样做。

有没有替代解决方案?

更新:这已作为问题 #8811报告给Gradle团队。

标签: gradlepom.xmlgradle-plugin

解决方案


引用Gradle团队的回应:

Gradle 的行为实际上有充分的理由:

  • Gradle 非常重视依赖的来源。对于 Gradle,org:foo:1.0来自 Maven Central 和org:foo:1.0来自 JCenter 被认为是不同的东西。这就是存储库排序和过滤很重要的原因。

  • 存储库劫持已被证明是一种攻击媒介,因此拥有一个有效、可传递和透明地允许从任何存储库下载依赖项的系统是不安全的。

由于这些原因,这是一个不太可能发生的变化。

但是,您的插件有一些选项:

  • 将这种奇异的依赖隐藏到您自己的插件

  • 激励该库的所有者将其发布到众所周知的存储库或插件的存储库中

  • 配置插件的存储库以镜像其他存储库


推荐阅读