Maven配置文件settings.xml詳解

一、配置分級

首先需要了解的是Maven配置文件以及配置方式的分級,才能做到我們自己在日常開發(fā)配置中靈活使用。
根據(jù)Maven官方資料,Maven將配置文件分為兩級:

  • 用戶層級
  • 全局層級

Maven在運行的時候會merge(合并)用戶層級和全局層級的配置。
Maven默認使用settings.xml作為Maven的配置文件,對應(yīng)的兩個層級的配置文件的路徑會在

1. Maven用戶層級配置文件

用戶層級配置文件是提供給某個具體的用戶,通常該配置文件路徑為:

${user.home}/.m2/settings.xml

${user.home}是指用戶目錄:
在Linux、Mac系統(tǒng)下這個路徑代表~/;在windows下是C:/Users/xxx(xxx代表你的用戶名)

如果需要指定某個配置文件,可以在運行mvn時使用-s傳參:

-s ${path}/xxx.xml

2. Maven全局層級配置文件

全局層級配置文件是給當(dāng)前設(shè)備所有用戶公用的配置文件,通常該配置文件路徑為:

${maven.conf}/settings.xml

${maven.conf}是指Maven安裝目錄${maven.home}下的conf文件,在${maven.home}/bin/m2.conf文件里面配置的。有興趣的可以去到自己安裝Maven的目錄扒一扒相關(guān)的文件信息。

同樣地,如果需要指定某個配置文件作為全局配置,可以在運行mvn時使用-gs傳參:

-gs ${path}/xxx.xml

二、配置文件標(biāo)簽對

Maven的XML配置文件是以settings標(biāo)簽對”包圍“了整個配置文件,接下來說的配置都在這個標(biāo)簽對里面操作

<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標(biāo)簽對:

<localRepository>/path/to/local/repo</localRepository>

沒有配置的話,默認的目錄是:${user.home}/.m2/repository,也就是用戶目錄下的.m2文件里面。這也是Windows朋友在C盤用戶目錄下為什么有個.m2文件,而且還”那么占空間“。

四、指令模式(互動模式)

就是開啟mvn執(zhí)行中用戶控制,當(dāng)Maven在執(zhí)行中需要輸入一些操作指令或者一些參數(shù)時,會讓用戶輸入。這個互動模式默認開啟true。如果設(shè)置為false,Maven會在執(zhí)行的時候采取默認值,這些默認值可能是已經(jīng)有的,可能是鏈?zhǔn)侥J值。配置方式如下:

<interactiveMode>true</interactiveMode>

默認開啟的,我們就不用管了。

五、離線模式

這個很簡單明了,官方翻譯吧:確定maven在執(zhí)行構(gòu)建時是否應(yīng)嘗試連接到網(wǎng)絡(luò),這會對構(gòu)件的下載、部署和其他操作產(chǎn)生影響。
默認是關(guān)閉的:false
配置方式如下:

<offline>false</offline>

六、Maven配置代理服務(wù)器

如果在使用Maven時需要指定代理服務(wù)器,則通過在proxies代理服務(wù)器列表標(biāo)簽對里面配置服務(wù)器
proxy標(biāo)簽對里面配置對應(yīng)的服務(wù)器信息,通過active標(biāo)簽對激活配置好的代理:

<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才是配置服務(wù)器,配置的內(nèi)容大家都知道了吧,如果是socks5協(xié)議的就在protocol中設(shè)為socks5。
  • 切記,Maven會使用列表組中第一個激活的服務(wù)器作為代理服務(wù)器

七、Maven配置Nexus私服賬號密碼

servers標(biāo)簽對相信用過有分級使用權(quán)限私服的朋友都很熟悉,就是配置我們每個私服對應(yīng)的賬號密碼或者私鑰指紋。
特別是公司中最常見,項目組之間各自有自己的倉庫,但是不想讓其他項目組的人觸碰到私倉,這樣在賬號上面就可以做操作:指定某個賬號只能訪問某個倉庫。(當(dāng)然,有的公司是公開的,匿名者賬號走遍天下,內(nèi)網(wǎng)就行了)
回歸正文:在servers列表中,我們可以根據(jù)不同的私服server(根據(jù)id區(qū)分)來配置每個私服的賬號和密碼。
這個id是在項目的pom.xmldistributionManagement里面配置的私服的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一一對應(yīng)
  • name是指倉庫的名稱
  • url本地公倉的地址

在Maven配置文件中,配上對應(yīng)的賬號: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標(biāo)簽中的字符串是一一對應(yīng)的,這個是指明了私服的賬號,我這里私服中laomao賬號都給了訪問操作兩個倉的權(quán)限,如果要靈活配置,自己可以去Nexus中配置不同賬號訪問不同的倉庫來試試。

沒有權(quán)限的話,在打包發(fā)布到私倉的時候,會提示code 401,權(quán)限不足,或者Access Denied,拒絕訪問。
出現(xiàn)這個問題的時候,排查方法如下:

  1. 首先要確定id是否對應(yīng);
  2. 然后檢查賬號密碼是否錯誤;
  3. 最后去檢查私服中是否給對應(yīng)的賬號配置了對應(yīng)私倉的權(quán)限。

八、鏡像

首先,我想說下我對Maven鏡像的理解:鏡像是指目標(biāo)倉庫鏡像、備用庫、copy。配置了鏡像之后,Maven會從“備用倉庫”里面獲取依賴,而不是目標(biāo)倉庫。
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,全局唯一不能重復(fù)。
  • name是這個鏡像的名稱。
  • url是鏡像地址,指定了從哪個地址中獲取依賴。
  • mirroOf是指這個鏡像對哪個庫生效。

在上面的配置中,配置了阿里倉庫作為Maven中央倉庫(central)的鏡像,獲取依賴時,maven選擇的是這個阿里倉庫的鏡像地址(上面配置的url)去獲取依賴,而不是Maven官方的倉庫地址。
也就是說,鏡像是項目中目標(biāo)倉庫的備用路線,用mirrorOf標(biāo)簽對來指定這個鏡像對應(yīng)是哪個倉庫,上面指定的central,是Maven官方給出的默認中央倉庫的ID。如果mirrorOf中給出的是*,那就是匹配所有的倉庫。

九、Maven Profile配置

1. 配置Profile

按照翻譯來說profile中文是總則,profile可以讓我們定義一系列的配置信息,包含在profiles配置列表標(biāo)簽對中,每個profile配置都可以通過activeProfile命令行或者activeByDefault來激活,達到在不同的環(huán)境下自由切換配置的目的,激活的會在下面說明,先看看profile的配置。
profile可以在settings.xml中配置,也可以在pom.xml文件中配置。
注意:profile一定要給定一個全局唯一的ID,不能沖突

1.1 在settings.xml中配置profile

下面給出一個配置在settings.xmlprofile的例子:

<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的環(huán)境下就會被激活。activation可以不寫。

1.2 配置在pom.xml中的profile

而配置在pom.xml文件中的profile可配置項則多很多。
下面給出一個配置在pom.xmlprofile配置的例子:

<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的位置選擇

關(guān)于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都被激活,那么會根據(jù)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> 

注意:關(guān)于兩個profile中定義相同的properties屬性的情況上面有說明

2.2 使用activeByDefault激活

activeByDefault是配置在profileactivation標(biāo)簽對中的,上面有說了,activation是激活條件,可以在某個環(huán)境的時候觸發(fā)激活該profile。而activeByDefault是在默認的狀態(tài)下激活profile:

<profiles> 
    <profile> 
        ...
        <activation> 
            <activeByDefault>true</activeByDefault> 
        </activation> 
    </profile> 

    <profile> 
        ...
    </profile> 
</profiles> 

當(dāng)為activeByDefault的值true的時候,表示在沒有指定激活其他profile的時候,這個profile會默認被激活。如果有其他profile被指定激活之后,這個profile將不會被激活。

2.3 通過命令行管理profile激活狀態(tài)

為什么說是管理,因為bash命令行可以激活,也可以取消激活某個profile

2.3.1 在運行Maven時激活

需要激活某個profile,在mvn命令中,使用參數(shù)-P來指定要激活的profile

mvn -P <profileID>

如,激活I(lǐng)D為profile-ID-2profile

mvn -P profile-ID-2

2.3.4 在某次mvn命令中取消使用profile

當(dāng)某個profileactiveProfile、activeByDefault中被激活了,在某次mvn運行中并不需要使用該profile,但是又不想改配置那么麻煩(cd來cd去的確實很麻煩)。
可以通過命令行取消使用某個profile,用!即可達到目的:

mvn -P !<profileID>

如,在某次mvn命令中取消使用ID為profile-ID-2profile

mvn -P !profile-ID-2

附錄:

1. 關(guān)于插件組pluginGroup

pluginGroup并不熟悉,后面用上了會補。

2. 關(guān)于查看Maven當(dāng)前配置、pom、profile指令

之前我寫了一篇文章,是關(guān)于Maven查看當(dāng)前生效配置、pom、環(huán)境變量及指定使用配置文件執(zhí)行命令的,會一直更新,為了一致性這里就不復(fù)述了:
簡書:http://www.itdecent.cn/p/6184fa25fd53
CSDN:https://blog.csdn.net/nthack5730/article/details/82385124


此文同時在簡書發(fā)布:http://www.itdecent.cn/p/32f348dbf3d4
此文同時在CSDN發(fā)布:https://blog.csdn.net/nthack5730/article/details/84590027
轉(zhuǎn)載要加原文鏈接!謝謝支持!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容