2016-08-24 56 views
-1

發佈並解析本地Ivy Cache我認爲這裏最令人吃驚的是,這個功能默認情況下被烘焙成Maven和Gradle,但是在Ant/Ivy風景中沒有它的存在痕跡(你自己看!)。通過示例


我已經繼承了一套使用Ant/Ivy作爲構建/依賴系統的JVM組件。這些組件之間存在很多依賴關係,這意味着對其中一個組件進行更改通常會產生連鎖反應,需要您更新Ivy依賴項併發布新版本的上游依賴項。

維護這些項目的老團隊通過將快照瓶頸發佈到快照回購來處理本地開發。 我想用一個新的模式替換這個模式,快照從本地Ivy緩存發佈/解析。

我能找到this very similar question,但發現答案有點缺乏細節(特別是完全拼接在一起的代碼片段),部分原因是該問題缺少任何特定的代碼示例。所以我在這裏創造了SSCCE並推2個GitHub的回購協議:

  • fizzbuzz-model,一個Java庫,定義了一個數據模型(一些無意義的POJO)
  • fizzbuzz-app,一個簡單的可執行的JAR是取決於fizzbuzz-model作爲一個依賴

什麼我找這裏的確切(即實際代碼,不是僞代碼)的變化(可能build.xmlivy.xmlivy-settings.xml,或所有三個),將允許我使用下面的本地開發/測試周期:

  1. 我做出改變fizzbuz-model和本地發佈換到常春藤緩存,優選作爲快照的版本(如1.0.0-SNAPSHOT或類似)
  2. fizzbuzz-app根目錄內,我運行ant resolve,其在從緩存的快照這些變化拉動現在
  3. 我可以利用中的這些更改

雖然沒有硬性要求,我就非常喜歡必須手動管理的版本號。也就是說,當我在本地發佈fizzbuzz-model時,將使用相同版本(類似fizzbuz-model-1.0.0-SNAPSHOT.jar)重寫而不是將構建編號增加到fizzbuzz-model-1.0.1-SNAPSHOT.jar或類似編號)。這樣,我在本地測試時所要做的就是發佈fizzbuzz-model並解決fizzbuzz-app

目前,當我發佈fizzbuzz-model,我得到以下錯誤:

/Users/myuser/workspace/fizzbuzz-model/build.xml:52: impossible to publish artifacts for hotmeatballsoup#fizzbuzz-model;1.0: java.io.IOException: missing artifact hotmeatballsoup#fizzbuzz-model;1.0.0-SNAPSHOT!fizzbuzz-model.pom 
    at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:225) 
    at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:172) 

要在本地複製,克隆這兩個項目,並按照他們的自述文件,從fizzbuzz-model任何人都可以發現我要去哪裏?隨意回答這裏和/或提交PR,無論你喜歡哪個!和謝謝!

+0

爲什麼downvote?這個問題是關於主題,不是愚蠢的,顯示研究,是[SSCCE](http://sscce.org)的教科書定義。 – smeeb

+0

我不是那個倒票的人,但你沒有承認我的答案,也沒有處理你要求的拉取請求。 –

回答

0

的錯誤指示常春藤無法找到一個文件被公佈在當地建立工作區。這不是一個快照問題。

的問題是here

<ivy:publish resolver="local" pubrevision="1.0.0-SNAPSHOT" > 
    <artifacts pattern="dist/[artifact]-[revision].[ext]" /> 
</ivy:publish> 

您已經列入模式的「修訂版」,但不幸的是你在本地創建的jar沒有這個命名約定相匹配。它遺漏的修正版和,都有一座錯字(應該是「fizzbuzz」,而不是「fizbuz」):

<target name="dist" depends="clean,compile"> 
    <jar jarfile="dist/fizzbuz-model.jar" basedir="build/main" /> 
</target> 

我預測,進一步的問題,因爲你是在嘗試配置常春藤模擬的方式Maven的存儲快照版本。這需要Maven從未正式記錄過的其他元數據文件。我強烈建議將已發佈的文件推送到Maven存儲庫管理器,以獲取格式正確的SNAPSHOT存儲。

以下是從常春藤到一個Maven回購出版文物的例子


建議的解決方案

我已經向拉請求作爲請求我的建議o ñ如何本地常春藤庫可以優先使用快照版本:

綜上所述模型發佈一個新的版本每新鮮構建

<target name="publish" depends="clean,dist"> 

    <!-- Determine build number from previously published revisions --> 
    <ivy:buildnumber resolver="local" organisation="${ivy.organisation}" module="${ivy.module}" revision="${target.release}"/> 

    <!-- Resolve ivy dependencies and create a Maven POM file --> 
    <ivy:deliver deliverpattern="dist/ivy.xml" pubrevision="${ivy.new.revision}" status="release"/> 
    <ivy:makepom ivyfile="dist/ivy.xml" pomfile="dist/fizzbuzz-model.pom" /> 

    <!-- Publish the local repo. Defaults to ~/.ivy2/local --> 
    <ivy:publish resolver="local" pubrevision="${ivy.new.revision}" > 
     <artifacts pattern="dist/[artifact].[ext]" /> 
    </ivy:publish> 
</target> 

並且這被用作在應用代碼中的動態依賴,總是取回最新發布的其他模塊版本。

<dependencies> 
    <dependency org="hotmeatballsoup" name="fizzbuzz-model" rev="latest.integration" conf="compile->default" /> 
</dependencies> 

注:

  • 作爲也正在產生一個POM文件中的獎金,嚴格來說,除非你推文物,一個Maven回購這是沒有必要的。

背景

依賴管理者像常春藤之前Maven的緣由來自於時間(我記得當Maven 1.0是普遍痛恨),所以這是不足爲奇的常春藤並不完全實現Maven的工作流程。

Maven始終是一個高度評價的工具。令人困惑的是,它支持兩種發佈工件的方式。作爲發佈或作爲快照。在我看來,這是在試圖使用Maven進行持續部署時造成最大摩擦的原因,所有版本都應該考慮發佈。但不能否認Maven是分發所有基於Java的二進制文件的通用方式。 Maven存儲庫可以作爲支持多種構建技術(Maven,Gradle或ANT/Ivy)的單一集成點。

所以我們需要先接受快照開發工作流程對於Maven來說非常獨特,並且據我所知最好還沒有被任何其他存儲庫格式複製過。

在其他存儲庫中,版本的版本號始終是唯一的。這適用於官方發佈,候選版本或開發版本。另一方面,Maven快照從未最終確定。我的意思是什麼?如果我今天針對版本「1.0-SNAPSHOT」構建,那麼明天的依賴關係可能會完全不同。這是因爲每個新的快照構建都會在後臺創建一個新的時間戳文件來覆蓋之前存儲的二進制文件。

常春藤有不同的機制來支持開發構建(不同的並不意味着更好)。人們可以依賴開發中的最新版本,但是這將始終在構建時明確解決。當人們向常春藤資源庫發佈人造物時,便利的deliver任務能夠創建完全解析的常春藤文件。關於使用何種版本的依賴關係永遠不會含糊不清。

因此,總而言之,首先請確定您是否確實需要支持快照工作流程。除非您打算使用Maven與其他團隊進行整合,否則強制常春藤不遵循它不打算支持的工作流程是不明智的。