Maven構建依賴項

熟悉發行版和快照依賴項的Maven和Gradle用戶可能不了解TeamCity快照依賴項,或者認為他們與Maven相關(這是不正確的)。 熟悉工件和快照依賴關系的TeamCity用戶可能不知道,除了TeamCity提供的插件之外,添加Artifactory插件還使他們能夠使用工件并建立依賴關系。

上面提到的某些名稱似乎建立得不夠充分,而其他一些則可能需要討論其使用方式。 考慮到這一點,我決定在自己的博客文章中探索每種解決方案,并設定了提供足夠信息的目標,以便人們可以選擇最有效的方法。

第一篇文章探討了Maven快照和發行版依賴關系。 第二篇文章介紹了TeamCity提供的工件和快照依賴關系,第三篇也是最后一部分將介紹TeamCity Artifactory插件提供的工件和構建依賴關系。

內部和外部依賴性

通過簽出整個代碼庫并從頭開始構建應用程序,構建過程可以完全隔離地運行。 對于項目,將相關的二進制依賴項(如果有)與項目源一起保存在VCS中就是這種情況。 但是,在許多其他情況下,構建腳本依賴于某種內部或外部依賴性

內部依賴關系由我們自己的代碼來滿足,在代碼中我們可以完全控制該項目,該項目可以分為多個模塊或子項目。 外部依賴關系由其他人的代碼(我們無法控制)來滿足,我們可以使用它或將其用作客戶端。 這可以是第三方庫(例如Spring)或另一個團隊開發的組件。

這種區別非常重要,因為內部和外部依賴項通常伴隨著不同的發布和升級周期:內部依賴項可以每小時進行一次修改,重建和更新,而外部依賴項的發布周期顯著變慢,因為用戶應用更新的頻率更低,如果有的話。 這主要是由于內部依賴項受我們自己控制,并且受到特定項目或模塊的限制而產生了范圍狹窄的影響,而外部依賴項只能按原樣使用,其影響可能是公司或全球范圍。 ,它們不受任何項目的限制,可以在任何地方使用。 自然,這需要更高的發行版穩定性,兼容性和成熟度標準,因此發行和更新周期較慢。

“內部與外部”相關性特征的另一方面表現為在構建腳本中如何指定其版本。 內部依賴關系通常使用快照版本定義,而外部依賴關系則使用發行版本。 “快照”“發布”版本的定義是Maven提出的,Maven開創了通過構建工具管理依賴項的想法。 如果您熟悉自動依賴項管理,請隨時跳過以下部分,其中提供了有關其工作原理的快速概述。

自動依賴管理

在Maven中,依賴關系是在構建腳本中聲明性地指定的,此方法隨后是一種較新的構建工具,例如Gradle , Buildr和sbt 。

Maven:

<dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>1.8.6</version><scope>compile</scope>
</dependency>

搖籃:

compile "org.codehaus.groovy:groovy-all:1.8.6"

生成器:

compile.with "org.apache.axis2:axis2:jar:1.6.1"

sbt:

libraryDependencies += "org.twitter4j"  % "twitter4j-core"  % "2.2.5"

每個依賴項都通過其坐標范圍來標識。 坐標明確指定所使用的庫和版本,而范圍則定義其在編譯或測試調用等構建任務中的可見性和可用性。

例如, "compile org.codehaus.groovy:groovy-all:1.8.6"將為版本"1.8.6"指定一個Groovy "org.codehaus.groovy:groovy-all"發行版,用于源代碼編譯和測試調用。 將范圍切換到“測試”“運行時”將把庫的可見性分別縮小到僅測試或僅運行時。

當構建開始時,依賴關系要么位于由構建工具管理的本地工件存儲庫中(類似于瀏覽器緩存),要么從遠程存儲庫(無論是公共存儲庫還是私有存儲庫)下載,例如Maven Central , Artifactory或Nexus 。 然后,構建工具根據其作用域將解析出的工件添加到相應的類路徑中。 組裝構建工件(例如"*.war""*.ear"檔案時,所有必需的依賴項也會正確處理和打包。

盡管依賴關系管理似乎是幾乎所有構建中必不可少的部分,但并非所有構建工具都為其提供內置支持: Ant和MSBuild缺少此功能,后來Ivy和NuGet在一定程度上解決了這一差距。 但是,與Maven相比,Ivy的采用速度較慢,而NuGet是僅.NET的工具。 隨著時間的流逝,Maven工件存儲庫和Maven Central已經成為分布和共享Java工件的事實上的機制。 能夠使用Maven存儲庫解析和部署這些資源已成為所有較新的Java構建工具的“必備”能力。

發行和快照依賴性

如前所述,內部依賴關系通常使用快照版本定義,而外部依賴關系則使用發行版本。 讓我們先看一下發行版本,因為它們更容易推論。

發行依賴關系是具有固定版本號的依賴關系 ,例如Groovy發行版的"1.8.6"版本。 無論構建使用什么工件存儲庫,并且無論何時嘗試查找此依賴項,總是希望它解析出完全相同的工件。 這是發布依賴項的主要原理: “相同版本=相同工件” 。 由于這個事實,構建工具不會在發現發布依賴關系更新后對其進行檢查,并且僅在清空本地緩存后才會重新下載工件。 當然,所有這一切都是有道理的,因為我們永遠都不會期望找到帶有相同版本號的同一個庫的不同工件!

快照依賴關系是不同的,因此,處理起來很棘手。 快照依賴項版本以特殊的"-SNAPSHOT"關鍵字結尾,例如"3.2.0-SNAPSHOT" 。 該關鍵字向構建工具發出信號,以通過遠程存儲庫定期檢查工件以進行更新; 默認情況下,Maven 每天執行一次此檢查。 快照依賴關系的功能,那么,是依靠別人的工作正在進行中(想想“每日構建”):當產品開發移動從版本"X"到版本"X+1"的模塊版本"X+1-SNAPSHOT"

快照相關性不確定性

如果發布依賴關系的主要原則是“相同版本=相同工件” (版本“ X”發布的庫,其工件在世界范圍內永遠相同),則快照依賴關系的原則是“相同版本=不斷更新”神器” 。 這種方法的好處是,它可以檢索頻繁的更新,而無需產生非常不切實際的每日發布。 但是,它的缺點是不確定性–在構建腳本中使用快照依賴關系會使得更難知道在特定構建執行過程中使用了哪個版本。 我的"maven-about-plugin"將文本“ about”文件存儲在每個快照工件中,以便更好地標識其來源,例如VCS版本和內部版本號; 這可能會有所幫助,但只能解決一半問題。

作為其定義的移動目標,快照依賴項不允許我們確定我們所依賴的版本,因此很難實現構建的可復制性。 同樣,在一系列構建或構建管道中(當完成的構建觸發了后續構建的調用時),初始管道步驟所產生的工件不一定會被關閉的那些消耗,因為此后可能會被其他構建過程長時間覆蓋,與此同時。

在這種情況下,一種可能的方法是使用時間戳 鎖定構建腳本中的依賴項版本,使其成為"3.2.0-20120119.134529-1"而不是"3.2.0-SNAPSHOT" 。 這有效地使快照依賴關系與發行依賴關系相同,并禁用了自動更新機制,從而即使在沒有時間戳的情況下也無法使用最新版本,除非更新了時間戳。

如您所見,可以在有意義的地方使用快照依賴關系,但應謹慎并小劑量進行。 如果可能,最好為每個可重用組件管理一個單獨的發行生命周期,并讓其客戶端使用定期更新的發行依賴關系。

摘要

本文概述了Java構建工具對自動依賴項的管理,并介紹了Maven版本和快照依賴項。 它還解釋了快照依賴項的優勢如何在構建可復制性和構建管道的背景下值得商de。

以下博客文章將探討TeamCity構建鏈和Artifactory構建隔離,這些構建隔離允許在整個構建鏈中使用一致,可重現和最新的快照版本,而無需在構建腳本中鎖定其時間戳。 還有更多!

參考:來自Goldman ++博客的JCG合作伙伴 Evgeny Goldin的Maven Build Dependencies 。


翻譯自: https://www.javacodegeeks.com/2012/05/maven-build-dependencies.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java兩種設計模式_23種設計模式(11)java策略模式

23種設計模式第四篇&#xff1a;java策略模式定義&#xff1a;定義一組算法&#xff0c;將每個算法都封裝起來&#xff0c;并且使他們之間可以互換。類型&#xff1a;行為類模式類圖&#xff1a;策略模式是對算法的封裝&#xff0c;把一系列的算法分別封裝到對應的類中&#xf…

Problem E: 平面上的點——Point類 (II)

Description 在數學上&#xff0c;平面直角坐標系上的點用X軸和Y軸上的兩個坐標值唯一確定。現在我們封裝一個“Point類”來實現平面上的點的操作。 根據“append.cc”&#xff0c;完成Point類的構造方法和show()方法&#xff0c;輸出各Point對象的構造和析構次序。 接口描述&a…

MFC 控件RadioButton和CheckBox區別

1. 單個RadioButton在選中后&#xff0c;通過點擊無法變為未選中 單個CheckBox在選中后&#xff0c;通過點擊可以變為未選中 2. 一組RadioButton&#xff0c;只能同時選中一個 一組CheckBox&#xff0c;能同時選中多個 3. RadioButton在大部分UI框架中默認都以圓形表示 CheckBo…

什么是ActiveMQ?

盡管Active MQ網站已經對ActiveMQ進行了詳盡的介紹&#xff0c;但我想在其定義中添加更多上下文。 從ActiveMQ項目的網站上&#xff1a; “ ActiveMQ是JMS 1.1的開源實現&#xff0c;是J2EE 1.4規范的一部分。” 這是我的看法&#xff1a;ActiveMQ是一種開源消息傳遞軟件&…

字符串倒著輸出java_Java 輸出反轉字符串

Java 輸出反轉字符串public class Test {public static void main(String args[]){try{// 獲取鍵盤輸入的字符串BufferReader f new BufferReader(new inputStreamReader(System.in));String str f.readline();for (int i str.length() -1 ; i >0 ; i--) {System.out.p…

webpack基礎入門

我相信&#xff0c;有不少的朋友對webpack都有或多或少的了解。網上也有了各種各樣的文章&#xff0c;文章內作者也寫出了不少自己對于webpack這個工具的理解。在我剛剛接觸webpack的時候&#xff0c;老實說&#xff0c;網上大部分的文章我是看不懂的。。webpack里面有很多名詞…

位運算基礎

異或運算的基礎有點忘記了 先介紹一下。。2個數異或 就是對于每一個二進制位進行位運算 具有2個特殊的性質 1、一個數異或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一個數異或0恒等于本身&#xff0c;如5^0恒等于5。 3 滿足交換律 1.交換數字這個性質能利用與交換數…

JAXB自定義綁定– Java.util.Date / Spring 3序列化

JaxB可以處理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要將日期對象格式化為另一種格式怎么辦&#xff1f; 我有同樣的問題時&#xff0c;我正在同春MVC 3和Jackson JSON處理器 &#xff0c;最…

雙足機器人簡單步態生成

讓機器人行走最簡單的方法是先得到一組步態曲線&#xff0c;即腿部每個關節隨時間運動的角度值。可以在ADAMS或3D Max、Blender等軟件中建立好機構/骨骼模型&#xff0c;設計出腳踝和髖關節的運動曲線&#xff0c;然后進行逆運動學解算&#xff0c;測量每個關節在運動過程中的轉…

重新訪問了訪客模式

訪客模式是面向對象設計中最被高估但又被低估的模式之一。 高估了它&#xff0c;因為它常常被選擇得太快&#xff08; 可能是由建筑宇航員選擇的 &#xff09;&#xff0c;然后以錯誤的方式添加時會膨脹本來非常簡單的設計。 如果您不遵循教科書示例&#xff0c;那么它可能會非…

java web開發技術大_2021年六大javaweb開發主流技術

作為歷史最為悠久的編程語言——java&#xff0c;歷經數十年依然盤踞在編程榜最前面的位置&#xff0c;這與它的技術和應用范圍是分不開的&#xff0c;同時呢&#xff0c;javaweb開發主流技術更是java開發者時時刻刻關注的問題&#xff0c;接下來我們一起分析一下2020年互聯網行…

ASP.NET—013:實現帶控件的彈出層(彈出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在頁面中用到彈出新頁面的情況比較多的&#xff0c;一般來說都是使用JS方法showModalDialog("新頁面相對路徑?參數1&參數2",window,"新頁面樣式");然后會新彈出一個模態的page頁。…

運維人員日常工作(轉自老男孩)

1&#xff09;運維人員要謹記的6個字&#xff1a; 運維人員做事需遵循&#xff1a;簡單、易用、高效 &#xff08;2&#xff09;運維人員服務的3大宗旨&#xff1a; 1、企業數據安全保障。 2、7*24小時業務持續提供服務。 3、不斷提升用戶感受、體驗。 &#xff08;3&#xff0…

c# 操作DatatTable

dtTemp.Columns.Add("列名");//增加一列 dtTemp.Columns.Remove("列名");//刪除一列 dtTemp.Columns["舊列名"].ColumnName "新列名";//修改列名 dtTemp.Columns["列名1"].SetOrdinal(dtTemp.Columns["列名2"].O…

java 二進制 歸屬權限_【Java EE 學習 75 上】【數據采集系統第七天】【二進制運算實現權限管理】【權限分析和設計】...

一、權限計算相關分析1.如何存儲權限首先說一下權限保存的問題&#xff0c;一個系統中最多有多少權限呢&#xff1f;一個大的系統中可能有成百上千個權限需要管理。怎么保存這么多的權限&#xff1f;首先&#xff0c;我們使用一個數字中的一位保存一種權限&#xff0c;那么如果…

MongoDB性能測試

因此&#xff0c;今天早上&#xff0c;我在mongo shell中四處亂逛。 我想出了三種不同的方式來聚合所需的數據&#xff0c;但不確定隨后應移植哪種代碼以在應用程序中使用。 那么&#xff0c;我將如何決定實施哪種方法呢&#xff1f; 好吧&#xff0c;讓我們選擇性能最佳的產品…

$_SERVER[SCRIPT_NAME]、$_SERVER[PHP_SELF]、$_SERVER[QUERY_STRING]、$_SERVER[REQUEST_URI]

1、$_SERVER["SCRIPT_NAME"] 說明&#xff1a;包含當前腳本的路徑 2、$_SERVER["PHP_SELF"] 說明&#xff1a;當前正在執行腳本的文件名 3、$_SERVER["QUERY_STRING"] 說明&#xff1a;查詢(query)的字符串 4、$_SERVER["REQUEST_URI"…

yii2增刪改查及AR的理解

yii2增刪改查 // 返回 id 為 1 的客戶 $customer Customer::findOne(1); // 返回 id 為 1 且狀態為 *active* 的客戶 $customer Customer::findOne([ id > 1, status > Customer::STATUS_ACTIVE, ]); // 返回id為1、2、3的一組客戶 $customers Customer::findAll([1, …

GWT和HTML5 Canvas演示

這是我對GWT和HTML5 Canvas的第一個實驗。 我的第一個嘗試是創建矩形&#xff0c;僅用幾行代碼就得出了這樣的內容&#xff1a; 碼&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";static final St…

mysql 平均值 排序_MySQL按平均兩個平均值排序

我正在競賽網站上工作,有兩種類型的用戶,普通網站成員和評委.每個人都可以使用拖放工具按照他們選擇的順序對特定比賽中的條目進行排序.完成后,相關的條目ID將附加一個排名值,然后可用于確定比賽中哪個條目獲得最高的平均分數.獲勝者實際上將通過平均每組的平均值來確定.我希望…