簡介:html
概覽java
當Maven運行過程當中的各類配置,例如pom.xml,不想綁定到一個固定的project或者要分配給用戶時,咱們使用settings.xml中的settings元素來肯定這些配置。這包含了本地倉庫位置,遠程倉庫服務器以及認證信息等。apache
settings.xml存在於兩個地方:安全
1.安裝的地方:$M2_HOME/conf/settings.xml服務器
2.用戶的目錄:${user.home}/.m2/settings.xml網絡
前者又被叫作全局配置,後者被稱爲用戶配置。若是二者都存在,它們的內容將被合併,而且用戶範圍的settings.xml優先。ssh
若是你偶爾須要建立用戶範圍的settings,你能夠簡單的copy Maven安裝路徑下的settings到目錄${user.home}/.m2。Maven默認的settings.xml是一個包含了註釋和例子的模板,你能夠快速的修改它來達到你的要求。maven
下面是settings下的頂層元素的一個概覽:佈局
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 <localRepository/> 6 <interactiveMode/> 7 <usePluginRegistry/> 8 <offline/> 9 <pluginGroups/> 10 <servers/> 11 <mirrors/> 12 <proxies/> 13 <profiles/> 14 <activeProfiles/> 15 </settings>
settings的內容能夠在下面這些地方篡改:google
1.${user.home}和全部其餘的系統屬性
2.${env.HOME}等環境變量
注意:settins.xml中profiles下定義的屬性不能被篡改。
配置細節:
簡單的值
一半以上的頂級settings元素師簡單的值,表明了一直處於活躍的構建系統的元素的取值範圍。
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 <localRepository>${user.home}/.m2/repository</localRepository> 6 <interactiveMode>true</interactiveMode> 7 <usePluginRegistry>false</usePluginRegistry> 8 <offline>false</offline> 9 ... 10 </settings>
localRepository:這個值是構建系統的本地倉庫的路徑。默認的值是${user.home}/.m2/repository.若是一個系統想讓全部登錄的用戶都用同一個本地倉庫的話,這個值是極其有用的。
interactiveMode:若是Maven要試圖與用戶交互來獲得輸入就設置爲true,不然就設置爲false,默認爲true。
usePluginRegistry:若是Maven使用${user.home}/.m2/plugin-registry.xml來管理plugin的版本,就設置爲true,默認爲false。
offline:若是構建系統要在離線模式下工做,設置爲true,默認爲false。若是構建服務器由於網絡故障或者安全問題不能與遠程倉庫相連,那麼這個設置是很是有用的。
插件組
這個元素包含了一系列pluginGroup元素,每一個又包含了一個groupId。當一個plugin被使用,而它的groupId沒有被提供的時候,這個列表將被搜索。這個列表自動的包含了org.apache.maven.plugins和org.codehaus.mojo。
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <pluginGroups> 7 <pluginGroup>org.mortbay.jetty</pluginGroup> 8 </pluginGroups> 9 ... 10 </settings>
例如,有了上面的配置,Maven命令行可使用簡單的命令執行org.morbay.jetty:jetty-maven-plugin:run,以下
mvn jetty run
服務器
用來下載和部署的倉庫是用POM中的repositories和distributionManagement元素來定義的。可是某些配置例如username和password就不該該隨着pom.xml來分配了。這種類型的信息應該保存在構建服務器中的settings.xml中。
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <servers> 7 <server> 8 <id>server001</id> 9 <username>my_login</username> 10 <password>my_password</password> 11 <privateKey>${user.home}/.ssh/id_dsa</privateKey> 12 <passphrase>some_passphrase</passphrase> 13 <filePermissions>664</filePermissions> 14 <directoryPermissions>775</directoryPermissions> 15 <configuration></configuration> 16 </server> 17 </servers> 18 ... 19 </settings>
id:這是Server的ID(不是登陸進來的user),與Maven想要鏈接上的repository/mirror中的id元素相匹配。
username,password:這兩個元素成對出現,表示鏈接這個server須要驗證username和password。
privateKey,passphrase:與前兩個元素同樣,這兩個成對出現,分別指向了一個私鑰(默認的是${user.home}/.ssh/id_dsa)和一個passphrase。passphrase和password元素可能在未來被客觀化,可是如今必須以文本形式在settings.xml中設置。
filePermissions,directoryPermissions:當一個倉庫文件或者目錄在部署階段被建立的時候,就必須用到權限許可。他們合法的值是三個數字,就像*nix中的文件權限,例如:664,775.
注意:若是你使用了一個私鑰來登陸server,那麼password元素必須被省略,不然私鑰將被忽視。
密碼加密
一個新特徵:服務器password和passphrase加密已經被升到2.1.0+
鏡像
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <mirrors> 7 <mirror> 8 <id>planetmirror.com</id> 9 <name>PlanetMirror Australia</name> 10 <url>http://downloads.planetmirror.com/pub/maven2</url> 11 <mirrorOf>central</mirrorOf> 12 </mirror> 13 </mirrors> 14 ... 15 </settings>
id,name:惟一的鏡像標識和用戶友好的鏡像名稱。id被用來區分mirror元素,而且當鏈接時候被用來得到相應的證書。
url:鏡像基本的URL,構建系統敬將使用這個URL來鏈接倉庫,而不是原來的倉庫URL。
mirrorOf:鏡像所包含的倉庫的Id。例如,指向Maven central倉庫的鏡像(http://repo1.maven.org/maven2/),設置這個元素爲central。更多的高級映射例如repo1,repo2 或者*,!inhouse都是能夠的。不必必定和mirror的id相匹配。
代理
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <proxies> 7 <proxy> 8 <id>myproxy</id> 9 <active>true</active> 10 <protocol>http</protocol> 11 <host>proxy.somewhere.com</host> 12 <port>8080</port> 13 <username>proxyuser</username> 14 <password>somepassword</password> 15 <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> 16 </proxy> 17 </proxies> 18 ... 19 </settings>
id:proxy的惟一標識,用來區別proxy元素。
active:當proxy被激活的時候爲true。當申明的代理不少的時候,這個頗有用,可是同一時間僅有一個被激活。
protocol,host,port:代理地址protocol://host:port的分散形式。
username,password:兩個元素成對出現,提供鏈接proxy服務器時的認證。
nonProxyHosts:這裏列出了不須要使用代理的hosts。列表的分隔符是proxy服務器想要的類型。上面例子使用了pipe分隔符,逗號分隔符也比較通用。
配置文件
settings.xml中的profile是pom.xml中的profile的簡潔形式。它包含了激活(activation),倉庫(repositories),插件倉庫(pluginRepositories)和屬性(properties)元素。profile元素僅包含這四個元素是由於他們涉及到整個的構建系統,而不是個別的POM配置。
若是settings中的profile被激活,那麼它的值將重載POM或者profiles.xml中的任何相等ID的profiles。
激活(activation)
activations是profile的關鍵,就像POM中的profiles,profile的能力在於它在特定狀況下能夠修改一些值。而這些狀況是經過activation來指定的。
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <profiles> 7 <profile> 8 <id>test</id> 9 <activation> 10 <activeByDefault>false</activeByDefault> 11 <jdk>1.5</jdk> 12 <os> 13 <name>Windows XP</name> 14 <family>Windows</family> 15 <arch>x86</arch> 16 <version>5.1.2600</version> 17 </os> 18 <property> 19 <name>mavenVersion</name> 20 <value>2.0.3</value> 21 </property> 22 <file> 23 <exists>${basedir}/file2.properties</exists> 24 <missing>${basedir}/file1.properties</missing> 25 </file> 26 </activation> 27 ... 28 </profile> 29 </profiles> 30 ... 31 </settings>
若是全部指定的條件都達到了,那麼,activation就被觸發,並且不須要一次性所有達到。
jdk:在jdk元素中,activation有一個內建的,java版本檢測。若是檢測到jdk版本與期待的同樣,那麼就激活。在上面的例子中,1.5.0_06是知足的。
os:os元素能夠定義一些上面所示的操做系統特定的屬性。
property:若是Maven檢測到相應的名值對的屬性,那麼,這個profile將被激活。
file:若是給定的文件存在,或者不存在那麼將激活這個profile。
activation並非惟一激活profile的途徑。settings.xml中的activeProfile包含了profile的id。他們也能夠經過命令行來顯式的激活,例如-P test。
若是你想查看在一個構建過程當中有哪些profile會被激活。就使用maven-help-plugin
mvn help:active-profiles
屬性(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}
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <profiles> 7 <profile> 8 ... 9 <properties> 10 <user.install>${user.home}/our-project</user.install> 11 </properties> 12 ... 13 </profile> 14 </profiles> 15 ... 16 </settings>
若是這個profile被激活,那麼屬性${user.install}就能夠被訪問了。
倉庫(repositories)
倉庫是Maven用來構築構建系統的本地倉庫的遠程項目集合。它來自於被Maven叫作插件和依賴的本地倉庫。不一樣的遠程倉庫包含不一樣的項目,當profile被激活,他們就會需找匹配的release或者snapshot構件。
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <profiles> 7 <profile> 8 ... 9 <repositories> 10 <repository> 11 <id>codehausSnapshots</id> 12 <name>Codehaus Snapshots</name> 13 <releases> 14 <enabled>false</enabled> 15 <updatePolicy>always</updatePolicy> 16 <checksumPolicy>warn</checksumPolicy> 17 </releases> 18 <snapshots> 19 <enabled>true</enabled> 20 <updatePolicy>never</updatePolicy> 21 <checksumPolicy>fail</checksumPolicy> 22 </snapshots> 23 <url>http://snapshots.maven.codehaus.org/maven2</url> 24 <layout>default</layout> 25 </repository> 26 </repositories> 27 <pluginRepositories> 28 ... 29 </pluginRepositories> 30 ... 31 </profile> 32 </profiles> 33 ... 34 </settings>
releases,snapshots:這是各類構件的策略,release或者snapshot。因了這兩個集合,POM能夠在單個的倉庫中不依賴於另一個的策略而改變當前策略。例如:一我的可能只下載snapshot用來開發。
enable:true或者false,來標記倉庫是否爲各自的類型激活(release 或者 snapshot)。
updatePolicy:這個元素指明瞭更新的頻率。Maven會比較本地POM與遠程的時間戳。可選的項目爲:always,daily,interval:X,nerver。
checksumPolicy:當Maven向倉庫部署文件的時候,它也部署了相應的校驗和文件。可選的爲:ignore,fail,warn,或者不正確的校驗和。
layout:在上面描述倉庫的時候,咱們提到他們有統一的佈局。這徹底正確。使用這個來代表它是default仍是legacy。
插件倉庫(plugin repositories)
倉庫包含了兩種重要類型的構件。第一種是用來作其餘構件依賴的構件,這是在中央倉庫中的大多數插件。另一種類型的構件就是插件。Maven的插件自己就是一種特殊的構件。所以,插件倉庫被從其餘倉庫中分離出來。不管怎麼說,pluginRepositories元素模塊的結構與repositories模塊很類似。pluginRepository元素指向一個能夠找到新插件的遠程地址。
激活配置(Active Profiles)
1 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 4 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 5 ... 6 <activeProfiles> 7 <activeProfile>env-test</activeProfile> 8 </activeProfiles> 9 </settings>
settings.xml最後一個謎題是activeProfiles元素。它包含一系列的activeProfile元素,每一個都有一個profile id的值,任何profile id被定義到activeProfile的profile將被激活,無論其餘的環境設置怎麼樣。若是沒有匹配的profile被找到,那麼就什麼事情也不作。例如:若是env-test是一個activeProfile,一個在pom.xml或者profile.xml中的具備相應id的profile將被激活。若是沒有這樣的profile被找到,就什麼事也不作,一切照常。
原文地址:http://maven.apache.org/settings.html
分類: Maven