1. 程式人生 > 其它 >maven settings.xml配置詳解

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倉庫的索引

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