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