2016-06-09 60 views
7

我正在使用BOM將其他項目的依賴項導入到我的項目中,而且我需要一種方法來引用已在所述BOM中聲明的依賴項版本。到目前爲止,我試圖列出依賴版本作爲BOM中的一個屬性,但是這種方法失敗了,因爲屬性不能與BOM一起導入。Maven是否有一種方法來獲取作爲屬性的依賴版本?

我見過其中Dependency插件的dependency:properties目標確實幾乎的正是我需要的,而是給我的神器的完整路徑,我需要的版本屬性。有沒有可以給我一個解決的神器的版本作爲一個屬性?

UPDATE - '爲什麼不使用父pom?'

我通常發現自己在應用程序服務器環境中工作,其中提供的依賴關係是用BOM工件指定的(因爲它似乎已成爲分佈相關工件組的一些常見/標準方式,即widlfly) 。因此,我想將BOM視爲真相的單一來源。想要執行類似重新分配已在BOM中定義的依賴項版本屬性的想法看起來不正確。

如果我要在應用服務器環境鏡像的父pom中定義屬性,我現在必須考慮保持父pom屬性和BOM屬性保持同步 - 爲什麼即使在此時也有BOM?

的信息是在依賴關係樹已經上市,它只是一個揭露它的事......

+0

的通常的做法是afaik有一個[共同父母](http://www.avajava.com/tutorials/lessons/how-do-i-manage-the-version-of-a-dependency-in-a-parent- pom.html)([IRL示例](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml))定義了所有版本。 – zapl

+0

@zapl - 請參閱編輯,我正在專門處理BOM。 – JoshC13

+0

爲什麼要使用屬性來創建依賴關係,使其通過dependencyManagement中的BOM進行定義,因此您無需定義版本。爲什麼你需要引用依賴關係? – khmarbaise

回答

7

找不到任何現有的maven或插件功能,因此我分叉了舊的dependencypath-maven-plugin並將其更改爲使用版本。現在我可以在一個插件下降這樣的:

<build> 
    . 
    . 
    <plugins> 
     . 
     . 
     <plugin> 
      <groupId>io.reformanda.semper</groupId> 
      <artifactId>dependencyversion-maven-plugin</artifactId> 
      <version>1.0.0</version> 
      <executions> 
       <execution> 
        <id>set-all</id> 
        <goals> 
         <goal>set-version</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

而且訪問屬性是這樣的:

的groupId:的artifactId:類型[:分類] .version

I.E.

io.undertow:暗流核心:jar.version = 1.3.15.Final

退房的README有關如何使用該插件的詳細信息。它的問世@Maven Central

<dependency> 
    <groupId>io.reformanda.semper</groupId> 
    <artifactId>dependencyversion-maven-plugin</artifactId> 
    <version>1.0.0</version> 
</dependency> 

...插件一路下跌......

+0

正是醫生訂購的,謝謝! –

3

簡短的回答 - 是的,可以。

在細節,你的根的pom.xml:

<properties> 
    <slf4j.version>1.7.21</slf4j.version> 
</properties> 
... 
<dependencyManagement> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    ... 
</dependencyManagement> 

模塊的pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </dependency> 
    ... 
</dependencies> 

您也可以使用$ {} slf4j.version值來篩選資源或插件配置。

更新

如果你不能在父POM使用屬性,你可以

  • retreive所有的依賴關係以及他們與dependency:list插件的版本;或
  • 一起使用依賴項:list + antrun:運行插件;或
  • 配置CI服務器腳本爲您完成(例如,使用this示例);或
  • 編寫自定義插件來處理您的版本邏輯。
+0

問題的第一句話 - 「我使用BOM導入依賴關係」。如果我使用父POM,這不會是一個問題。我的問題在於屬性不能從BOM依賴項導入,但這些依賴項的版本可以。 – JoshC13

+0

此外,有關如何共享屬性的其他幾個S/O問題已經闡述了此答案。 I.E. http://stackoverflow.com/questions/1231561/how-to-share-common-properties-among-several-maven-projects – JoshC13

+0

我已經更新了答案。希望能幫助到你。 – ursa

0

這Maven插件是在Github上(https://github.com/semper-reformanda/dependencyversion-maven-plugin),它是任何人都處理依賴版本必須的,例如當使用Webjars依賴關係時 - 您可以將Webjar版本號直接注入到您的Web資源中。

我一直在尋找了很長的時間這樣的功能,我希望更多的人碰到它,它在起牀Maven的中央(其實,我覺得它應該與Maven開箱)

+0

看我的答案 - 我寫了插件,因爲我找不到這個功能。但是,謝謝你的親切的話;-) – JoshC13

相關問題