maven坐標
maven的構件(jar包)是根據坐標來確定其在倉庫的保存位置的。
maven的坐標是通過以下元素來定義的:
- groupId : 一般是當前項目的公司名和項目組
- artifactId : 項目名稱
- version : 項目版本
- packaging : 打包方式,默認是
jar
,也可以是war
- classifier : 定義構建輸出的一些附屬構件,不常用
形如
<groupId>com.company.group</groupId>
<artifactId>MyApp</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
maven倉庫
顧名思義,倉庫就是存放依賴(jar包)的地方。
maven倉庫分為本地倉庫
,中央倉庫
,遠程倉庫
,和私服
4種。
本地倉庫
通俗的說,本地倉庫就是我們本地電腦中的一個文件夾,用來存放jar包的倉庫。
本地倉庫的默認位置:無論是Windows還是Linux,在用戶的目錄下都有一個.m2/repository/的倉庫目錄。
可通過修改maven安裝目錄下的settings.xml文件來修改本地倉庫位置。
<settings>
<localRepository>D:\repo</localRepository>
</settings>
中央倉庫
中央倉庫是默認的遠程倉庫,它包含了絕大多數流行的開源Java構件,以及源碼、作者信息、SCM、信息、許可證信息等。id是central,url地址是http://repo1.maven.org/maven2
遠程倉庫
在很多情況下,默認的中央倉庫無法滿足項目的需求,可能項目需要的構件存在于另外一個遠程倉庫中,如:JBoss,Maven倉庫。這時,可以在POM中配置該倉庫,比如:
<project>
...
<repositories>
<repository>
<id>jboss</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
<releases>
<!-- 更新頻率never,always,interval,daily -->
<updatePolicy>daily</updatePolicy>
<enabled>true</enabled>
<!-- 檢查和檢驗文件的策略,fail,warn,ignore -->
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repositories>
...
</project>
在repositories元素下,用repository子元素聲明一個或者多個遠程倉庫。該例中聲明了一個id為jboss,名稱為JBoss Repository的倉庫。任何一個倉庫聲明的id必須是唯一的,尤其需要注意的是,maven自帶的中央倉庫使用的id為central
,如果其他的倉庫聲明也使用該id,就會覆蓋中央倉庫的配置。該配置中的url值指向了倉庫的地址,一般來說,該地址都基于http協議,maven用戶都可以在瀏覽器中打開倉庫地址瀏覽構件。
該例配置中的releases和snapshots元素比較重要,它們用來控制Maven對于發布版構件和快照版構件的下載。該例中releases的enabled值為true,表示開啟JBoss倉庫的發布版本下載支持,而snapshots的enabled值為false,表示關閉JBoss倉庫的快照版本的下載支持。該例中的layout元素值default表示倉庫的布局是Maven2及Maven3的默認布局,而不是Maven1的布局。
遠程倉庫的認證
遠程倉庫默認無須認證就可訪問,有時出于安全需要,可配置認證訪問。
配置認證信息和配置倉庫信息不同,倉庫信息可以直接配置在POM文件中,但是認證信息必須配置在settings.xml文件中。這是因為POM往往是被提交到代碼倉庫中供所有成員訪問的,而settings.xml一般只放在本機。因此,settings.xml中配置認證信息更為安全。
假設為id為my-proj的倉庫配置認證信息,編輯settings.xml文件如下:
<settings>
...
<servers>
<server>
<id>my-proj</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>
** 注:settings.xml中server元素的id必須與POM中需要認證的repository元素的id完全一致。 **
私服
私服是架設在局域網的特殊遠程倉庫。一般maven自己的中央倉庫存放了主流的jar包,但是有時候自己的編寫的jar包就沒辦法在中央倉庫找到了,這時候就需要配置一個遠程倉庫,就是所謂的“私服”,就可以將我們自己的jar包存放到遠程倉庫中,這樣當maven需要下載jar包的時候,就可以先請求私服,如果私服上找不到,就會從maven的中央倉庫再下載,之后也會緩存在私服上供以后使用。
鏡像
這里另外說一下鏡像。國內訪問國外的倉庫,你懂的,所以有必要配置鏡像。在maven安裝目錄下的settings.xml配置文件中,可以配置鏡像,在<Mirrors>
元素中,可配置一個或多個<mirror>
鏡像。比如:
<mirror>
<id>nexus-osc</id>
<mirrorOf>central</mirrorOf>
<name>Nexus osc</name>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
mirrorOf
中寫的是哪個倉庫的鏡像,例子中表明是中央倉庫的鏡像,這樣,一切往中央倉庫的請求,都會轉發到去請求這個鏡像的地址。所以,mirrorOf
中不能亂寫。
鏡像也可以配置基于id的倉庫認證。
mirrorOf
中可以寫*
,表示對一切的請求都會轉到這個鏡像。
** 為了滿足復雜的規則,maven支持高級的鏡像配置: **
-
<mirrorOf>*<mirrorOf>
: 匹配所有倉庫 -
<mirrorOf>external:*<mirrorOf>
: 匹配所有不在本機上的遠程倉庫 -
<mirrorOf>repo1,repo2<mirrorOf>
: 匹配repo1和repo2,多個倉庫用逗號隔開 -
<mirrorOf>*,!repo3<mirrorOf>
: 匹配所有倉庫,除了repo3
*
匹配所有,這個鏡像建議放在最后,否則maven循環匹配,匹配到第一個就是,滿足,直接就結束了,其他鏡像就不生效了。*
倉庫搜索
在工作中,我們需要知道摸個依賴的坐標來使用,可以使用倉庫搜索。
附上幾個常用的搜索地址:
最后總結:
在pom中加入依賴聲明后,maven會優先根據坐標去我們本地倉庫查找,如果找到就用了。如果找不到,就會默認去中央倉庫查找,然后下載到本地,然后使用。如果我們配置了私服或者其他遠程倉庫,就會從遠程倉庫查找,下載。如果我們有配置對應的鏡像,就會從鏡像下載使用了。