Maven构建依赖项
上面提到的某些名稱似乎建立得不夠充分,而其他一些則可能需要討論其使用方式。 考慮到這一點(diǎn),我決定在自己的博客文章中探索每種解決方案,并設(shè)定了提供足夠信息的目標(biāo),以便人們可以選擇最有效的方法。
第一篇文章探討了Maven快照和發(fā)行版依賴關(guān)系。 第二篇文章介紹了TeamCity提供的工件和快照依賴關(guān)系,第三篇也是最后一部分將介紹TeamCity Artifactory插件提供的工件和構(gòu)建依賴關(guān)系。
內(nèi)部和外部依賴性
通過簽出整個代碼庫并從頭開始構(gòu)建應(yīng)用程序,構(gòu)建過程可以完全隔離地運(yùn)行。 對于項(xiàng)目,將相關(guān)的二進(jìn)制依賴項(xiàng)(如果有)與項(xiàng)目源一起保存在VCS中就是這種情況。 但是,在許多其他情況下,構(gòu)建腳本依賴于某種內(nèi)部或外部依賴性 。
內(nèi)部依賴關(guān)系由我們自己的代碼來滿足,在代碼中我們可以完全控制該項(xiàng)目,該項(xiàng)目可以分為多個模塊或子項(xiàng)目。 外部依賴關(guān)系由其他人的代碼(我們無法控制)來滿足,我們可以使用它或?qū)⑵溆米骺蛻舳恕?這可以是第三方庫(例如Spring)或另一個團(tuán)隊(duì)開發(fā)的組件。
這種區(qū)別非常重要,因?yàn)閮?nèi)部和外部依賴項(xiàng)通常伴隨著不同的發(fā)布和升級周期:內(nèi)部依賴項(xiàng)可以每小時進(jìn)行一次修改,重建和更新,而外部依賴項(xiàng)的發(fā)布周期顯著變慢,因?yàn)橛脩魬?yīng)用更新的頻率更低,如果有的話。 這主要是由于內(nèi)部依賴項(xiàng)受我們自己控制,并且受到特定項(xiàng)目或模塊的限制而產(chǎn)生了范圍狹窄的影響,而外部依賴項(xiàng)只能按原樣使用,其影響可能是公司或全球范圍。 ,它們不受任何項(xiàng)目的限制,可以在任何地方使用。 自然,這需要更高的發(fā)行版穩(wěn)定性,兼容性和成熟度標(biāo)準(zhǔn),因此發(fā)行和更新周期較慢。
“內(nèi)部與外部”相關(guān)性特征的另一方面表現(xiàn)為在構(gòu)建腳本中如何指定其版本。 內(nèi)部依賴關(guān)系通常使用快照版本定義,而外部依賴關(guān)系則使用發(fā)行版本。 “快照”和“發(fā)布”版本的定義是Maven提出的,Maven開創(chuàng)了通過構(gòu)建工具管理依賴項(xiàng)的想法。 如果您熟悉自動依賴項(xiàng)管理,請隨時跳過以下部分,其中提供了有關(guān)其工作原理的快速概述。
自動依賴管理
在Maven中,依賴關(guān)系是在構(gòu)建腳本中聲明性地指定的,此方法隨后是一種較新的構(gòu)建工具,例如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"每個依賴項(xiàng)都通過其坐標(biāo)和范圍來標(biāo)識。 坐標(biāo)明確指定所使用的庫和版本,而范圍則定義其在編譯或測試調(diào)用等構(gòu)建任務(wù)中的可見性和可用性。
例如, "compile org.codehaus.groovy:groovy-all:1.8.6"將為版本"1.8.6"指定一個Groovy "org.codehaus.groovy:groovy-all"發(fā)行版,用于源代碼編譯和測試調(diào)用。 將范圍切換到“測試”或“運(yùn)行時”將把庫的可見性分別縮小到僅測試或僅運(yùn)行時。
當(dāng)構(gòu)建開始時,依賴關(guān)系要么位于由構(gòu)建工具管理的本地工件存儲庫中(類似于瀏覽器緩存),要么從遠(yuǎn)程存儲庫(無論是公共存儲庫還是私有存儲庫)下載,例如Maven Central , Artifactory或Nexus 。 然后,構(gòu)建工具根據(jù)其作用域?qū)⒔馕龀龅墓ぜ砑拥较鄳?yīng)的類路徑中。 組裝構(gòu)建工件(例如"*.war"或"*.ear"檔案時,所有必需的依賴項(xiàng)也會正確處理和打包。
盡管依賴關(guān)系管理似乎是幾乎所有構(gòu)建中必不可少的部分,但并非所有構(gòu)建工具都為其提供內(nèi)置支持: Ant和MSBuild缺少此功能,后來Ivy和NuGet在一定程度上解決了這一差距。 但是,與Maven相比,Ivy的采用速度較慢,而NuGet是僅.NET的工具。 隨著時間的流逝,Maven工件存儲庫和Maven Central已經(jīng)成為分布和共享Java工件的事實(shí)上的機(jī)制。 能夠使用Maven存儲庫解析和部署這些資源已成為所有較新的Java構(gòu)建工具的“必備”能力。
發(fā)行和快照依賴性
如前所述,內(nèi)部依賴關(guān)系通常使用快照版本定義,而外部依賴關(guān)系則使用發(fā)行版本。 讓我們先看一下發(fā)行版本,因?yàn)樗鼈兏菀淄普摗?
發(fā)行依賴關(guān)系是具有固定版本號的依賴關(guān)系 ,例如Groovy發(fā)行版的"1.8.6"版本。 無論構(gòu)建使用什么工件存儲庫,并且無論何時嘗試查找此依賴項(xiàng),總是希望它解析出完全相同的工件。 這是發(fā)布依賴項(xiàng)的主要原理: “相同版本=相同工件” 。 由于這個事實(shí),構(gòu)建工具不會在發(fā)現(xiàn)發(fā)布依賴關(guān)系更新后對其進(jìn)行檢查,并且僅在清空本地緩存后才會重新下載工件。 當(dāng)然,所有這一切都是有道理的,因?yàn)槲覀冇肋h(yuǎn)都不會期望找到帶有相同版本號的同一個庫的不同工件!
快照依賴關(guān)系是不同的,因此,處理起來很棘手。 快照依賴項(xiàng)版本以特殊的"-SNAPSHOT"關(guān)鍵字結(jié)尾,例如"3.2.0-SNAPSHOT" 。 該關(guān)鍵字向構(gòu)建工具發(fā)出信號,以通過遠(yuǎn)程存儲庫定期檢查工件以進(jìn)行更新; 默認(rèn)情況下,Maven 每天執(zhí)行一次此檢查。 快照依賴關(guān)系的功能,那么,是依靠別人的工作正在進(jìn)行中(想想“每日構(gòu)建”):當(dāng)產(chǎn)品開發(fā)移動從版本"X"到版本"X+1"的模塊版本"X+1-SNAPSHOT" 。
快照相關(guān)性不確定性
如果發(fā)布依賴關(guān)系的主要原則是“相同版本=相同工件” (版本“ X”發(fā)布的庫,其工件在世界范圍內(nèi)永遠(yuǎn)相同),則快照依賴關(guān)系的原則是“相同版本=不斷更新”神器” 。 這種方法的好處是,它可以檢索頻繁的更新,而無需產(chǎn)生非常不切實(shí)際的每日發(fā)布。 但是,它的缺點(diǎn)是不確定性–在構(gòu)建腳本中使用快照依賴關(guān)系會使得更難知道在特定構(gòu)建執(zhí)行過程中使用了哪個版本。 我的"maven-about-plugin"將文本“ about”文件存儲在每個快照工件中,以便更好地標(biāo)識其來源,例如VCS版本和內(nèi)部版本號; 這可能會有所幫助,但只能解決一半問題。
作為其定義的移動目標(biāo),快照依賴項(xiàng)不允許我們確定我們所依賴的版本,因此很難實(shí)現(xiàn)構(gòu)建的可復(fù)制性。 同樣,在一系列構(gòu)建或構(gòu)建管道中(當(dāng)完成的構(gòu)建觸發(fā)了后續(xù)構(gòu)建的調(diào)用時),初始管道步驟所產(chǎn)生的工件不一定會被關(guān)閉的那些消耗,因?yàn)榇撕罂赡軙黄渌麡?gòu)建過程長時間覆蓋,與此同時。
在這種情況下,一種可能的方法是使用時間戳 鎖定構(gòu)建腳本中的依賴項(xiàng)版本,使其成為"3.2.0-20120119.134529-1"而不是"3.2.0-SNAPSHOT" 。 這有效地使快照依賴關(guān)系與發(fā)行依賴關(guān)系相同,并禁用了自動更新機(jī)制,從而即使在沒有時間戳的情況下也無法使用最新版本,除非更新了時間戳。
如您所見,可以在有意義的地方使用快照依賴關(guān)系,但應(yīng)謹(jǐn)慎并小劑量進(jìn)行。 如果可能,最好為每個可重用組件管理一個單獨(dú)的發(fā)行生命周期,并讓其客戶端使用定期更新的發(fā)行依賴關(guān)系。
摘要
本文概述了Java構(gòu)建工具對自動依賴項(xiàng)的管理,并介紹了Maven版本和快照依賴項(xiàng)。 它還解釋了快照依賴項(xiàng)的優(yōu)勢如何在構(gòu)建可復(fù)制性和構(gòu)建管道的背景下值得商de。
以下博客文章將探討TeamCity構(gòu)建鏈和Artifactory構(gòu)建隔離,這些構(gòu)建隔離允許在整個構(gòu)建鏈中使用一致,可重現(xiàn)和最新的快照版本,而無需在構(gòu)建腳本中鎖定其時間戳。 還有更多!
參考:來自Goldman ++博客的JCG合作伙伴 Evgeny Goldin的Maven Build Dependencies 。
翻譯自: https://www.javacodegeeks.com/2012/05/maven-build-dependencies.html
總結(jié)
以上是生活随笔為你收集整理的Maven构建依赖项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 古筝a调怎么调 你都会调吗
- 下一篇: 什么是ActiveMQ?