setting.xml作為Maven最重要的配置文件,其中存在諸多的配置項,本文手工翻譯了Apache官方Maven站點對于setting.xml的配置的頁面,幫助初學者更簡單了解該配置文件的用法和作用。
1. 簡介
1.1 快速概述
setting.xml的頂級節(jié)點是<code>settings</code>元素,它包含很多子元素用來定義Maven不同的運行方式所需要的值,和<code>pom.xml</code>類似,但是不應(yīng)該被綁定到特定的項目或者發(fā)布給用戶。這些子元素包括本地倉庫位置、遠程倉庫的替代服務(wù)和一些認證信息等等。
<code>settings.xml</code>一般存在于兩個位置:
- Maven安裝的主目錄: <code>$MAVEN_HOME/conf/settings.xml</code>
- 用戶主目錄: <code>$USER_HOME/.m2/settings.xml</code>
第一個<code>setting.xml</code>也被稱為全局配置文件,而第二個則稱為用戶配置。當然,如果兩個文件同時存在,他們的內(nèi)容將會合并,用戶配置將會覆蓋全局配置。
小建議:如果你需要從頭開始創(chuàng)建指定用戶的配置,最簡單的方法是將全局配置文件從你的Maven安裝目錄復(fù)制到你的用戶目錄下的.m2目錄下面。Maven默認的<code>settings.xml</code>是一個帶有注釋和事例的模板,所以你可以很輕松地微調(diào)來滿足你的需要。
下面是一個位于<code>settings</code>之下的頂級元素的概覽:

<code>settings.xml</code>的內(nèi)容可以通過一下表達式覆蓋:
- <code>${user.home}</code>和其它系統(tǒng)屬性(Maven3.0以后)
- <code>${env.HOME}</code>例如環(huán)境變量
2. 配置詳情
2.1 簡值
在<code>settings</code>中超過一半的元素使用簡單的值去代表一個用來描述被激活的構(gòu)建系統(tǒng)的元素的范圍。

- localRepository:這個值是構(gòu)建系統(tǒng)本地倉庫的一個路徑。默認的值是<code>${user.home}/.m2/repository</code>。這個元素對于一個允許所有登陸用戶從共同的本地倉庫中構(gòu)建的主要服務(wù)器來說非常有用。
- interactiveMode:<code>true</code>代表Maven需要嘗試和用戶的輸入進行交互,<code>false</code>則不會,默認是<code>true</code>。
- usePluginRegistry:<code>true</code>表示Maven應(yīng)該使用<code>${user.home}/.m2/plugin-regisry.xml</code>文件去管理Maven插件版本,默認是<code>false</code>。
- offline:<code>true</code>綁定的構(gòu)建系統(tǒng)應(yīng)該在離線模式下操作,默認是<code>false</code>。這個元素對于不能連接遠程倉庫務(wù)器亦或者是由于網(wǎng)絡(luò)限制或者是安全原因的構(gòu)建服務(wù)器非常有用。
2.2 插件組
這個元素包括一系列的<code>pluginGroup</code>元素,每一個子元素都包含一個groupId。當一個插件被使用,并且
沒有在命令行上提供的時候,插件組列表就會被查找。這個列表自動包含<code>org.apache.maven.plugins</code>和<code>org.codehaus.mojo</code>。

例如,如果配置成上圖所示的樣子,則可以執(zhí)行使用簡寫去執(zhí)行<code>org.mortbay.jetty:jetty-maven-plugin:run</code>。
<code>mvn jetty:run</code>
2.3 服務(wù)器
下載和部署的倉庫被POM里面的<code>repositories</code>和<code>distributionManagement</code>所指定。然而,確定的用戶名和密碼不應(yīng)該和<code>pom.xml</code>一起被發(fā)布。這一類型的信息存在于構(gòu)建服務(wù)器的<code>settings.xml</code>中。
2.3.1 密碼加密
一個新的特性-服務(wù)器密碼和密碼短語加密已經(jīng)被添加到Maven2.1.0以上的版本。查看詳細的內(nèi)容。

- id:這個是服務(wù)器的ID(不是用戶登陸的名字),Maven會根據(jù)這個ID去匹配響應(yīng)的倉庫和鏡像去連接。
- username,password:和之前的兩個元素類似,這一對指明了私鑰的路徑(默認是<code>${user.home}/.ssh/id_dsa</code>)和<code>passphrase</code>,當然如果需要的話。這兩個元素在未來可能被擴展,但是現(xiàn)在他們必須被設(shè)置成文本在<code>settings.xml</code>文件中
- filePermissions,directoryPermissions:當一個倉庫文件或者部署時創(chuàng)建的目錄這些權(quán)限將被使用到。合法的數(shù)值是一個三位數(shù)字代表相應(yīng)的l*nix文件權(quán)限,例如664或者是775。
注意:如果你使用私鑰去登陸服務(wù)器,確定你省略了<code>password</code>元素。否則,這個元素將會被忽略。
2.4 鏡像

- id, name: 分別代表當前鏡像的唯一標識符和名字。<code>id</code>用來區(qū)分不同的<code>mirror</code>元素和用來從<code>server</code>中取得對應(yīng)的憑據(jù)當連接鏡像的時候。
- url: 鏡像的url地址。構(gòu)建系統(tǒng)將會使用這個URL連接倉庫。
- mirrOf 鏡像的所屬的倉庫的<code>id</code>。例如,為了讓鏡像指向Maven的<code>central</code>倉庫(<code>http://repo.maven.apache.org/maven2/</code>)??梢詫?lt;code>mirrorOf</code>設(shè)置為<code>central</code>。更多高級的映射像<code>repo1,repo2</code>或者<code>*,!inhouse</code>也是可以的,但是必須不能和<code>id</code>匹配。
如果需要更深一步的了解鏡像的配置,可以查閱[Guide to Mirror Settings.
2.5 代理

- id: 這個代理的唯一標識。用來區(qū)分不同的<code>proxy</code>。
- active: 當前代理是否被激活。聲明了一個代理集合,但是在同一時間只有一個在使用。
- protocol, host, port: 代理的地址<code>protocol://host:port</code>,可以使用不連續(xù)的元素區(qū)分
- username, password: 這兩個元素作為一對用于聲明登陸需要驗證密碼的代理。
- nnProxyHosts: 列出不許要通過代理訪問的域名。多個域名的分隔符取決于代理的類型,上圖所示的逗號分隔符是常用的一中。
2.6 簡介
<code>settings.xml</code>中的<code>profile</code>是<code>pom.xml</code><code>profile</code>的簡寫版本。它由<code>activation</code>,<code>repositories</code>,<code>pluginRepositories</code>和<code>properties</code>元素。<code>profile</code>元素只包括這四個元素因為它們只關(guān)心構(gòu)建系統(tǒng),而不關(guān)心單獨的項目對象模型配置。
如果一個簡介從<code>settings</code>中激活。它的值將會覆蓋任何在POM中相同id的簡介或者是<code>profiles.xml</code>文件。
2.6.1 激活
激活是簡介的key。和POM里面的簡介一樣,簡介的作用來自于它在確定的情況下修改一些值的能力。這些情形會被<code>activation</code>元素指定。

雖然很多條件不會在同一時刻滿足,但是激活會在所有指定的標準都符合時執(zhí)行。
- jdk: <code>activation</code>有一個內(nèi)建的,Java為中心的校驗在<code>jdk</code>元素中。當測試在符合Jdk版本前綴的環(huán)境中執(zhí)行時,會生效。在上面的范例中,<code>1.5.0_06</code>是符合的條件。匹配一個范圍在Maven2.1以后也是支持的。查看 maven-enforcer-plugin去了解更多關(guān)于范圍查詢的文檔。
- os: 這個元素定義了一些特定的操作系統(tǒng)的屬性。查看 maven-enforcer-plugin去了解這些值的更多信息。
- property: 如果Maven發(fā)現(xiàn)了一個屬性(一個可以在POM中通過引用相應(yīng)的<code>name=value</code>對的<code>${name}</code>值)。
- file: 最后,一個指定的文件名字將會通過文件的<code>existence</code>激活<code>profile</code>,或者是<code>missing</code>
<code>activation</code>元素不是唯一能夠激活<code>profile</code>的方式。<code>settings.xml</code>文件的<code>activeProfile</code>元素也包含了簡介的<code>id</code>。它也可以通過命令行中位于<code>-P</code>標識之后的的逗號分割符被顯示地激活(例如<code>-P test</code>)。
為了查看那些簡介能夠在當期構(gòu)建系統(tǒng)中被激活,可以使用<code>maven-help-plugin</code>。

2.6.2 屬性
Maven的屬性是值占位符,想Ant中的屬性一樣。他們的值可以在POM中的任何地方通過使用標記<code>${X}</code>取到。有5種形式在<code>settings.xml</code>文件中取到值。
- <code>env.X</code>: 以env為前綴的變量將會返回shell的環(huán)境變量。例如,<code>${env.PATH}</code>包含了$PATH環(huán)境變量在*nix或者是%PATH%在Windows中。
- project.x: 標記在POM下面的對應(yīng)元素的值。例如:<code><project><version>1.0</version></project></code>可以通過<code>${project.version}</code>訪問。
- <code>settingx.x</code>: 標記在<code>settings</code>里面相應(yīng)元素的數(shù)值。例如:<code><settings><offline>false</offline></settings></code>可以通過<code>${settings.offline}</code>訪問。
- Java系統(tǒng)屬性:所有的可以通過<code>java.lang.System.getProperties()</code>取得的系統(tǒng)屬性都可作為POM的屬性,例如<code>${java.home}</code>
- <code>x</code>: 在<properties/>元素中或者是外置文件,這些值可以通過<code>${someVar}</code>訪問。

2.6.2 倉庫
倉庫是Maven用來導入構(gòu)建系統(tǒng)本地倉庫的遠程項目的集合。Maven在這個倉庫中取得插件和依賴。不同的遠程倉庫包含不同的項目,在激活的<code>profile</code>中,倉庫會被查詢匹配相應(yīng)的發(fā)布或者是快照版本的構(gòu)件。

- release, snapshot: 這是構(gòu)建的兩種不同的類型,發(fā)布版或者是快照版。通過這兩個配置,POM在一個倉庫中任意修改依賴的類型。例如,只允許通過快照倉庫下載,為了方便開發(fā)。
- enbaled: <code>true</code>或者<code>false</code>決定當前倉庫是否對發(fā)布版或者是快照版類型的構(gòu)件有效。
- updatePolicy: 這個元素指定了多久更新一次。Maven會去比較本地的POM的時間戳(存儲在倉庫的maven元數(shù)據(jù)中)。
- checksumPolicy: 當Maven部署文件到倉庫,它也會把相應(yīng)的校驗和文件部署上去。對于丟失或者不正確的校驗和你的可選項是<code>ignore</code>,<code>fail</code>或者是<code>warn</code>。
- layout: 在上面展示的倉庫中,它們都遵守一個通用的布局。這是非常正確的。Maven2對于它的倉庫有一個默認的布局。然而,Maven1.x過去有一個不同的布局。使用這個元素去指定<code>default</code>或者是<code>legacy</code>布局。
2.6.3 插件倉庫
倉庫是主要的兩種類型的構(gòu)件的存放位置。第一種是作為其它構(gòu)件依賴的構(gòu)件。大部分存在于中央倉庫的構(gòu)件都是這種類型。另外一種類型是插件。Maven插件自身是一種特殊的構(gòu)件。鑒于此,Maven的插件倉庫和其它倉庫是分開的。不管怎么說,<code>pluginRepositories</code>元素塊的結(jié)構(gòu)和<code>repositories</code>的結(jié)構(gòu)相似。每個<code>pluginRepository</code>元素指定了一個遠程的位置用于Maven查找新的插件。
2.7 激活簡介

<code>settings.xml</code>的最后一個一級元素是<code>activeProfiles</code>。它包含一個<code>activeProfile</code>元素的集合,每個下級元素又包含<code>profile id</code>的值。任何被定義在<code>activeProfile</code>內(nèi)的<code>profile id</code>都將會被激活,無論其它的環(huán)境變量如何配置。如果沒有匹配到任何<code>profile</code>,則不會發(fā)生任何事情。例如,<code>env-test</code>是一個<code>activeProfile</code>,一個相應(yīng)的<code>id</code>的在POM內(nèi)的<code>profile</code>,或者是一個<code>profile.xml</code>就將會被激活。如果沒發(fā)現(xiàn)這個<code>profile</code>,則執(zhí)行結(jié)果將會和往常一樣。
Translation in 8/21 2015 ,By ChangWei Li.