Maven倉庫管理-Nexus

@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);css

maven 倉庫

在之前使用Ant的時候,咱們會創建一個lib目錄在存放咱們的jar包,好比項目所依賴的第三方包,每創建一個項目都要創建一個lib,不停的作 copy工做,不只是對於磁盤的浪費,並且也形成了版本管理上的麻煩。並且咱們還須要經過提交到svn上來對lib進行管理,可是svn對於這種二進制文 件的管理並不出色。java

 

Maven倉庫的初中就是爲了解決這個問題,是全部經常使用的第三方包的集中營。這樣全部的Maven項目就能夠從這個倉庫中獲取所須要的資源,Maven倉庫中對jar經過Group Id, Atifact Id, version 來管理,因此Maven項目能夠很方便的進行依賴管理。你不須要本身來管理這個龐大的資源倉庫,固然你能夠建立一個公司層面的倉庫管理器,這個我在這個章節的後面會介紹。linux

 

Maven 倉庫的兩個概念:本地倉庫和遠程倉庫web

 

本地倉庫是遠程倉庫的一個緩衝和子集,當你構建Maven項目的時候,首先會從本地倉庫查找資源,若是沒有,那麼Maven會從遠程倉庫下載到你本 地倉庫。這樣在你下次使用的時候就不須要從遠程下載了。若是你所須要的jar包版本在本地倉庫沒有,並且也不存在於遠程倉庫,Maven在構建的時候會報 錯,這種狀況可能發生在有些jar包的新版本沒有在Maven倉庫中及時更新。macos

Maven缺省的本地倉庫地址爲${user.home}/.m2/repository 。也就是說,一個用戶會對應的擁有一個本地倉庫。固然你能夠經過修改${user.home}/.m2/settings.xml 配置這個地址:
apache

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


若是你想讓全部的用戶使用統一的配置那麼你能夠修改Maven主目錄下的setting.xml:
${M2_HOME}/conf/setting.xml

還能夠經過在運行時指定目錄,可是並不推薦這麼作:windows

mvn clean install -Dmaven.repo.local=/home/juven/myrepo/ 瀏覽器

當咱們建立一個簡單的Maven項目後(只須要在pom.xml配置好依賴),運行mvn clean install就能夠把項目構建好,不須要咱們手工下載任何jar,這全靠中央倉庫的存在,它會自動從倉庫下載。這個倉庫的定義是在${M2_HOME}/lib/maven-2.0.10-uber.jar 裏面。你能夠在裏面找到/org/apache/maven/project/pom-4.0.0.xml 這個文件,在這個文件裏面定義了中央倉庫的地址:
tomcat

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


POM 中配置遠程倉庫安全

 

下面我介紹下如何在pom.xml裏面配置遠程倉庫,咱們須要在何時配置遠程倉庫呢?當你鏈接中央倉庫的速度比較慢時,或者你爲你的公司搭建了 本身的倉庫,好比Nexus倉庫管理(後面我會介紹),又或者你蘇須要的jar存在另一個公共倉庫,好比咱們配置一個國內的鏡像地址:

 

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

 

 

這裏咱們能夠看到,容許配置多個repository和 plugin repository,<releases><enabled>true</enabled>< /releases>告訴Maven能夠從這個倉庫下載releases版本的構件, 而<snapshots><enabled>false</enabled></snapshots> 告訴Maven不要從這個倉庫下載snapshot版本的構件,之因此不讓你從這個倉庫下載snapshot版本,是由於這些版本是不穩定的,可是 snapshot版本在咱們內部項目開發的時候但是做用巨大,後面的問文章我會討論這個問題。至 於<pluginRepositories>,這是配置Maven從什麼地方下載插件構件,Maven的全部行爲都是經過插件來完成的,其內 部配置與<repository>相似,這裏就很少說了。

儘管pom.xml中能夠方便的哦配置中央倉庫,可是我並不推薦你們這麼作,尤爲是在大的公司中,由於一個公司會有不少的項目,若是每一個項目都這樣配置,那麼又開始作重複的copy工做了,如何解決呢,咱們往下走

 

settings.xml 中配置遠程倉庫

 

Pom.xml的做用範圍是一個項目,一個公司不可能只作一個項目,那麼爲了不重複配置,那麼咱們須要把一些公共信息配置在 setting.xml中。可是setting.xml中並不支持<repositories> 及<pluginRepositories>,爲了解決這個問題咱們使用profile:

<settings>    
  …    
  <profiles>    
    <profile>    
      <id> myProfiel</id>    
      <!—在這裏加入<repositories><pluginRepositories>–>   
    </profile>    
  </profiles>    
  <activeProfiles>    
    <activeProfile> myProfiel </activeProfile>    
  </activeProfiles>    
  …    
</settings>    

 


這裏經過<activeProfile>元素來激活這個profile,這樣咱們就能夠全局的使用這個配置,再也不須要爲每一個POM作重複的配置了。


Maven Profiles
Maven中的profile是一組可選的配置,能夠用來設置或者覆蓋配置默認值。有了profile,你就能夠爲不一樣的環境定製構建。profile可 以在pom.xml中配置,並給定一個id。而後你就能夠在運行Maven的時候使用的命令行標記告訴Maven運行特定profile中的目標。如下 pom.xml使用production profile覆蓋了默認的Compiler插件設置。 

在實際的操做過程當中,這裏咱們最好不要配置遠程倉庫,最好可以經過nexus創建公司或者組織本身的倉庫,而後這把把地址指向本身的倉庫,後面我會介紹爲何要這麼作,怎麼作。

<profiles> 
   <profile> 
     <id>production</id> 
     <build> 
       <plugins> 
         <plugin> 
           <groupId>org.apache.maven.plugins</groupId> 
           <artifactId>maven-compiler-plugin</artifactId> 
           <configuration> 
             <debug>false</debug> 
             <optimize>true</optimize> 
           </configuration> 
         </plugin> 
       </plugins> 
     </build> 
   </profile> 
</profiles>

 


要使用production profile來運行mvn install,你須要在命令行傳入-Pproduction參數。要驗證production profile覆蓋了默認的Compiler插件配置,能夠像這樣以開啓調試輸出(-X) 的方式運行Maven。

若是你開始大量使用Maven profile,你會但願將profile從POM中分離,使用一個單獨的文件如profiles.xml。你能夠混合使用定義在pom.xml中和外部 profiles.xml文件中的profile。只須要將profiles元素放到${basedir}目錄下的profiles.xml文件中,而後 照常運行Maven就能夠。profiles.xml文件的大概內容以下

<profiles> 
    <profile> 
      <id>development</id> 
      <build> 
        <plugins> 
          <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <configuration> 
              <debug>true</debug> 
              <optimize>false</optimize> 
            </configuration> 
          </plugin> 
        </plugins> 
      </build> 
    </profile> 
    <profile> 
      <id>production</id> 
      <build> 
        <plugins> 
          <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-compiler-plugin</artifactId> 
            <configuration> 
              <debug>false</debug> 
              <optimize>true</optimize> 
            </configuration> 
          </plugin> 
        </plugins> 
      </build> 
    </profile> 
</profiles>


settings profile能夠應用到全部你使用Maven構建的項目。你能夠在兩個地方定義settings profile:定義在~/.m2/settings.xml中的用戶特定settings profile,或者定義在${M2_HOME}/conf/settings.xml中的全局settings profile。

配置鏡像

 

若是你想覆蓋中央倉庫的默認地址,那麼這裏咱們就會使用的鏡像了,還在setting.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>  

 



這裏解釋一下<mirrorOf>,表示只爲central倉庫作鏡像,若是想爲全部的倉庫作鏡像那麼能夠改成:<mirrorOf>*</mirrorOf>
若是你看到這裏,請先不要着急,實際的項目經驗告訴我,只是這些還不夠,咱們須要更快捷和高效的管理:

利用 Nexus 來構建企業級 Maven 倉庫
Nexus是Maven倉庫管理器,用來搭建一個本地倉庫服務器,這樣作的好處是便於管理,節省網絡資源,速度快,還有一個很是有用的功能就是能夠經過項目的SNAPSHOT版本管理,來進行模塊間的高效依賴開發,下面會一一描述。

 

雖然你能夠經過中央倉庫來獲取你所須要的jar包,可是現實每每是存在不少問題:

  1. 網速慢,你可能須要花很長的時間來下載你所須要的jar
  2. 若是你的公司很大,有幾百甚至幾千人再用Maven,那麼這些人都去經過中央倉庫來獲取jar,那麼這是一個很大的資源浪費
  3. 若是存在模塊之間的依賴開發,你的snapshot版本是不可以被你的夥伴很方便的獲取。
  4. 在實際開發過程當中,有些jar的版本可能在中央倉庫裏面不存在,或者更新不及時,你是獲取不到這個jar的。

全部以上問題,經過Nexus這個日益流行的倉庫管理器能夠輕鬆的解決。

    1. 這個倉庫是本地的,下載的速度是從遠程下載不可比的。
    2. 能夠爲你公司全部的Maven使用者服務,能夠進行統一管理
    3. 後面我會介紹如何經過nexus來進行存在模塊依賴的項目的開發
    4. 你能夠添加本身的第三方包。 

安裝 Nexus

 

咱們從http://nexus.sonatype.org/downloads/ 來獲取最新版本,目前最新版本爲1.3.4

Nexus提供了兩種安裝方式,一種是內嵌Jetty的bundle,只要你有JRE就能直接運行。第二種方式是WAR,你只須簡單的將其發佈到web容器中便可使用。

1)Bundle 方式安裝

解壓nexus-webapp-1.3. 4 -bundle.zip 至任意目錄,如D:/ tools ,轉到目錄D:/ tools/nexus-webapp-1.3. 4 /bin/jsw/windows-x86-32 ,運行Nexus.bat ,若是你是在linux下安裝,那麼就下載nexus-webapp-1.3. 4 -bundle. tar .gz, 解壓後轉到${NEXUS_HOME}/ nexus-webapp-1.3.3/bin/jsw/linux-x86-32,它還支持solaris,macos等操做系統。當你看到 「Started SelectChannelConnector@0.0.0.0:8081」以後,說明Nexus啓動成功了,而後打開瀏覽器,訪問 http://127.0.0.1:8081/nexus,經過admin的賬號(admin)和密碼(admin123)登陸你會看到以下的頁面:


若是有新版本發佈,會有提示在默認頁面上。

這裏,能夠管理倉庫,配置Nexus系統,管理任務,管理用戶,角色,權限,查看系統的RSS源,管理及查看系統日誌,等等。

War 方式安裝

 

你能夠同過war的方式以web應用的形式發佈到你的應用服務器,好比tomcat。你所要作的就是下載war版本的文件,而後放到應用服務器的發佈目錄便可,這裏就很少講了。

 

到此咱們已經安裝好Nexus,下面我來介紹下一些咱們經常使用的功能和使用:

 

配置 中央倉庫



    在左邊菜單欄裏選擇Repositories,而後會出現右邊的畫面,右邊上半部分是列出來的repository,黑體字是類型爲group的repository. 這裏簡單介紹下幾種repository的類型:

  • hosted,本地倉庫,一般咱們會部署本身的構件到這一類型的倉庫。好比公司的第二方庫。
  • proxy,代理倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫。
  • group,倉庫組,用來合併多個hosted/proxy倉庫,當你的項目但願在多個repository使用資源時就不須要屢次引用了,只須要引用一個group便可。

Maven central是Maven的中央倉庫,點擊它並選擇configuration標籤欄,咱們會看到下面的頁面


這裏有幾個項目是咱們可能會常常用到的:

  1. Override local storage location: 在這個選項你能夠配置你的Nexus本地倉庫的存放地址,用來覆蓋其默認的存放地址
  2. Remote storage location: 這裏是遠程倉庫的地址,爲了提升代理速度,你能夠修改成國內的鏡像地址。默認值是http://repo1.maven.org/maven2/

Download remote indexes: 這裏配置是否下載遠程索引文件,模式是false, 建議配置爲true,這樣咱們即可以經過索引文件來搜索咱們須要的構件


添加代理倉庫

 

Maven central是一個比較大的代理倉庫,若是你須要添加的一個代理倉庫,那麼能夠在點擊左邊慘淡欄裏面的Repositories,而後右邊的頁面點擊add -> add proxy repository, 以後出現如下頁面:

 

 

填寫相關信息保存便可。一般狀況下,使用預設的代理倉庫已經可以知足大部分項目的需求了, 只有在特殊需求的狀況下才會參加代理倉庫.

 

管理本地倉庫

 

咱們前面講到類型爲hosted的爲本地倉庫,Nexus預約義了3個本地倉庫,分別是Releases, Snapshots, 3rd Party. 分別講一下這三個預置的倉庫都是作什麼用的:

  1. Releases: 這裏存放咱們本身項目中發佈的構建, 一般是Release版本的, 好比咱們本身作了一個FTP Server的項目, 生成的構件爲ftpserver.war, 咱們就能夠把這個構建發佈到Nexus的Releases本地倉庫. 關於符合發佈後面會有介紹.
  2. Snapshots: 這個倉庫很是的有用, 它的目的是讓咱們能夠發佈那些非release版本, 非穩定版本, 好比咱們在trunk下開發一個項目,在正式release以前你可能須要臨時發佈一個版本給你的同伴使用, 由於你的同伴正在依賴你的模塊開發, 那麼這個時候咱們就能夠發佈Snapshot版本到這個倉庫, 你的同伴就能夠經過簡單的命令來獲取和使用這個臨時版本.
  3. 3rd Party: 顧名思義, 第三方庫, 你可能會問不是有中央倉庫來管理第三方庫嘛, 沒錯, 這裏的是指可讓你添加本身的第三方庫, 好比有些構件在中央倉庫是不存在的. 好比你在中央倉庫找不到Oracle 的JDBC驅動, 這個時候咱們就須要本身添加到3rd party倉庫.

你也能夠建立本身的本地倉庫,點擊Repository面板上方的Add按鈕,而後選擇Hosted Repository,而後在下方的配置面板中輸入相關信息, 這裏咱們再也不須要填寫遠程倉庫地址,根據本身的須要選擇Release或者Snapshot,如圖:  


Maven 倉庫組

 

倉庫組的概念是Maven沒有的,經過前面介紹能夠了解到, 咱們能夠創建多個proxy代理倉庫,hosted本地倉庫, 若是沒有倉庫組的概念,咱們若是須要引用這些倉庫的是時候須要一一加入到咱們的setting.xml裏面去, 有了倉庫的組的概念, 咱們只須要作一次引用就能夠了,把咱們須要的倉庫加入到倉庫組便可.像這樣:

<repositories>
     <repository>
           <id>nexus</id>                                           
           <url>http://127.0.0.1:8081/nexus/content/groups/public/</url>                       
           <releases>
           <enabled>true</enabled>
    </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
    </repository>
</repositories>

 


Nexus中預設了2個倉庫組,public repositories和public snapshot repositories. 如圖:



倉庫組默認包含本地倉庫Releases, snapshots, 3rd party和代理倉庫Maven Central. 你能夠在Configuration配置頁添加倉庫到這個倉庫組. 若是須要你還能夠建立一個倉庫組,如圖:

點擊 Add->Repository Group

出現New Repository Group界面後,填入ID, name 等相關信息, 在右邊Available Repositories 欄裏能夠選擇你要添加的倉庫到你新建的倉庫組.  





好多公司處於安全考慮,用代理上網,而nexus 常常須要往maven repository中心下載東西,因此須要給nexus設置代理。 開始沒找到地方,後來發現能夠從nexus後臺管理器界面上直接設置,地方很隱蔽:

登錄後進入管理頁面,從左邊菜單欄選擇Server 打開右邊tab頁,發現仍是找不到,彆着急,仔細找會發現有行: default http proxy settings   前面有個checkbox 未勾選, 速度勾選之,立刻出現了您熟悉的  proxy host,proxy port , username , passowrd.  okay 代理設置完成,如今nexus能經過互聯網從maven repository中心下載東西了!


經過 Nexus 搜索構件

 

在咱們實際使用構件的過程當中一般遇到一個問題,有時候我牢牢知道我所須要的構建的大體名字,並不知道全稱或group id, 這是件很是頭疼的事情. Nexus基於Nexus indexer的搜索功能幫咱們解決了這個問題.

要是用搜索功能, 必需要有索引文件, Nexus默認是不創建索引文件的,由於像中央倉庫這樣的索引文件的創建須要耗費比較大的網絡資源,僅索引文件就要幾十兆. 要開啓中央倉庫的索引文件下載功能須要在Maven Central的配置頁面, 把Download Remote Indexes選擇true. 如圖:


這樣設置之後, Nexus會自動從遠程中央倉庫下載索引文件, 爲了檢驗索引文件自動下載是否生效,能夠卻換到Browse:


若是出現先以上文件夾,那說明索引文件已經創建.

下面我試一下搜索功能, 在左邊菜單欄裏面有個Artifact Search, 在輸入框裏面輸入你想要搜索的構件名字,好比: testing, 那麼查詢結果以下:

這是模糊查詢的結果,固然若是你知道更多信息,好比版本號等,你可使用高級搜索,點擊高級搜索後,右邊界面會提供集中搜索方式:keyword, classname, GAV, checksum


好比咱們這裏選擇GAV模式, 並且我只知道artiface name : testng和版本號5.8, 其餘的我不知道, 那麼就在artifact 和 version處分別輸入testng 和 5.8 , 搜索結果以下:


你若是你不知道知道構件的名稱, 只知道classname, 那麼你也能夠經過class name 的方式搜索,這裏就再也不贅述

當你選擇一項搜索結果,在頁面的下方會出現這個構件的詳細信息, 而且會列出這個構件的Maven依賴配置, 你能夠直接拷貝到你的pom文件中使用,這是個很是實用的功能:


Maven 中使用 Nexus

到此爲止咱們介紹瞭如何安裝和使用Nexus以及其基本配置, 下面咱們介紹下如何讓Maven來使用Nexus本地倉庫用來替代使用遠程倉庫. 在Maven使用Nexus本地倉庫只需稍做配置, 在settings.xml中加入如下代碼:

<profile>
       <id>dev</id>
          <repositories>
             <repository>
                 <id>nexus</id>
                 <url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
                 <releases>
                    <enabled>true</enabled>
                 </releases>
                 <snapshots>
                    <enabled>true</enabled>
                 </snapshots>
              </repository>
            </repositories>            
            <pluginRepositories>
                <pluginRepository>
                    <id>nexus</id>
                    <url>http://127.0.0.1:8081/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                   </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>

    <activeProfiles>
        <activeProfile>dev</activeProfile>
    </activeProfiles>

 


這裏配置了repository和pluginRepository, Maven在使用第三方構件和插件時是分開來配置的,因此若是咱們也但願插件的下載也經過咱們的本地倉庫來下載,那麼咱們就須要配置pluginRepository.

紅色字體部分就是咱們以前安裝的Nexus的地址, 這個地址能夠是大家公司局域網內部的一臺倉庫服務器.

<releases> <enabled>true</enabled></releases>這個標籤的做用是設定是否容許下載

release版本的載構件, 一樣snapshots標籤能夠設定是否容許下載snapshot版本的構件.

一般,咱們不建議下載snapshot版本的構件,由於它是不穩定的版本, 除非你有特殊的需求

構件部署

 

 

有些時候咱們須要部署構件到Nexus的3rd party, 好比咱們在中央倉庫找不到咱們須要的構件, 咱們能夠經過Nexus的UI來上傳構件:

點擊左邊菜單欄的 Repositories, 而後點擊右邊界面的3rd party, 選擇界面下方的Artifact Upload, 這個時候出現如下界面:



上傳構件須要兩個步驟,一個是定義文件的上傳,再就是構件的實體文件.

第一部分定義文件能夠是POM文件, 這也是比較推薦的方式, 若是沒有pom文件,能夠選擇以參數的形式輸入.第二部分是上傳構件的實體文件,這裏簡單說一下Classifier和Extension, 這兩個都是選填相, Classifier用來區別同功能的構件用於不一樣的場景, 好比這個構件是分別針對JDK14和JDK15作了2個功能同樣的Jar, 這個時候你就須要指定這個構件的Classifier爲JDK14仍是JDK15. Extension是指擴展名,若是不提供,那麼會自動取這個構件的Packaging Type做爲擴展名, 好比 ear, jar, war 等等. (Packaging Type是在第一步中經過pom文件或者手工輸入獲得的)剛纔說了3rd party的部署, 關於releases 和 snapshots的UI部署也是同樣的操做過程.咱們以前也講過, 這裏的releases和snapshots是用來部署咱們本身的項目構件的, 經過UI部署是能夠,可是不是最高效的, 咱們能夠經過配置Maven來自動部署咱們的項目構件,這也是咱們創建本身的倉庫的一個很是重要的緣由, 下面就讓咱們看看如何配置:首先須要在POM文件中加入如下代碼:

<project>    
…    
<distributionManagement>    
  <repository>    
    <id> nexus-releases</id>    
      <name> Nexus Release Repository</name>    
      <url> http://127.0.0.1:8081/nexus/content/repositories/releases/</url>    
  </repository>    
  <snapshotRepository>    
    <id> nexus-snapshots</id>    
    <name> Nexus Snapshot Repository</name>    
    <url> http://127.0.0.1:8081/nexus/content/repositories/snapshots/</url>    
  </snapshotRepository>    
</distributionManagement>    
…    
</project>    

 


這裏配置,讓Maven知道當我要發佈release版本或者snapshot版本是須要發佈到哪一個地址.

而後咱們須要在setting.xml裏面配置一下Nexus的賬號和密碼:

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

 

到此爲止, 咱們就能夠經過命令mvn deploy或者經過IDE的可視化界面點擊deploy來發布咱們項目到本地倉庫了. 經過這種方式咱們能夠很方便的進行模塊間的依賴開發, 在後面的文章中我會詳細介紹如何經過snapshot來讓咱們的依賴開發變得簡單.

相關文章
相關標籤/搜索