maven如何修改本地倉庫與中央倉庫
什麼是Maven倉庫
在不用Maven的時候,比如說以前我們用Ant構建專案,在專案目錄下,往往會看到一個名為/lib的子目錄,那裡存放著各類第三方依賴jar檔案,如 log4j.jar,junit.jar等等。每建立一個專案,你都需要建立這樣的一個/lib目錄,然後複製一對jar檔案,這是很明顯的重複。重複永 遠是噩夢的起點,多個專案不共用相同的jar檔案,不僅會造成磁碟資源的浪費,也使得版本的一致性管理變得困難。此外,如果你使用版本管理工具,如 SVN(你沒有使用版本管理工具?馬上試試SVN吧,它能幫你解決很多頭疼的問題),你需要將大量的jar檔案提交到程式碼庫裡,可是版本管理工具在處理二 進位制檔案方面並不出色。
Maven倉庫就是放置所有JAR檔案(WAR,ZIP,POM等等)的地方,所有Maven專案可以從同一個Maven倉庫中獲取自己所需要的依賴 JAR,這節省了磁碟資源。此外,由於Maven倉庫中所有的JAR都有其自己的座標,該座標告訴Maven它的組ID,構件ID,版本,打包方式等等, 因此Maven專案可以方便的進行依賴版本管理。你也不在需要提交JAR檔案到SCM倉庫中,你可以建立一個組織層次的Maven倉庫,供所有成員使用。
簡言之,Maven倉庫能幫助我們管理構件(主要是JAR)。
本地倉庫 vs. 遠端倉庫
執行Maven的時候,Maven所需要的任何構件都是直接從本地倉庫獲取的。如果本地倉庫沒有,它會首先嚐試從遠端倉庫下載構件至本地倉庫,然後再使用本地倉庫的構件。
比如說,你的專案配置了junit-3.8的依賴,在你執行mvn test 的 時候,Maven需要使用junit-3.8的jar檔案,它首先根據座標查詢本地倉庫,如果找到,就直接使用。如果沒有,Maven會檢查可用的遠端倉 庫配置,然後逐個嘗試這些遠端倉庫去下載junit-3.8的jar檔案,如果遠端倉庫存在該檔案,Maven會將其下載到本地倉庫中,繼而使用。如果嘗 試過所有遠端倉庫之後,Maven還是沒能夠下載到該檔案,它就會報錯。
Maven預設的本地倉庫地址為${user.home}/.m2/repository 。也就是說,一個使用者會對應的擁有一個本地倉庫。
你也可以自定義本地倉庫的位置,修改${user.home}/.m2/settings.xml
Xml程式碼
1 2 3 4 5 |
< settings >
...
< localRepository >D:\java\repository</ localRepository >
...
</ settings >
|
你還可以在執行時指定本地倉庫位置:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
還有一點需要理解的是,當我們執行install的時候,Maven實際上是將專案生成的構件安裝到了本地倉庫,也就是說,只有install了之後,其它專案才能使用此專案生成的構件。
瞭解了本地倉庫,接著瞭解一下Maven預設的遠端倉庫,即Maven中央倉庫。
安裝好Maven之後,我們可以建立一個簡單的專案,配置一些簡單的依賴,然後執行mvn clean install,專案就構建好了。我們沒有手工的去下載任何jar檔案,這一切都是因為Maven中央倉庫的存在,當Maven在本地倉庫找不到需要的 jar檔案時,它會查詢遠端倉庫,而一個原始的Maven安裝就自帶了一個遠端倉庫——Maven中央倉庫。
這個Maven中央倉庫是在哪裡定義的呢?在我的機器上,我安裝了maven-2.0.10,我可以找到這個檔案:${M2_HOME}/lib/maven-2.0.10-uber.jar ,開啟該檔案,能找到超級POM:\org\apache\maven\project\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven專案繼承該配置,你可以在這個POM中發現如下配置:
Xml程式碼
-
1 2 3 4 5 6 7 8 9 10 11 <
repositories
>
<
repository
>
<
id
>central</
id
>
<
name
>Maven Repository Switchboard</
name
>
<
layout
>default</
layout
>
<
url
>http://repo1.maven.org/maven2</
url
>
<
snapshots
>
<
enabled
>false</
enabled
>
</
snapshots
>
</
repository
>
</
repositories
>
關於遠端倉庫的配置,下面的小節我會詳細解釋,這裡我們只要知道,中央倉庫的id為central,遠端url地址為http://repo1.maven.org/maven2,它關閉了snapshot版本構件下載的支援。
在POM中配置遠端倉庫
前面我們看到超級POM配置了ID為central的遠端倉庫,我們可以在POM中配置其它的遠端倉庫。這樣做的原因有很多,比如你有一個區域網的遠端倉 庫,使用該倉庫能大大提高下載速度,繼而提高構建速度,也有可能你依賴的一個jar在central中找不到,它只存在於某個特定的公共倉庫,這樣你也不 得不新增那個遠端倉庫的配置。
這裡我配置一個遠端倉庫指向中央倉庫的中國映象:
Xml程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
< project >
...
< repositories >
< repository >
< id >maven-net-cn</ id >
< name >Maven China Mirror</ name >
< url >http://maven.net.cn/content/groups/public/</ url >
< releases >
< enabled >true</ enabled >
</ releases >
< snapshots >
< enabled >false</ enabled >
</ snapshots >
</ repository >
</ repositories >
< pluginRepositories >
< pluginRepository >
< id >maven-net-cn</ id >
< name >Maven China Mirror</ name >
< url >http://maven.net.cn/content/groups/public/</ url >
< releases >
< enabled >true</ enabled >
</ releases >
< snapshots >
< enabled >false</ enabled >
</ snapshots >
</ pluginRepository >
</ pluginRepositories >
...
</ project >
|
關於<repositories>的更詳細的配置及相關解釋,請參考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。
至於<pluginRepositories>,這是配置Maven從什麼地方下載外掛構件(Maven的所有實際行為都由其外掛完成)。該元素的內部配置和<repository>完全一樣,不再解釋。
在settings.xml中配置遠端倉庫
我們知道了如何在POM中配置遠端倉庫,但考慮這樣的情況:在一個公司內部,同時進行這3個專案,而且以後隨著這幾個專案的結束,越來越多的專案會開始; 同時,公司內部建立一個Maven倉庫。我們統一為所有這些專案配置該倉庫,於是不得不為每個專案提供同樣的配置。問題出現了,這是重複 !
其實我們可以做到只配置一次,在哪裡配置呢?就是settings.xml。
不過事情沒有那麼簡單,不是簡單的將POM中的<repositories>及<pluginRepositories>元素複製到settings.xml中就可以,setting.xml不直接支援 這兩個元素。但我們還是有一個並不複雜的解決方案,就是利用profile,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
< settings >
...
< profiles >
< profile >
< id >dev</ id >
<!-- repositories and pluginRepositories here-->
</ profile >
</ profiles >
< activeProfiles >
< activeProfile >dev</ activeProfile >
</ activeProfiles >
...
</ settings >
|
-
使用profile為settings.xml新增倉庫提供了一種使用者全域性範圍的倉庫配置。
映象
如果你的地理位置附近有一個速度更快的central映象,或者你想覆蓋central倉庫配置,或者你想為所有POM使用唯一的一個遠端倉庫(這個遠端倉庫代理的所有必要的其它倉庫),你可以使用settings.xml中的mirror配置。
以下的mirror配置用maven.net.cn覆蓋了Maven自帶的central:
Xml程式碼
1 2 3 4 5 6 7 8 9 10 11 12 |
< settings >
...
< mirrors >
< mirror >
< id >maven-net-cn</ id >
< name >Maven China Mirror</ name >
< url >http://maven.net.cn/content/groups/public/</ url >
< mirrorOf >central</ mirrorOf >
</ mirror >
</ mirrors >
...
</ settings >
|
1 2 3 4 5 6 7 8 9 10 11 12 |
< settings >
...
< mirrors >
< mirror >
< id >my-org-repo</ id >
< name >Repository in My Orgnization</ name >
< url >http://192.168.1.100/maven2</ url >
< mirrorOf >*</ mirrorOf >
</ mirror >
</ mirrors >
...
</ settings >
|
-
關於更加高階的映象配置,可以參考:http://maven.apache.org/guides/mini/guide-mirror-settings.html。
分發構件至遠端倉庫
mvn install 會將專案生成的構件安裝到本地Maven倉庫,mvn deploy 用來將專案生成的構件分發到遠端Maven倉庫。本地Maven倉庫的構件只能供當前使用者使用,在分發到遠端Maven倉庫之後,所有能訪問該倉庫的使用者都能使用你的構件。
我們需要配置POM的distributionManagement來指定Maven分發構件的位置,如下:
Xml程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
< project >
...
< distributionManagement >
< repository >
< id >nexus-releases</ id >
< name >Nexus Release Repository</ name >
< url >http://127.0.0.1:8080/nexus/content/repositories/releases/</ url >
</ repository >
< snapshotRepository >
< id >nexus-snapshots</ id >
< name >Nexus Snapshot Repository</ name >
< url >http://127.0.0.1:8080/nexus/content/repositories/snapshots/</ url >
</ snapshotRepository >
</ distributionManagement >
...
</ project >
|
一般來說,分發構件到遠端倉庫需要認證,如果你沒有配置任何認證資訊,你往往會得到401錯誤。這個時候,如下在settings.xml中配置認證資訊:
Xml程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
< settings >
...
< servers >
< server >
< id >nexus-releases</ id >
< username >admin</ username >
< password >admin123</ password >
</ server >
< server >
< id >nexus-snapshots</ id >
< username >admin</ username >
< password >admin123</ password >
</ server >
</ servers >
...
</ settings >
|
小結
本文介紹了Maven倉庫,它是什麼?本地倉庫,遠端倉庫,中央倉庫具體是指什麼?並介紹瞭如何在POM中配置專案層次的倉庫,在settings中配置使用者層次的倉庫,以及mirror。本文還介紹瞭如何安裝構件到本地倉庫,如何分發構件至倉庫。