在Maven基礎概念和安裝配置一文中,我們簡單學習了Maven是什么,安裝包里邊的各個文件夾都存放着哪些東西,並且進行了簡單的安裝配置。在本文中,我們將進一步學習了解何為Maven倉庫以及Maven的配置文件settings.xml如何配置。
Maven的倉庫
Maven用來存儲依賴和插件的一個統一的地方,稱之為倉庫,Maven倉庫又分為本地倉庫和遠程倉庫。遠程倉庫又分為私服和中央倉庫等。
我們以一幅圖來表示它們的關系:
本地倉庫
就是maven在本地(我們的計算機上)存儲構件(依賴的Jar包等)的倉庫,默認是在用戶的.m2/repository/目錄下。需要注意的是剛開始在.m2/下邊是沒有這個repository/文件夾的,當我們在命令行中運行mvn命令后才會出現該文件夾,並且在該文件夾下存儲我們從遠程倉庫下載的構件。
既然Maven默認在/.m2/repository/下存儲依賴和構件,那么我們是不是可以改變自定義這個位置?
答案是肯定的,注意看圖中的/.m2/settings.xml 該文件是maven的配置文件,我們可以在該文件中通過標簽<localRepository></localRepository>來配置本地倉庫的位置。(settings.xml文件是啥?其作用是啥?我們需要如何配置將在下邊詳細講解)
遠程倉庫
遠程倉庫又分為中央倉庫,私服以及其它公共庫,我們也借用一幅圖來闡述它們之間的關系。
由圖中可以看出,我們Maven用戶是在和私服打交道,包括上傳和下載構件,當私服滿足不了我們的下載構件需求時,私服會和中央倉庫或者其余公共倉庫交互,將用戶需要的構件緩存在私服倉庫中。那么何為私服?
私服
私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。
局域網使用搭建maven私服的好處:
1.節省外網帶寬:減少重復請求造成的外網帶寬消耗,將大部分構件緩存在私服,用戶和私服的交互走局域網。
2.加速Maven構件:如果項目配置了很多外部遠程倉庫的時候,構建速度就會大大降低,因為外網下載速度很慢。
3.部署第三方構件:有些構件無法從外部倉庫獲得的時候,可以把這些構件部署到內部倉庫(私服)中,供內部maven項目使用。
4.提高穩定性:避免當外網不穩定的時候,maven構建也變的不穩定的情況。
5.增強控制:在公司內部可以訪問私服可以通過配置用戶名和密碼來增強權限控制。
6.降低中央倉庫的負荷:maven中央倉庫被請求的數量是巨大的,配置私服也可以大大降低中央倉庫的壓力
中央倉庫
Maven提供了一個中央倉庫,其地址為:http://repo.maven.apache.org/maven2 ,該倉庫包含了絕大多數流行的開源Java構件,以及源碼、作者信息、SCM、信息、許可證信息等。據統計,每個月中央倉庫大概會接受全世界Java程序員大概1億次訪問,其重要性不言而喻。
在上一節Maven基礎概念和安裝配置教程 中,我們提到了maven的超級pom也是一種約定,所有的maven項目的pom文件都繼承於該超級pom。(超級pom文件位於你的安裝目錄/apache-maven-3.2.5/lib/maven-model-builder-3.2.5.jar包中,並且在org/apache/maven/model/pom-4.0.0.xml路徑下)在超級Pom中,對於中央倉庫進行了配置,如下所示:
注意看該配置中的標簽<snapshots></snapshots>,該標簽設置為false,表示我們不從該倉庫中獲取不穩定的SNAPSHOT版本的構件;其實還有一個<releases></releases>標簽,表示我們是否從該倉庫中獲取穩定版本的構件;
一段比較完整的遠程倉庫的配置如下:
<repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.com/maven2/</url> <releases> <updatePolicy>daily</updatePolicy><!-- never,always,interval n --> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy><!-- fail,ignore --> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> </repositories>
<updatePolicy></updatePolicy>標簽:表示Maven從遠程倉庫檢查更新的頻率, 默認值是daily ,表示每天都檢查一次;never-從不檢查;always-每次構建都檢查更新;interval n-每隔n分支檢查一次更新。
<checksumPolicy></checksumPolicy>標簽:表示maven檢查和檢驗文件的策略,warn為默認值,還可以選擇ignore和fail,表示當maven檢查檢驗和文件失敗之后應該采取的行動。
既然我們配置了遠程倉庫,那么是不是也需要在某個地方進行遠程倉庫的權限認證?否則誰都可以下載上傳構件豈不是一件很麻煩的事?
答案當然也是肯定的,我們需要遠程倉庫的權限認證。我們可以在settings.xml配置文件中配置<servers></servers>來搞定
<servers> <server> <id>archiva.internal</id> // release版本的用戶名和密碼 <username>admin</username> <password>pwdpwd</password> </server> <server> <id>archiva.snapshots</id> // snapshot版本的用戶名和密碼 <username>admin</username> <password>pwdpwd</password> </server> </servers>
需要注意的是:這里的<id>archiva.snapshots</id>必須與POM中需要認證的repository元素的Id一致,這樣maven才能知道我們的用戶名和密碼是在認證哪個倉庫。
配置了遠程倉庫並且進行了倉庫的權限認證,maven已經可以幫助我們自動下載所需的構件了,當我們准備把自己的構件上傳到遠程倉庫供別人使用時,我們還需要使用<distributionManagement></distributionManagement>來搞定。
<distributionManagement> <repository> <id>archiva.internal</id> <name>Internal Release Repository</name> <url>http://nexus.d.xxx.net/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>archiva.snapshots</id> <name>Internal Snapshot Repository</name> <url>http://nexus.d.xxx.net/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
配置了之后,我們可以通過mvn deploy將本地的構件發布到遠程倉庫中。
settings.xml配置文件
當我們下載安裝好Maven時,在其安裝目錄的conf下存在一個settings.xml的配置文件,這是一個全局的maven配置文件,為了不影響這台計算機上的其他用戶,一般選擇將該文件copy到 ~/.m2/下邊,作為一個用戶層面的配置文件。
settings.xml文件中主要包含以下的元素:
localRepository:本地倉庫的目錄。默認是用戶目錄下面的.m2/repository目錄。
interactiveMode:表示是否使用交互模式,默認是true;如果設為false,那么當Maven需要用戶進行輸入的時候,它會使用一個默認值。
offline:表示是否離線,默認是false。這個屬性表示在Maven進行項目編譯和部署等操作時是否允許Maven進行聯網來下載所需要的信息。
mirrors:定義一系列的遠程倉庫的鏡像,用於緩解遠程倉庫的壓力。
profiles:用於指定一系列的profile。
activeProfiles:指定當前正在活躍的profile。
servers:表示當需要連接到一個遠程服務器的時候需要使用到的驗證方式。
接下來我們給出一個settings.xml的簡單的配置文件示例:
<?xml version="1.0" encoding="UTF-8"?> <settings> <mirrors> <mirror> <!--This sends everything else to /public --> <id>nexus</id> // 鏡像id <mirrorOf>*</mirrorOf> // 表示代理所有倉庫 <url>http://nexus.d.xxx.net/nexus/content/groups/public</url> // 該鏡像的地址 </mirror> </mirrors> <profiles> <profile> <id>development</id> <repositories> // 構件的倉庫 <repository> <id>central</id> <url>http://nexus</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> // 插件的倉庫 <pluginRepository> <id>central</id> <url>http://nexus</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>development</activeProfile> // 對於所有的pom,上邊定義的id=development的profile都是活躍狀態的 </activeProfiles> <servers> <server> <id>archiva.internal</id> // release版本的用戶名和密碼 <username>yangwenqiang</username> <password>pwdpwd</password> </server> <server> <id>archiva.snapshots</id> // snapshot版本的用戶名和密碼 <username>yangwenqiang</username> <password>pwdpwd</password> </server> </servers> </settings>
下邊我們重點說兩個比較有用的配置:
<mirrors></mirrors>:鏡像,如果倉庫X可以提供倉庫Y存儲的所有內容,那么就可以認為X是Y的一個鏡像。說白了,任何一個可以從倉庫Y獲得的構件,都能夠從它的鏡像中獲取。在上邊的示例中,我們使用<url></url>中配置的http://nexus.d.xxx.net/nexus/content/groups/public來代理所有的遠程倉庫,其實這個代理一般情況下是你們公司的內網搭建的私服,在局域網內,加快訪問速度等作用。
profiles: 可以配置構件和插件的遠程倉庫,並且可以通過<id>來配置多個profile,最后通過<activeProfiles>來指定當前處於活躍狀態(即有效的)的profile配置是哪一個。
————————————————
原文鏈接:https://blog.csdn.net/qq_25827845/java/article/details/83549846