天天看點

maven使用總結(二)對于項目依賴:Maven 倉庫的兩個概念:利用Nexus來建構企業級 Maven倉庫:

上一篇部落格中我們大概講了maven的一些基本的概念,以及maven是如何幫助我們構件項目的。這篇部落格中我們講重點講解maven是如何幫助我們實作友善的管理項目依賴與統一的管理項目資訊。

對于項目依賴:

  • 在以前使用Ant的時候,我們會建立一個lib目錄在存放我們的jar包,比如項目所依賴的第三方包,每建立一個項目都要建立一個lib,不停的做copy工作,不僅是對于磁盤的浪費,而且也造成了版本管理上的麻煩。而且我們還需要通過送出到svn上來對lib進行管理,但是svn對于這種二進制檔案的管理并不出色。
  • Maven倉庫的初衷就是為了解決這個問題,是所有常用的第三方包的集中營。這樣所有的Maven項目就可以從這個倉庫中擷取所需要的資源,Maven倉庫中對jar通過Group Id, Atifact Id, version 來管理,是以Maven項目可以很友善的進行依賴管理。你不需要自己來管理這個龐大的資源倉庫。

Maven 倉庫的兩個概念:

本地倉庫和遠端倉庫。

  • 本地倉庫是遠端倉庫的一個緩沖和子集,當你建構Maven項目的時候,首先會從本地倉庫查找資源,如果沒有,那麼Maven會從遠端倉庫下載下傳到你本地倉庫。這樣在你下次使用的時候就不需要從遠端下載下傳了。如果你所需要的jar包版本在本地倉庫沒有,而且也不存在于遠端倉庫,Maven在建構的時候會報錯,這種情況可能發生在有些jar包的新版本沒有在Maven倉庫中及時更新。
  • Maven預設的本地倉庫位址為 user.home/.m2/repository。也就是說,一個使用者會對應的擁有一個本地倉庫。當然你可以通過修改 {user.home}/.m2/settings.xml 配置這個位址:
<settings>    
  <localRepository> D:/java/repository</localRepository>
</settings>            
  • 如果你想讓所有的使用者使用統一的配置那麼你可以修改Maven主目錄下的setting.xml:

    ${M2_HOME}/conf/setting.xml

  • 還可以通過在運作時指定目錄,但是并不推薦這麼做:

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

  • 當我們建立一個簡單的Maven項目後(隻需要在pom.xml配置好依賴),運作mvn clean install就可以把項目建構好,不需要我們手工下載下傳任何jar,這全靠中央倉庫的存在,它會自動從倉庫下載下傳。這個倉庫的定義是在${M2_HOME}/lib/maven-model-builder-3.2.3.jar 裡面。你可以在裡面找到/org/apache/maven/project/pom-4.0.0.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>             
  • 我們知道Maven在建立項目的時候是基于Maven項目下的pom.xml進行的,我們項目依賴的資訊和一些基本資訊都是在這個檔案裡面定義的。那如果當我們有多個項目要進行,這多個項目有些配置内容是相同的,有些是要彼此關聯的,那如果按照傳統的做法的話我們就需要在多個項目中都定義這些重複的内容。這無疑是非常耗費時間和不易維護的。好在Maven給我們提供了一個pom的繼承和聚合的功能。
  • 對于使用java的人而言,繼承這個詞大家應該都不陌生。要繼承pom就需要有一個父pom,在Maven中定義了超級pom.xml,任何沒有申明自己父pom.xml的pom.xml都将預設繼承自這個超級pom.xml(超級pom的内容這裡就不再展示了,讀者自己去看)
  • 對于一個pom.xml來說有幾個元素是必須定義的,一個是project根元素,然後就是它裡面的modelVersion、groupId、artifactId和version。由上面的超級pom.xml的内容我們可以看到pom.xml中沒有groupId、artifactId和version的定義,是以我們在建立自己的pom.xml的時候就需要定義這三個元素。和java裡面的繼承類似,子pom.xml會完全繼承父pom.xml中所有的元素,而且對于相同的元素,一般子pom.xml中的會覆寫父pom.xml中的元素,但是有幾個特殊的元素它們會進行合并而不是覆寫。這些特殊的元素是:
    • Dependencies
    • Developers
    • Contributors
    • plugin清單,包括plugin下面的reports
    • Resources
  • 有時候我們需要自己配置遠端倉庫位址。我們需要在什麼時候配置遠端倉庫呢?當你連接配接中央倉庫的速度比較慢時,或者你為你的公司搭建了自己的倉庫,比如Nexus倉庫管理(後面我會介紹),又或者你蘇需要的jar存在另外一個公共倉庫
  • 盡管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>           
  • 這裡通過元素來激活這個profile,這樣我們就可以全局的使用這個配置,不再需要為每個POM做重複的配置了。

總結一下直接使用中央倉庫擷取你所需要的jar包會出現的問題:

  • 雖然你可以通過中央倉庫來擷取你所需要的jar包,但是現實往往是存在很多問題:
    • 網速慢,你可能需要花很長的時間來下載下傳你所需要的jar
    • 如果你的公司很大,有幾百甚至幾千人再用Maven,那麼這些人都去通過中央倉庫來擷取jar,那麼這是一個很大的資源浪費
    • 如果存在子產品之間的依賴開發,你的snapshot版本是不能夠被你的夥伴很友善的擷取。
    • 在實際開發過程中,有些jar的版本可能在中央倉庫裡面不存在,或者更新不及時,你是擷取不到這個jar的。

利用Nexus來建構企業級 Maven倉庫:

  • 所有以上問題,通過Nexus這個日益流行的倉庫管理器可以輕松的解決。

    這個倉庫是本地的,下載下傳的速度是從遠端下載下傳不可比的。

    • 可以為你公司所有的Maven使用者服務,可以進行統一管理
    • 後面我會介紹如何通過nexus來進行存在子產品依賴的項目的開發
    • 你可以添加自己的第三方包。
  • Nexus是Maven倉庫管理器,用來搭建一個本地倉庫伺服器,這樣做的好處是便于管理,節省網絡資源,速度快,還有一個非常有用的功能就是可以通過項目的SNAPSHOT版本管理,來進行子產品間的高效依賴開發。Nexus的教程這裡就不展示了。

jar包依賴:

  • 有了遠端倉庫我們就可以友善的擷取項目中所需要的jar包了,現在可以痛快的說說依賴了。
  • 依賴的解決實際是Maven在classpath中添加相應的包。Maven項目的依賴由pom.xml中的元素設定。dependency元素中常用的子元素包括:
    • groupId、artifactId、version:依賴的基本坐标。
    • type:依賴的類型,對應于坐标的packaging。一般無需聲明,預設為jar。
    • scope:依賴的範圍。
    • optional:是否為可選依賴。
    • exclusions:用于排除傳遞性依賴。

繼續閱讀