1、倉庫的作用
用來存儲構件,同時爲多個項目提供構件。這樣,不同項目需要一些相同的構件時,就不用自己一遍遍手動加到各個項目中去,這樣,一方面節省了磁盤空間,一方面使構件易於管理
什麼是構件呢?
在maven中任何一個依賴、插件或者項目構建的輸出都可以稱之爲構件。
例如,依賴log4j-1.2.15.jar是一個構件,插件maven-compile-plugin-2.0.2.jar是一個構件,項目構建完成生成的xxx-1.0.0-SNAPSHOT.jar是個構件。
2、構件的存儲路徑
路徑跟構件的座標對應,大致爲
groupId/artifactId/version/artifactId-version.packing
一個具體的例子:
log4j/log4j/1.2.15/log4j-1.2.15.jar
3、倉庫的分類
總體來分的話,有
- 本地倉庫
- 遠程倉庫(包含幾種特殊的遠程倉庫)
當maven根據座標尋找構件的時候,首先查找本地庫,如果本地庫沒有,會去遠程倉庫查找,並下載到本地庫中使用。
幾種特殊的遠程倉庫
- 中央倉庫
中央倉庫是maven官方提供的遠程倉庫,它包含了絕大部分開源的構件, 默認配置下,如果maven從本地庫中找不到,便會去中央倉庫尋找。 - 私服
爲了節省帶寬和時間(你懂得,有防火牆,國內網絡從中央倉庫下載的那個速度。。),我們可以選擇在局域網中架設一個私有的倉庫,這個倉庫由工作小組或者公司內部使用,用來代理所有外部的遠程倉庫,而且我們內部的項目輸出的構件還可以放到私服上,供其他項目使用。 - 其他公共庫
除了中央倉庫和私服,還有一些其他公開的遠程倉庫。
4、本地倉庫的設置
默認情況下,每個用戶目錄下,都有一個名爲.m2/repository/的倉庫目錄,以mac爲例,默認倉庫路徑爲/Users/lige/.m2/respository/。
修改默認倉庫爲其他路徑
如果想要更改默認倉庫的路徑,我們可以修改~/.m2/settings.xml(mac),settings.xml是maven的全局配置文件,默認情況下是不存在的,需要從$M2_HOME_conf/settings.xml拷貝過來,然後修改:
<settings>
<localRepository>/Users/lige/maven/repo(自己希望的路徑)</localRepository>
</settings/>
將項目輸出的構件安裝到本地倉庫
本地倉庫可以從遠程倉庫下載構件,也可以將項目輸出的構件放入本地倉庫。
我們在maven項目的根目錄下,執行mvn clean install命令可以將項目輸出的構件放入本地倉庫。
5、遠程倉庫
5.1、中央倉庫
最原始的本地倉庫是空的,而且我們沒有配置過任何遠程倉庫,但是,我們仍然可以獲取到自己想要的構件,這是爲什麼呢?原因就是,在maven安裝文件中,自帶了maven維護的一個遠程倉庫,也就是中央倉庫。打開$M2_HOME/bin/maven-model-builder-3.5.4.jar,打開org/apache/maven/model/pom-4.0.0.xml,可以看到配置
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
包含這段配置的文件是所有Maven項目都會繼承的超級pom,所以,我們的Maven項目在沒有配置過任何遠程倉庫的情況下,也能從中央倉庫獲取構件
5.2、配置其他遠程倉庫
<repositories>
<repository>
<id>repoId</id>
<name>RepositoryName</name>
<url>http://xxxxx</url>
<releases>
<enabled>true</enabled>
</releases>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
在repositories元素下,我們通過repositorie可以配置自己希望的遠程倉庫。
id:倉庫的id,需要唯一,如果重複的話,後面的配置會覆蓋前面的配置
name:倉庫的名稱
url:倉庫的url,一般來說,該地址都基於Http協議
release:配置Maven對於發佈版本構件的支持(通過enabled子元素)
snapshots:配置Maven對於快照版本構件的支持(通過enabled子元素)
layout:值爲default表示倉庫的佈局(構件的路徑)是Maven2、Maven3的默認佈局,而不是Maven1的佈局。
遠程倉庫的認證
一般的遠程倉庫,向中央倉庫或者其他一些對廣大開發者開放的遠程倉庫是不需要認證的,但是一些私服爲了保證安全,防止非法的倉庫訪問,需要配置用戶名和密碼認證後,才能訪問該私服。
認證信息需要配置在setting.xml,即maven的配置文件中,這時因爲POM往往提交到代碼倉庫,供所有成員訪問,而setting.xml只放在本機,因此配置在setting.xml更爲安全。
下面是一份認證配置的例子:
<settings>
<servers>
<server>
<id>my-proj</id>
<username>admin</username>
<password>pwd</password>
</server>
</servers>
</settings>
認證需要配置server元素,其中id是倉庫id(需要與pom中的id保持一致),username用戶名,password密碼,這樣,如果倉庫需要認證的話,maven根據pom中的倉庫id來settings.xml中獲取認證信息~~~
5.3、將項目輸出的構件部署至遠程倉庫
5.3.1 pom.xml配置需要部署的倉庫信息
<project>
<distributionManagement>
<repository><!--配置需要部署發佈版本的倉庫-->
<id>releases</id> <!--倉庫id-->
<name>public</name><!--倉庫name-->
<url>http://59.50.95.66:8081/nexus/content/repositories/releases</url><!--倉庫地址-->
</repository>
<snapshotRepository><!--配置需要部署快照版本的倉庫-->
<id>snapshots</id>
<name>Snapshots</name>
<url>http://59.50.95.66:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
5.3.2 配置倉庫的認證(不贅述)
5.3.3 使用命令部署構建
使用
mvn clean deploy
將構建部署到遠程倉庫
6、倉庫構件的版本
、快照版本和發佈版本
快照版本和正式版本的區別:
本地獲取這些依賴的機制不同。
如果你依賴一個庫的正式版本,構建的時候,先在本地倉庫中查找是否已經有了這個依賴庫,如果沒有的話纔會去遠程倉庫去拉取。如果發佈一個xxx-1.1.jar到遠程倉庫,有一個項目依賴這個庫,第一次構建會把這個jar拿到本地倉庫中,以後再構建就不會去訪問遠程倉庫了。你修改了代碼發佈上去,也不會再拉,本地這個庫不能得到更新。除非升級這個版本 xxx-1.2.jar,然後通知項目,修改依賴爲這個版本。(也可以清理本地倉庫,這樣的話也會從遠程倉庫再拉一次)
那麼使用-SNAPSHOT,每天構建時構建快照版本,xxx-1.1-SNAPSHOT,如果有則下載來使用。即使本地倉庫已經有,也會去訪問遠程倉庫,看是否是最新的。
7、鏡像倉庫
如果X倉庫可以提供Y倉庫提供的所有內容,那麼就可以認爲X是Y的一個鏡像。
配置鏡像倉庫(以阿里鏡像爲例):
<mirror>
<id>nexus-aliyun</id>
<name>nexus-aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf><!--central代表是中央倉庫的鏡像-->
</mirror>
如果需要配置認證,可以根據id在maven的配置文件中配置認證信息即可。
mirrorOf支持*、repo1,repo2等配置方式。