2012-10-19 54 views
9

我正在嘗試創建一個方法,在其中仍然依靠項目中的SNAPSHOT依賴關係實現密封構建。創建密封Maven構建

例如而言,說我有具有依賴結構這樣一個項目:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

我想要做的是解決所有快照依賴本地的東西這是關係到我的目前的版本,然後將這些版本部署到我的Nexus發佈版本中。並非所有的這些依賴都是內部的,所以我不能簡單地在每個依賴上進行發佈。

因此,在此示例中,other-1.2-SNAPSHOT會變成類似於other-1.2-mine-1.2.3thing-3.1-SNAPSHOT將變爲thing-3.1-mine-1.2.3。這在約60條蟒蛇線中相對微不足道。

但是,問題在於將可傳遞的SNAPSHOT解析爲具體的版本。所以我也需要將gizmo-6.1.3-SNAPSHOT轉換爲gizmo-6.1.3-mine.1.2.3並且thing-3.1-mine-1.2.3依賴於它。

這只是一個實現我想要的方法的例子。我的目標是在一兩年的時間裏,我可以檢查我的發行版本1.2.3版本,並且能夠運行mvn clean package或類似的東西,而不用擔心解決長久以來SNAPSHOT的依賴關係。

這個分支是可編譯的,而不僅僅是使用類似彙編插件的jar-and-dependencies功能保留所有依賴關係是很重要的。我希望能夠修改源文件並進行其他版本構建(例如應用修補程序)。

所以,

  • 有這樣可用,將能夠快照依賴轉換以遞歸的方式是具體什麼?
  • 有沒有可以爲你管理這種事情的插件?發佈插件已承諾在其branch目標上提供一些配置選項,但它無法解決我想要的程度的外部代碼。
  • 是否有其他技術可用於創建密封Maven構建?
+3

聽起來像一個反Maven破解我。在Maven中,基本的基本規則之一是** Convention Over Configuration **。如果依賴是由你自己創建的,你應該自己管理/使用SNAPSHOT/RELEASE版本。如果他們來自其他地方,則應始終使用最新版本(而不是SNAPSHOT版本)。再來看看[Maven The Complete Reference - 3.3.1節](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -sect版本),並瞭解爲什麼SNAPSHOT在Maven中使用。 – yorkw

+0

我非常全面地瞭解Maven的基礎知識。然而,我生活在現實世界中,期限和第三方庫非常有用,但它們在SNAPSHOT版本上的使用時間很長。 Jason Van Zyl,你可能知道,甚至承認圍繞版本發佈過程繁重系統的想法是一個巨大的錯誤(並且隨特斯拉而改變)。對於我們所消費的所有項目來說,維持內部分配的作用不大,我所做的實際上是比大多數人更好的跳躍。 –

+1

甚至在現實世界中也應該考慮到一些原因。你在這裏與系統作戰。正如你所提到的,快照不夠長 - 即使你使用時間戳快照來依靠工件解析。我的方法是使用依賴和部署插件來檢索所有工件,並通過使用腳本或一些自制的Maven插件將已知的快照依賴關係部署到自己的Maven倉庫中。也許與其他小玩意交談也有幫助:如果他們可以發佈他們的工件的測試版本,你可以依靠那些沒有太多雜亂的東西。 – wemu

回答

2

這不是一個廣泛使用的技術,但可以隨時查詢您的具體快照依賴到您的項目作爲一個「項目」資料庫,在這個博客帖子描述:Maven is to Ant as a Nail Gun is to a Hammer

總之,使用依賴插件創建位於您的項目目錄中的存儲庫。下面從鏈接的博客文章複製(你應該讀):

1)運行mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

「這將創建/你的所有項目的依賴關係的回購式佈局目標/依賴」

2)複製target/dependencies/喜歡的東西libs/

3)添加庫聲明類似下面的POM:

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 
012通過配置依賴插件的生命週期phasephase步驟1中,和步驟2用AntRun插件的下載依賴移動到合適的位置..

希望這:

你讓這個您的構建/發佈過程的自動化部分爲你工作。我現在得去洗個澡...

+0

我沒有完全做到這一點,但未來的旅行者可能會想要這個解決方案。我創建了一個特殊的nexus存儲庫並將自定義版本部署到它中,然後通過腳本更新pom,就像我在原始文章中描述的那樣。然而,我在上一份工作中使用了這種技術,並且在類似的使用案例中表現卓越。 –

2

該maven版本插件將做你想要的大部分。

http://mojo.codehaus.org/versions-maven-plugin/

然而,你將幾乎certianly需要在您解決所有的依賴關係,並相應地更新POM文件的生成前階段運行。然後重新運行maven(重新讀取pom)以運行實際構建。您可能能夠配置pom中的所有內容,並使用單獨的目標觸發,從而避免使用單獨的腳本。

如果您使用特定版本而不是SNAPSHOT依賴關係,並且在必要時讓預生成步驟升級它們,則此功能會更好。依賴關係解析的唯一真正區別是maven總是會重新下載-SNAPSHOT依賴關係,而如果有新版本可用,它將只下載正常的依賴關係。然而,很多插件(包括版本插件)將SNAPSHOT依賴關係視爲不同的方式導致問題。由於每個CI構建都有一個新的版本號,所以我從不使用-SNAPSHOT,喜歡像-DEV這樣的不同標籤,對於開發者本地構建等東西更具可預測性。

我花了很多時間讓maven做與此類似的東西。我所知道的大多數Maven項目都有一些預構建步驟,以便設置版本號或繞過其他限制。試圖在一個步驟中完成所有操作通常會失敗,因爲maven只能讀取一次pom,字符串替換在某些地方不起作用,並且已部署/安裝的pom通常不會包含字符串替代或更改的結果在構建期間。