Gradle 中的 Maven BOM 依赖项

2023-12-31

假设Maven项目的依赖管理中列出了BOMFoo像这样:

<groupId>someGroup</groupId>
<artifactId>someArtifact-bom</artifactId>
<version>1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>

但此 BOM 仅对子模块中的测试依赖项起作用。

<dependency>
    <groupId>someGroup</groupId>
    <artifactId>someArtifact</artifactId>
    <scope>test</scope>
</dependency>

BOM 中声明的工件和 BOM 本身只能通过声明附加存储库来使用。

如果我创建一个新的 Maven 项目并声明依赖关系Foo它得到解决。

如果我定义了完全相同的依赖关系Foo在 Groovy 项目中

repositories {
  mavenCentral()
}

dependencies {
  implementation("myOrg:Foo:1.0")
}

解决失败并显示

- Could not resolve myOrg:Foo-parent:1.0.
  - Could not parse POM <mvn-central>/myOrg/Foo-parent-1.0.pom:
    - Could not find someGroup:someArtifact-bom:1.0-SNAPSHOT.

...因为它不存在于中央。

当然,如果可以从用户的项目访问,或者将 BOM 及其声明的工件放在中央,则可以通过添加存储库轻松解决此问题。

我想知道是否还有其他我想不出的方法来避免将来出现这个问题。依赖关系定义的排除不适用于 BOM。我可以理解这种行为,因为 BOM 不是real module.

只是为了完整性:正确解决后,我的项目中不存在有关 BOM 或其工件的依赖性。确实根本不需要。


完整地说,您在 Gradle 中经历的事情对我来说似乎是预期的行为。

Gradle will not动态添加由依赖项定义的存储库。这是因为它可能会成为安全风险,添加的存储库可能会尝试使用有毒的工件来隐藏流行的软件包。 所以 Gradle 中正确的解决方案是添加额外的存储库在需要的时候.

由于 Gradle 解释 BOM 和加载 Maven POM 文件的方式发生了一些变化,很可能由于 BOM 不是必需的,所以较新的 Gradle 版本很可能会忽略它。

但任何 Gradle 版本都无法解决根本问题,即传递性添加随机存储库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle 中的 Maven BOM 依赖项 的相关文章

随机推荐