maven settings.xml配置詳解


settings.xml文件位置

settings.xml文件一般存在於兩個位置:

全局配置: ${M2_HOME}/conf/settings.xml

用戶配置: user.home/.m2/settings.xml

 

配置優先級

需要注意的是:局部配置優先於全局配置。

配置優先級從高到低:pom.xml> user settings > global settings

如果這些文件同時存在,在應用配置時,會合並它們的內容,如果有重復的配置,優先級高的配置會覆蓋優先級低的。

 

settings.xml配置說明

<?xml version="1.0" encoding="UTF-8"?>
<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">
        <!-- 默認值是${user.home}/.m2/repository -->
    <localRepository>E:/project/localRepository</localRepository>
    <!-- 表示是否使用交互模式,默認是true
    如果為false,命令如下
    mvn archetype:generate -DgroupId=com.zworks -DartifactId=maven-setting -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    需要指定groupId、artifactId、archetypeArtifactId,如果不指定會報錯,因為這些是無法推測出值的。
    如果為true,命令如下
    mvn archetype:generate
    后面會讓你選擇或輸入archetype、groupId、artifactId、version、package、為false的時候之所以不用指定version和package是因為這兩個都有默認值。
    -->
    <interactiveMode>true</interactiveMode>
    <!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml來管理plugin的版本,就設置為true,默認為false -->
    <usePluginRegistry>false</usePluginRegistry>
    <!-- 如果構建系統要在離線模式下工作,設置為true,默認為false。如果構建服務器因為網絡故障或者安全問題不能與遠程倉庫相連,那么這個設置是非常有用的。 -->
    <offline>false</offline>
  
    <!--插件組
    在pluginGroups元素下面可以定義一系列的pluginGroup元素。表示當通過plugin的前綴來解析plugin的時候到哪里尋找。
    pluginGroup元素指定的是plugin的groupId。默認情況下,Maven會自動把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。-->
    <pluginGroups>
      <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
    <!--例如,有了上面的配置,Maven命令行可以使用簡單的命令執行org.morbay.jetty:jetty-maven-plugin:run,如下:
    mvn jetty run
    -->
    <!--服務器
    用來下載和部署的倉庫是用POM中的repositories和distributionManagement元素來定義的。
    但是某些配置例如username和password就不應該隨着pom.xml來分配了。這種類型的信息應該保存在構建服務器中的settings.xml中。
    -->
    <servers>
        <server>
        <!-- 這是Server的ID(不是登錄進來的user),與Maven想要連接上的repository/mirror中的id元素相匹配。 -->
            <id>nexus_server_id</id>
            <username>my_login</username>
            <password>my_password</password>
        <!-- 與前兩個元素一樣,這兩個成對出現,分別指向了一個私鑰(默認的${user.home}/.ssh/id_dsa)和一個passphrase。即分別表示私鑰位置和私鑰密碼 -->
            <privateKey>${user.home}/.ssh/id_dsa</privateKey>
            <passphrase>some_passphrase</passphrase>
        <!-- 文件和目錄被創建時的權限。后續需要用此權限來訪問。
                這兩個元素合法的值是一個三位數字,其對應了unix文件系統的權限,如664,或者775。 -->
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
        <!-- 傳輸層額外的配置項 -->
            <configuration></configuration>
        </server>
    </servers>
        <!--鏡像-->
    <mirrors>
        <mirror>
            <!-- 鏡像標識id -->
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <!-- 指向此鏡像的倉庫Id,任何對於遠程倉庫的請求都會被轉至此url。
                        多個逗號隔開,或者*號統配,或者!排除某個之外的所有倉庫
            external:*匹配除使用 localhost 或基於文件的存儲庫之外的所有存儲庫。當您想要排除為集成測試定義的重定向存儲庫時使用。
            自 Maven 3.8.0 起,external:http:*匹配所有使用 HTTP 的存儲庫,但使用 localhost 的存儲庫除外。
            * = 一切
            external:* = 一切不在本地主機上,也不基於文件。
            repo,repo1 = repo或repo1
            *,!repo1 = 除了 repo1 之外的所有東西
                        注意不要在逗號分隔列表中的標識符或通配符周圍包含額外的空格。
                        例如,<mirrorOf設置為 >的鏡像!repo1, *不會鏡像任何內容,而!repo1,*會鏡像除repo1
                        注意多個mirrorOf內容相同並不會都生效,每個倉庫只能有一個鏡像,Maven 不會聚合鏡像,而只是選擇第一個匹配項
                        -->
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
    <!-- 代理設置,主要用於無法直接訪問中心的庫用戶配置 -->
        <!--用來配置不同的代理,多代理profiles 可以應對筆記本或移動設備的工作環境:通過簡單的設置profile id就可以很容易的更換整個代理配置。 --> 
        <proxies>
          <proxy>
             <id>myproxy</id>
             <active>true</active>
             <protocol>http</protocol>
             <host>proxy.somewhere.com</host>
             <port>8080</port>
             <!-- 兩個元素成對出現,提供連接proxy服務器時的認證 -->
             <username>proxyuser</username>
             <password>somepassword</password>
             <!--不該被代理的主機名列表。該列表的分隔符由代理服務器指定;例子中使用了豎線分隔符,使用逗號分隔也很常見。-->
             <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
         </proxy>
        </proxies>
    <!--配置文件
    settings.xml中的profile是pom.xml中的profile的簡潔形式。
    它包含了激活(activation),倉庫(repositories),插件倉庫(pluginRepositories)和屬性(properties)元素。
    profile元素僅包含這四個元素是因為他們涉及到整個的構建系統,而不是個別的POM配置。
    如果settings中的profile被激活,那么它的值將重載POM或者profiles.xml中的任何相等ID的profiles。
    -->
    <profiles>
        <profile>
            <id>dev</id>
            <!--自動觸發profile的條件邏輯。Activation是profile的開啟鑰匙。
                        如POM中的profile一樣,profile的力量來自於它能夠在某些特定的環境中自動使用某些特定的值;
                        這些環境通過activation元素指定。activation元素並不是激活profile的唯一方式。
                        settings.xml文件中的activeProfile元素可以設置需要激活profile的id。
                        profile也可以通過在命令行,使用-P標記和逗號分隔的列表來顯式的激活(如,-P test)。-->
                    <activation>
              <!-- 默認激活的標識 -->
              <activeByDefault>false</activeByDefault>
              <!--當匹配的jdk被檢測到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4開頭的JDK。-->
              <jdk>1.5</jdk>
              <!--當匹配的操作系統屬性被檢測到,profile被激活。os元素可以定義一些操作系統相關的屬性。-->
              <os>
                <!--激活profile的操作系統的名字 -->
                <name>Windows XP</name>
                <!--激活profile的操作系統所屬家族(如 'windows')  -->
                <family>Windows</family>
                <!--激活profile的操作系統體系結構  -->
                <arch>x86</arch>
                <!--激活profile的操作系統版本-->
                <version>5.1.2600</version>
              </os>
              <!--如果Maven檢測到某一個屬性(其值可以在POM中通過${name}引用),其滿足對應的name = 值,Profile就會被激活。
                            如果值字段是空的,那么存在屬性名稱字段就會激活profile,否則按區分大小寫方式匹配屬性值字段-->
              <property>
                <name>mavenVersion</name>
                <value>2.0.3</value>
              </property>
              <!--提供一個文件名,通過檢測該文件的存在或不存在來激活profile。missing檢查文件是否存在,如果不存在則激活profile。
                            另一方面,exists則會檢查文件是否存在,如果存在則激活profile。-->
              <file>
                <!--如果指定的文件存在,則激活profile。 -->
                <exists>${basedir}/file2.properties</exists>
                <!--如果指定的文件不存在,則激活profile。-->
                <missing>${basedir}/file1.properties</missing>
              </file>
                </activation>
            <!--如果以上所有指定的條件都達到了,那么,activation就被觸發,而且不需要一次性全部達到。-->
            <!--倉庫(repositories)
            倉庫是Maven用來構築構建系統的本地倉庫的遠程項目集合。它來自於被Maven叫做插件和依賴的本地倉庫。
                        不同的遠程倉庫包含不同的項目,當profile被激活,他們就會需找匹配的release或者snapshot構件。 -->
            <repositories>
                <repository>
                    <id>ccl-nexus</id>
                    <url>http://172.16.10.99:8081/nexus/content/groups/public</url>
                    <!--如何處理遠程倉庫里發布版本的下載-->
                    <releases>
                        <!--true或者false表示該倉庫是否為下載某種類型構件(發布版,快照版)開啟。  -->
                        <enabled>true</enabled>
                        <!--該元素指定更新發生的頻率。Maven會比較本地POM和遠程POM的時間戳。
                                                選項是:always(一直), 
                                                            daily(默認,每日),
                                                            interval:X(這里X是以分鍾為單位的時間間隔),
                                                            never(從不)。 -->
                                            <updatePolicy>always</updatePolicy>
                        <!--當Maven驗證構件校驗文件失敗時該怎么做-ignore(忽略),fail(失敗),或者warn(警告)。-->
                                        <checksumPolicy>warn</checksumPolicy>
                    </releases>
                    <!--如何處理遠程倉庫里快照版本的下載。有了releases和snapshots這兩組配置,
                                        POM就可以在每個單獨的倉庫中,為每種類型的構件采取不同的策略。
                                        例如,可能有人會決定只為開發目的開啟對快照版本下載的支持。參見repositories/repository/releases元素-->
                    <snapshots>
                        <enabled>true</enabled>
                                            <updatePolicy>never</updatePolicy>
                                        <checksumPolicy>fail</checksumPolicy>
                    </snapshots>
                </repository>
            </repositories>
            <!--插件倉庫(plugin repositories)
            倉庫包含了兩種重要類型的構件:第一種是用來做其他構件依賴的構件,這是在中央倉庫中的大多數插件。另外一種類型的構件就是插件。
                        Maven的插件本身就是一種特殊的構件。因此,插件倉庫被從其他倉庫中分離出來。
                        pluginRepositories元素模塊的結構與repositories模塊很相似。pluginRepository元素指向一個可以找到新插件的遠程地址。
            -->
            <pluginRepositories>
                <pluginRepository>
                    <id>ccl-nexus</id>
                    <url>http://172.16.10.99:8081/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <!--屬性(properites)
            Maven的屬性是值占位符,就像Ant中的屬性。如果X是一個屬性的話,那么它的值在POM中可以使用${X}來進行任意地方的訪問。他們來自於五種不同的風格,所有都可以從settings.xml文件中訪問到。
            1.env.X:使用“env.”前綴將會返回當前的環境變量。例如${env.PATH}就是使用了$path環境變量。
            2.project.X:一個點“.”分割的路徑,在POM中就是相關的元素的值。例如:<project><version>1.0</version></project>就可以通過${project.version}來訪問。
            3.settings.X:一個點“.”分割的路徑,在settings.xml中就是相對應的元素的值,例如:<settings><offline>false</offline></settings>就可以通過${settings.offline}來訪問。
            4.Java系統屬性:所有通過java.lang.System.getProperties()來訪問的屬性都可以像POM中的屬性一樣訪問,例如:${java.home}
            5.X:被<properties/>或者外部文件定義的屬性,值可以這樣訪問${someVar}
            -->
            <properties>
              <sonar.jdbc.url>
                jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
              </sonar.jdbc.url>
              <sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
              <sonar.jdbc.username>root</sonar.jdbc.username>
              <sonar.jdbc.password></sonar.jdbc.password>
              <sonar.host.url>http://172.16.11.43:80</sonar.host.url>
            </properties>
                        <!--如果這個profile被激活,那么屬性${sonar.jdbc.url}就可以被訪問了-->
        </profile>     
    </profiles>
        <!--激活配置(Active Profiles)-->
    <activeProfiles>
        <activeProfile>dev</activeProfile>
    </activeProfiles>
   
</settings>

 

科普

中央倉庫:目前來說,http://repo1.maven.org/maven2/ 是真正的Maven中央倉庫的地址,該地址內置在Maven的源碼中,其它地址包括著名的ibiblio.org,都是鏡像。

索引:中央倉庫帶有索引文件以方便用戶對其進行搜索,完整的索引文件至2019年1月22日大小約為1.04G,索引每周更新一次。

提交內容:只要你的項目是開源的,而且你能提供完備的POM等信息,你就可以提交項目文件至中央倉庫,這可以通過Sonatype提供的開源Maven倉庫托管服務實現。

 

IntelliJ IDEA利用索引實現自動補全

眾所周知,由於偉大的中國防火牆,所以在使用IDEA下載Maven倉庫索引的時候,要么無法訪問,要么就是速度極慢,這對開發人員帶來了極大的不便,所以一般公司都用Nexus搭建一個公司內部的私服。同時利用私服更有利於對公司內部開發人員依賴的Jar包版本進行控制。

也許你會問,中央倉庫帶有索引,為什么本地的IDEA也需要下載索引呢?那么直接看下圖你就明白了,如果本地沒有下載索引的話,在pom.xml文件中添加依賴是得不到任何提示的。

 

 

下載Maven倉庫的索引

在配置完成之后就可以下載倉庫索引了,注意這是一個非常耗時的過程,建議利用晚上或者出去午飯時間下載。下載過程及下載完成之后狀態如下圖所示。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM