maven repository

maven repository

什麼是Maven倉庫html

在不用Maven的時候,好比說之前咱們用Ant構建項目,在項目目錄下,每每會看到一個名爲/lib的子目錄,那裏存放着各種第三方依賴 jar文件,如log4j.jar,junit.jar等等。每創建一個項目,你都須要創建這樣的一個/lib目錄,而後複製一對jar文件,這是很明顯 的重複。重複永遠是噩夢的起點,多個項目不共用相同的jar文件,不只會形成磁盤資源的浪費,也使得版本的一致性管理變得困難。此外,若是你使用版本管理 工具,如SVN(你沒有使用版本管理工具?立刻試試SVN吧,它能幫你解決不少頭疼的問題),你須要將大量的jar文件提交到代碼庫裏,但是版本管理工具 在處理二進制文件方面並不出色。java

Maven倉庫就是放置全部JAR文件(WAR,ZIP,POM等等)的地方,全部Maven項目能夠從同一個Maven倉庫中獲取本身所須要 的依賴JAR,這節省了磁盤資源。此外,因爲Maven倉庫中全部的JAR都有其本身的座標,該座標告訴Maven它的組ID,構件ID,版本,打包方式 等等,所以Maven項目能夠方便的進行依賴版本管理。你也不在須要提交JAR文件到SCM倉庫中,你能夠創建一個組織層次的Maven倉庫,供全部成員 使用。apache

簡言之,Maven倉庫能幫助咱們管理構件(主要是JAR)。maven

 

本地倉庫 vs. 遠程倉庫ide

運行Maven的時候,Maven所須要的任何構件都是直接從本地倉庫獲取的。若是本地倉庫沒有,它會首先嚐試從遠程倉庫下載構件至本地倉庫,而後再使用本地倉庫的構件。工具

好比說,你的項目配置了junit-3.8的依賴,在你運行mvn test 的時候,Maven須要使用junit-3.8的jar文件,它首先根據座標查找本地倉庫,若是找到,就直接使用。若是沒有,Maven會檢查可用的遠程 倉庫配置,而後逐個嘗試這些遠程倉庫去下載junit-3.8的jar文件,若是遠程倉庫存在該文件,Maven會將其下載到本地倉庫中,繼而使用。若是 嘗試過全部遠程倉庫以後,Maven仍是沒可以下載到該文件,它就會報錯。ui

Maven缺省的本地倉庫地址爲${user.home}/.m2/repository 。也就是說,一個用戶會對應的擁有一個本地倉庫。url

你也能夠自定義本地倉庫的位置,修改${user.home}/.m2/settings.xml :spa

Xml代碼 .net

 

<settings>  

  ...   

  <localRepository>D:/java/repository</localRepository>  

  ...   

</settings>  

[xml] view plaincopy

 

<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代碼 

 

<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>  

[xml] view plaincopy

 

<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代碼 

 

<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>  

[xml] view plaincopy

 

<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>的配置,你能夠在它下面添加多個<repository> ,每一個<repository>都有它惟一的ID,一個描述性的name,以及最重要的,遠程倉庫的url。此 外,<releases><enabled>true</enabled></releases>告訴 Maven能夠從這個倉庫下載releases版本的構件, 而<snapshots><enabled>false</enabled></snapshots> 告訴Maven不要從這個倉庫下載snapshot版本的構件。禁止從公共倉庫下載snapshot構件是推薦的作法,由於這些構件不穩定,且不受你控 制,你應該避免使用。固然,若是你想使用局域網內組織內部的倉庫,你能夠激活snapshot的支持。

關於<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,以下:

Xml代碼 

 

<settings>  

  ...   

  <profiles>  

    <profile>  

      <id>dev</id>  

      <!-- repositories and pluginRepositories here-->  

    </profile>  

  </profiles>  

  <activeProfiles>  

    <activeProfile>dev</activeProfile>  

  </activeProfiles>  

  ...   

</settings>  

[xml] view plaincopy

 

<settings>  

  ...  

  <profiles>  

    <profile>  

      <id>dev</id>  

      <!-- repositories and pluginRepositories here-->  

    </profile>  

  </profiles>  

  <activeProfiles>  

    <activeProfile>dev</activeProfile>  

  </activeProfiles>  

  ...  

</settings>  

這裏咱們定義一個id爲dev的profile,將全部repositories以及pluginRepositories元素放到這個 profile中,而後,使用<activeProfiles>元素自動激活該profile。這樣,你就不用再爲每一個POM重複配置倉庫。

使用profile爲settings.xml添加倉庫提供了一種用戶全局範圍的倉庫配置。

 

鏡像

若是你的地理位置附近有一個速度更快的central鏡像,或者你想覆蓋central倉庫配置,或者你想爲全部POM使用惟一的一個遠程倉庫(這個遠程倉庫代理的全部必要的其它倉庫),你可使用settings.xml中的mirror配置。

如下的mirror配置用maven.net.cn覆蓋了Maven自帶的central:

Xml代碼 

 

<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>  

[xml] view plaincopy

 

<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>  

 

這裏惟一須要解釋的是<mirrorOf>,這裏咱們配置central的鏡像,咱們也能夠配置一個全部倉庫的鏡像,以保證該鏡像是Maven惟一使用的倉庫:

Xml代碼 

 

<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>  

[xml] view plaincopy

 

<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代碼 

 

<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>  

 

[xml] view plaincopy

 

<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>  

 

Maven區別對待release版本的構件和snapshot版本的構件,snapshot爲開發過程當中的版本,實時,但不穩定,release版本則比較穩定。Maven會根據你項目的版原本判斷將構件分發到哪一個倉庫。

通常來講,分發構件到遠程倉庫須要認證,若是你沒有配置任何認證信息,你每每會獲得401錯誤。這個時候,以下在settings.xml中配置認證信息:

Xml代碼 

 

<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>  

[xml] view plaincopy

 

<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>  

須要注意的是,settings.xml中server元素下id的值必須與POM中repository或 snapshotRepository下id的值徹底一致。將認證信息放到settings下而非POM中,是由於POM每每是它人可見的,而 settings.xml是本地的。

 

小結

本文介紹了Maven倉庫,它是什麼?本地倉庫,遠程倉庫,中央倉庫具體是指什麼?並介紹瞭如何在POM中配置項目層次的倉庫,在settings中配置用戶層次的倉庫,以及mirror。本文還介紹瞭如何安裝構件到本地倉庫,如何分發構件至倉庫。

相關文章
相關標籤/搜索