簡體   English   中英

Maven 依賴版本范圍

[英]Maven dependency version range

當提到我們的依賴版本時,我想了解 [3.8.2] 與 3.8.2 之間的區別。

這里

當為 Junit 聲明一個“正常”版本(例如 3.8.2)時,在內部這表示為“允許任何內容,但更喜歡 3.8.2”。 這意味着當檢測到沖突時,Maven 可以使用沖突算法來選擇最佳版本。 如果您指定 [3.8.2],則意味着將僅使用 3.8.2 而不會使用其他任何內容。 如果其他地方存在指定 [3.8.1] 的依賴項,您將收到構建失敗消息,告訴您沖突。 我們指出這一點是為了讓您了解該選項,但請謹慎使用,並且僅在真正需要時使用。 解決此問題的首選方法是通過dependencyManagement。

但我覺得這里有些不對勁。

如果我為我們的依賴項編寫<version>3.8.2</version>並且我們的 maven 存儲庫中不存在該版本工件,那么它不會選擇其他任何東西。 構建根本失敗。 所以,為什么上面他們說 - “允許任何事情,但更喜歡 3.8.2。”

此外,他們說 - This means that when a conflict is detected,... 我無法理解這一點。 3.8.2 不會出現但 [3.8.2] 會出現什么可能的沖突?

整個過程如下:

第一步:Maven為你的項目構建一個依賴樹,包括你的直接依賴,它們的依賴,你的依賴的依賴等等。

第 2 步:現在 Maven 列出所有節點。 如果它僅在一個版本(例如 3.8.2 或 [3.8.2])中遇到依賴項,它將僅選擇該版本。

第 3 步:如果 Maven 找到了多個版本,魔術就開始了。

  • 如果所有版本都是沒有括號的版本(如 3.8.2),它會選擇依賴中介原則中提到的“最近”版本。

  • 如果您有一些(或全部是)版本范圍(例如 [1.0.0,2.0.0])或固定版本(例如 [1.0.0]),那么它首先會找到所有范圍/具體版本的交集(注意此處不考慮沒有括號的版本來查找此交集)。

  • 如果發現此交集為空,則構建失敗。 如果它不為空,則它通過選擇“最近的”版本/具體版本/版本范圍來進一步進行。

  • 如果根據最近的定義,我們得到一個版本范圍/具體版本,那么 maven 會在找到的版本范圍的結果交集中選擇最新的可用版本。

  • 如果根據最接近的定義,我們得到一個版本(不是具體版本),然后 maven 檢查該版本是否存在於找到的版本范圍的結果交集中。 如果是,則選擇此版本。 如果不是,則 maven 會在生成的版本范圍交集中選擇最新的可用版本(並且不會使構建失敗)。

引用“允許任何事情,但更喜歡 3.8.2”充其量是誤導。 Maven 不會試圖彌補存儲庫中缺少的依賴項,它只是在依賴項樹中找到多個版本時“調解”版本。

暫無
暫無

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

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