簡體   English   中英

Gradle 中的 Maven BOM 依賴項

[英]Maven BOM dependencies in Gradle

鑒於在 Maven 項目Foo的依賴項管理中列出了一個 BOM,如下所示:

<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的依賴,它就會得到解決。

如果我在 Groovy 項目中定義了對Foo 的完全相同的依賴

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 不是真正的模塊。

只是為了完整性:在正確解析后,我的項目中不再依賴 BOM 或其工件。 真的根本不需要。

完整地說,您在 Gradle 中的體驗對我來說似乎是預期的行為。

Gradle不會動態添加依賴項定義的存儲庫。 這是因為它可能成為一個安全風險,其中添加的存儲庫可能會嘗試隱藏帶有中毒工件的流行包。 所以 Gradle 中正確的解決方案是在需要時添加額外的存儲庫。

隨着 Gradle 解釋 BOM 和加載 Maven POM 文件的方式發生了許多變化,很可能因為不需要 BOM,更新的 Gradle 版本會很樂意忽略它。

但是根本問題,傳遞性地添加隨機存儲庫,不會由任何 Gradle 版本完成。

感謝 Corneil du Plessis 的評論,我在嘗試不同的 Gradle 版本時進行了更深入的研究,而一個更新的版本解決了這個問題。 稍后回到讓我意識到問題的原始版本(5.2.1),它一直在解決依賴關系,沒有任何錯誤。

可以肯定的是,我清除了本地 Gradle 緩存並成功地重新運行了構建。

由於我無法再使用 5.x 或 6.x 重現該問題,因此我很確定這與我機器上的緩存和 Gradle 的歷史記錄有關。

我認為自己回答我的問題而不是關閉它以將信息留在這里是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM