一、配置分級
首先需要了解的是Maven配置文件以及配置方式的分級,才能做到我們自己在日常開發配置中靈活使用。
根據Maven官方資料,Maven將配置文件分為兩級:
- 用戶層級
- 全局層級
Maven
在運行的時候會merge(合并)
用戶層級和全局層級的配置。
Maven默認使用settings.xml
作為Maven的配置文件,對應的兩個層級的配置文件的路徑會在
1. Maven用戶層級配置文件
用戶層級
配置文件是提供給某個具體的用戶,通常該配置文件路徑為:
${user.home}/.m2/settings.xml
${user.home}
是指用戶目錄:
在Linux、Mac系統下這個路徑代表~/
;在windows下是C:/Users/xxx
(xxx代表你的用戶名)
如果需要指定某個配置文件,可以在運行mvn
時使用-s
傳參:
-s ${path}/xxx.xml
2. Maven全局層級配置文件
全局層級
配置文件是給當前設備
所有用戶公用的配置文件,通常該配置文件路徑為:
${maven.conf}/settings.xml
${maven.conf}
是指Maven安裝目錄${maven.home}
下的conf
文件,在${maven.home}/bin/m2.conf
文件里面配置的。有興趣的可以去到自己安裝Maven的目錄扒一扒相關的文件信息。
同樣地,如果需要指定某個配置文件作為全局配置,可以在運行mvn
時使用-gs
傳參:
-gs ${path}/xxx.xml
二、配置文件標簽對
Maven的XML配置文件是以settings
標簽對”包圍“了整個配置文件,接下來說的配置都在這個標簽對里面操作:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
.....
.....
</settings>
三、本地倉庫配置
Maven指定本地倉庫路徑,用localRepository
標簽對:
<localRepository>/path/to/local/repo</localRepository>
沒有配置的話,默認的目錄是:${user.home}/.m2/repository
,也就是用戶目錄下的.m2
文件里面。這也是Windows朋友在C盤用戶目錄下為什么有個.m2
文件,而且還”那么占空間“。
四、指令模式(互動模式)
就是開啟mvn
執行中用戶控制,當Maven在執行中需要輸入一些操作指令或者一些參數時,會讓用戶輸入。這個互動模式默認開啟true
。如果設置為false
,Maven會在執行的時候采取默認值
,這些默認值可能是已經有的,可能是鏈式默認值。配置方式如下:
<interactiveMode>true</interactiveMode>
默認開啟的,我們就不用管了。
五、離線模式
這個很簡單明了,官方翻譯吧:確定maven在執行構建時是否應嘗試連接到網絡,這會對構件的下載、部署和其他操作產生影響。
默認是關閉的:false
配置方式如下:
<offline>false</offline>
六、Maven配置代理服務器
如果在使用Maven時需要指定代理服務器,則通過在proxies
代理服務器列表標簽對里面配置服務器
在proxy
標簽對里面配置對應的服務器信息,通過active
標簽對激活配置好的代理:
<proxies>
<proxy>
<id>proxy-server-1</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
...
-->
</proxies>
注:
-
proxies
是代理列表組,proxy
才是配置服務器,配置的內容大家都知道了吧,如果是socks5協議的就在protocol
中設為socks5。 - 切記,Maven會使用列表組中第一個激活的服務器作為代理服務器
七、Maven配置Nexus私服賬號密碼
servers
標簽對相信用過有分級使用權限私服的朋友都很熟悉,就是配置我們每個私服對應的賬號密碼
或者私鑰指紋
。
特別是公司中最常見,項目組之間各自有自己的倉庫,但是不想讓其他項目組的人觸碰到私倉,這樣在賬號上面就可以做操作:指定某個賬號只能訪問某個倉庫。(當然,有的公司是公開的,匿名者賬號走遍天下,內網就行了)
回歸正文:在servers
列表中,我們可以根據不同的私服server
(根據id
區分)來配置每個私服的賬號和密碼。
這個id
是在項目的pom.xml
中distributionManagement
里面配置的私服的id
是一致的。下面舉個例子:
項目的pom.xml
中使用了兩個倉庫,一個是snapshot的倉庫(id為:cat-snapshot
),一個是releases倉庫(id為:cat-release
),配置如下:pom.xml
:
<distributionManagement>
<repository>
<id>cat-release</id>
<name>RELEASES</name>
<url>http://172.10.0.100:8081/repository/cat-releases/</url>
</repository>
<snapshotRepository>
<id>cat-snapshot</id>
<name>SNAPSHOT</name>
<url>http://172.10.0.100:8081/repository/cat-snapshot/</url>
</snapshotRepository>
</distributionManagement>
其中:
-
id
是指上面配置倉庫的ID,和下面指定的賬號密碼中的id
一一對應 -
name
是指倉庫的名稱 -
url
本地公倉的地址
在Maven配置文件中,配上對應的賬號:settings.xml
:
<servers>
<server>
<id>cat-release</id>
<username>laomao</username>
<password>123456</password>
</server>
<server>
<id>cat-snapshot</id>
<username>laomao</username>
<password>123456</password>
</server>
...
</servers>
其中:
-
id
是指倉庫的ID,這里和上面pom.xml
配置的是一樣的 -
username
是用戶名 -
password
是密碼
注意看id
標簽中的字符串是一一對應的,這個是指明了私服的賬號,我這里私服中laomao
賬號都給了訪問操作兩個倉的權限,如果要靈活配置,自己可以去Nexus中配置不同賬號訪問不同的倉庫來試試。
沒有權限的話,在打包發布到私倉的時候,會提示
code 401
,權限不足,或者Access Denied
,拒絕訪問。
出現這個問題的時候,排查方法如下:
- 首先要確定
id
是否對應;- 然后檢查
賬號密碼
是否錯誤;- 最后去檢查私服中是否給對應的賬號配置了對應私倉的權限。
八、鏡像
首先,我想說下我對Maven鏡像
的理解:鏡像是指目標倉庫
的鏡像
、備用庫
、copy
。配置了鏡像之后,Maven會從“備用倉庫”里面獲取依賴,而不是目標倉庫。
Maven鏡像
是在mirrors
(鏡像列表)中配置的,下面以阿里倉庫作為中央倉庫的鏡像
為例:
<mirrors>
<mirror>
<id>ali</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
...
</mirrors>
其中:
-
id
是這個鏡像的ID,全局唯一不能重復。 -
name
是這個鏡像的名稱。 -
url
是鏡像地址,指定了從哪個地址中獲取依賴。 -
mirroOf
是指這個鏡像對哪個庫生效。
在上面的配置中,配置了阿里倉庫作為Maven中央倉庫(central)的鏡像
,獲取依賴時,maven選擇的是這個阿里倉庫的鏡像地址(上面配置的url
)去獲取依賴,而不是Maven官方的倉庫地址。
也就是說,鏡像是項目中目標倉庫的備用路線,用mirrorOf
標簽對來指定這個鏡像對應是哪個倉庫,上面指定的central
,是Maven官方給出的默認中央倉庫的ID。如果mirrorOf
中給出的是*
,那就是匹配所有的倉庫。
九、Maven Profile配置
1. 配置Profile
按照翻譯來說profile
中文是總則
,profile
可以讓我們定義一系列的配置信息,包含在profiles
配置列表標簽對中,每個profile配置都可以通過activeProfile
或命令行
或者activeByDefault
來激活,達到在不同的環境
下自由切換配置的目的,激活的會在下面說明,先看看profile
的配置。
profile
可以在settings.xml
中配置,也可以在pom.xml
文件中配置。
注意:profile
一定要給定一個全局唯一的ID,不能沖突
1.1 在settings.xml
中配置profile
下面給出一個配置在settings.xml
中profile
的例子:
<profile>
<id>jdk-1.8</id>
<activation>
<jdk>1.8</jdk>
</activation>
<properties>
...
</properties>
<repositories>
<repository>
<id>jdk18</id>
<name>Repository for JDK 1.8 builds</name>
<url>http://....</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
<pluginRepositories>
...
</pluginRepositories>
</profile>
可以看到,配置在settings.xml
中的文件并不多,主要是用于指定某個依賴倉庫或者插件倉庫。
其中:
activation
是指激活條件,上面的例子是在jdk 1.8的環境下就會被激活。activation
可以不寫。
1.2 配置在pom.xml
中的profile
而配置在pom.xml
文件中的profile
可配置項則多很多。
下面給出一個配置在pom.xml
中profile
配置的例子:
<project>
<profiles>
<profile>
<id>xxxx</id>
<build>
<defaultGoal>...</defaultGoal>
<finalName>...</finalName>
<resources>...</resources>
<testResources>...</testResources>
<plugins>...</plugins>
</build>
<reporting>...</reporting>
<modules>...</modules>
<dependencies>...</dependencies>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<properties>...</properties>
</profile>
</profiles>
</project>
1.3 配置profile
的位置選擇
關于profile
配置的位置,下面給點建議:
- 特定項目的配置就在項目的
pom.xml
文件中配置 - 特定用戶的配置則放在用戶目錄下的
.m2
文件夾下(Windows、Linux、Mac的Maven用戶目錄位置在一開始有說) - 全局的配置則放在Maven安裝目錄下
${maven.home}
、${m2.home}
再次注意:profile
一定要給定一個全局唯一的ID,不能沖突
1.4 properties
屬性的覆蓋
在profile
中可以定義<properties>...</properties>
屬性列表,如果兩個屬性列表中都有相同的key
,如:
<profile>
<id>profile-ID-1</id>
...
<properties>
<env>test</env>
</properties>
...
</profile>
<profile>
<id>profile-ID-2</id>
...
<properties>
<env>dev</env>
</properties>
...
</profile>
上面兩個profile中都定義了env
屬性,如果都沒被激活或激活某一個profile的話,是沒問題的。如果兩個profile都被激活,那么會根據profile在配置文件中定義的位置,后面的屬性會覆蓋前面的屬性。
2. 激活profile
的方式
上面說了,profile
在配置之后并不是直接生效的,需要通過activeProfile
或命令行
或者activeByDefault
來激活。
2.1 在settings.xml
通過activeProfile
激活profile
在settings.xml
配置文件activeProfiles
列表里通過activeProfile
方式激活profile
,可以激活一個或多個profile
。
下面給出在settings.xml
中同時激活兩個profile
的配置:
<activeProfiles>
<activeProfile>profile-ID-1</activeProfile>
<activeProfile>profile-ID-2</activeProfile>
</activeProfiles>
注意:關于兩個profile中定義相同的properties
屬性的情況上面有說明
2.2 使用activeByDefault
激活
activeByDefault
是配置在profile
中activation
標簽對中的,上面有說了,activation
是激活條件,可以在某個環境的時候觸發激活該profile
。而activeByDefault
是在默認的狀態下激活profile:
<profiles>
<profile>
...
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
...
</profile>
</profiles>
當為activeByDefault
的值true
的時候,表示在沒有指定激活其他profile
的時候,這個profile
會默認被激活。如果有其他profile
被指定激活之后,這個profile
將不會被激活。
2.3 通過命令行管理profile
激活狀態
為什么說是管理,因為bash命令行可以激活,也可以取消激活某個profile
。
2.3.1 在運行Maven時激活
需要激活某個profile
,在mvn
命令中,使用參數-P
來指定要激活的profile
:
mvn -P <profileID>
如,激活ID為profile-ID-2
的profile
:
mvn -P profile-ID-2
2.3.4 在某次mvn命令中取消使用profile
當某個profile
在activeProfile
、activeByDefault
中被激活了,在某次mvn運行中并不需要使用該profile,但是又不想改配置那么麻煩(cd來cd去的確實很麻煩)。
可以通過命令行取消使用某個profile,用!
即可達到目的:
mvn -P !<profileID>
如,在某次mvn
命令中取消使用ID為profile-ID-2
的profile
:
mvn -P !profile-ID-2
附錄:
1. 關于插件組pluginGroup
pluginGroup
并不熟悉,后面用上了會補。
2. 關于查看Maven當前配置、pom、profile
指令
之前我寫了一篇文章,是關于Maven查看當前生效配置、pom、環境變量及指定使用配置文件執行命令的,會一直更新,為了一致性這里就不復述了:
簡書:http://www.lxweimin.com/p/6184fa25fd53
CSDN:https://blog.csdn.net/nthack5730/article/details/82385124
此文同時在簡書發布:http://www.lxweimin.com/p/32f348dbf3d4
此文同時在CSDN發布:https://blog.csdn.net/nthack5730/article/details/84590027
轉載要加原文鏈接!謝謝支持!