春節假期在家養病,乘有時間整理了下之前的知識——知識貴在歸納總結。
參照了官方文檔,針對其中的一些未描述詳盡的內容翻查了不少資料,補充到了配置文件中,同時再加上一些說明、例子,方便查閱。
內容雖然比較多,但是容易理解,希望對大家有用。很多知識都來自與網絡,感謝網絡上各位願意分享的老師。
因為轉發請保留原地址,感謝:https://www.cnblogs.com/iceJava/p/10356309.html
<?xml version="1.0" encoding="UTF-8"?> <!-- | 官方文檔: https://maven.apache.org/settings.html | | Maven 提供以下兩種 level 的配置: | | 1. User Level. 當前用戶獨享的配置, 通常在 ${user.home}/.m2/settings.xml 目錄下。 | 可在 CLI 命令行中通過以下參數設置: -s /path/to/user/settings.xml | | 2. Global Level. 同一台計算機上的所有 Maven 用戶共享的全局配置。 通常在${maven.home}/conf/settings.xml目錄下。 | 可在 CLI 命令行中通過以下參數設置: -gs /path/to/global/settings.xml | | 備注: User Level 優先級 > Global Level |--> <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"> <!-- | Maven 依賴搜索順序, 當我們執行 Maven 命令時, Maven 開始按照以下順序查找依賴的庫: | | 步驟 1 - 在本地倉庫中搜索, 如果找不到, 執行步驟 2, 如果找到了則執行其他操作。 | 步驟 2 - 在中央倉庫中搜索, 如果找不到, 並且有一個或多個遠程倉庫已經設置, 則執行步驟 4, 如果找到了則下載到本地倉庫中已被將來引用。 | 步驟 3 - 如果遠程倉庫沒有被設置, Maven 將簡單的停滯處理並拋出錯誤(無法找到依賴的文件)。 | 步驟 4 - 在一個或多個遠程倉庫中搜索依賴的文件, 如果找到則下載到本地倉庫已被將來引用, 否則 Maven 將停止處理並拋出錯誤(無法找到依賴的文件)。 |--> <!-- 地倉庫路徑, 默認值: ${user.home}/.m2/repository --> <localRepository>${user.home}/workspace/env/maven/repository</localRepository> <!-- 當 maven 需要輸入值的時候, 是否交由用戶輸入, 默認為true;false 情況下 maven 將根據使用配置信息進行填充 --> <interactiveMode>true</interactiveMode> <!-- 是否支持聯網進行 artifact 下載、 部署等操作, 默認: false --> <offline>false</offline> <!-- | 搜索插件時, 如果 groupId 沒有顯式提供時, 則以此處配置的 groupId 為默認值, 可以簡單理解為默認導入這些 groupId 下的所有 artifact(需要時才下載) | 默認情況下該列表包含了 org.apache.maven.plugins和org.codehaus.mojo | | 查看插件信息: | mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:3.5.1 -Ddetail |--> <pluginGroups> <!-- plugin 的 groupId --> <!-- <pluginGroup>com.your.plugins</pluginGroup> --> </pluginGroups> <!-- 進行遠程服務器訪問時所需的授權配置信息。通過系統唯一的 server-id 進行唯一關聯 --> <servers> <server> <!-- 這是 server 的 id, 該 id 與 distributionManagement 中 repository 元素的id 相匹配 --> <id>server_id</id> <!-- 鑒權用戶名 --> <username>auth_username</username> <!-- 鑒權密碼 --> <password>auth_pwd</password> <!-- 鑒權時使用的私鑰位置。和前兩個元素類似, 私鑰位置和私鑰密碼指定了一個私鑰的路徑(默認是/home/hudson/.ssh/id_dsa)以及如果需要的話, 一個密鑰 --> <privateKey>path/to/private_key</privateKey> <!-- 鑒權時使用的私鑰密碼, 非必要, 非必要時留空 --> <passphrase>some_passphrase</passphrase> <!-- | 文件被創建時的權限。如果在部署的時候會創建一個倉庫文件或者目錄, 這時候就可以使用權限(permission) | 這兩個元素合法的值是一個三位數字, 其對應了unix文件系統的權限, 如664, 或者775 |--> <filePermissions>664</filePermissions> <!-- 目錄被創建時的權限 --> <directoryPermissions>775</directoryPermissions> <!-- 傳輸層額外的配置項 --> <configuration></configuration> </server> </servers> <!-- | 從遠程倉庫才下載 artifacts 時, 用於替代指定遠程倉庫的鏡像服務器配置; | | 例如當您無法連接上國外的倉庫是, 可以指定連接到國內的鏡像服務器; | | pom.xml 和 setting.xml 中配置的倉庫和鏡像優先級關系(mirror 優先級高於 repository): | | repository(setting.xml) < repository(pom.xml) < mirror(setting.xml) | | 例如, 如果配置了 mirrorOf = *, 則 不管項目的 pom.xml 配置了什么倉庫, 最終都會被鏡像到 鏡像倉庫 | | 私服的配置推薦用profile配置而不是mirror |--> <mirrors> <!-- | 【mirro 匹配順序】: | 多個 mirror 優先級 按照 id字母順序進行排列(即與編寫的順序無關) | 在第一個 mirror 找不到 artifact, 不會繼續超找下一個鏡像。 | 只有當 mirror 無法鏈接的時候, 才會嘗試鏈接下一個鏡像, 類似容災備份。 |--> <!-- 上海交通大學反向代理 --> <mirror> <!-- 該鏡像的唯一標識符, id用來區分不同的 mirror 元素, 同時會套用使用 server 中 id 相同授權配置鏈接到鏡像 --> <id>sjtugmaven</id> <!-- 鏡像名稱, 無特殊作用, 可視為簡述 --> <name>sjtug maven proxy</name> <!-- 鏡像地址 --> <url>https://mirrors.sjtug.sjtu.edu.cn/maven-central/</url> <!-- 被鏡像的服務器的id, 必須與 repository 節點設置的 ID 一致。但是 This must not match the mirror id | mirrorOf 的配置語法: | * = 匹配所有遠程倉庫。 這樣所有 pom 中定義的倉庫都不生效 | external:* = 匹配除 localhost、使用 file:// 協議外的所有遠程倉庫 | repo1,repo2 = 匹配倉庫 repo1 和 repo2 | *,!repo1 = 匹配所有遠程倉庫, repo1 除外 |--> <mirrorOf>central</mirrorOf> </mirror> </mirrors> <!-- 用來配置不同的代理, 多代理 profiles 可以應對筆記本或移動設備的工作環境: 通過簡單的設置 profile id 就可以很容易的更換整個代理配置 --> <proxies> <!-- 代理元素包含配置代理時需要的信息 --> <proxy> <!-- 代理的唯一定義符, 用來區分不同的代理元素 --> <id>example_proxy</id> <!-- 該代理是否是激活的那個。true則激活代理。當我們聲明了一組代理, 而某個時候只需要激活一個代理的時候, 該元素就可以派上用處 --> <active>false</active> <!-- 代理的協議 --> <protocol>https</protocol> <!-- 代理的主機名 --> <host>proxy.molo.com</host> <!-- 代理的端口 --> <port>443</port> <!-- 代理服務器認證的登錄名 --> <username>proxy_user</username> <!-- 代理服務器認證登錄密碼 --> <password>proxy_pwd</password> <!-- 不該被代理的主機名列表。該列表的分隔符由代理服務器指定;例子中使用了豎線分隔符, 使用逗號分隔也很常見 --> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> <!-- | 構建方法的配置清單, maven 將根據不同環境參數來使用這些構建配置。 | settings.xml 中的 profile 元素是 pom.xml 中 profile 元素的裁剪版本。 | settings.xml 負責的是整體的構建過程, pom.xml 負責單獨的項目對象構建過程。 | settings.xml 只包含了id, activation, repositories, pluginRepositories 和 properties 元素。 | | 如果 settings 中的 profile 被激活, 它的值會覆蓋任何其它定義在 pom.xml 中或 profile.xml 中的相同 id 的 profile。 | | 查看當前激活的 profile: | mvn help:active-profiles |--> <profiles> <profile> <!-- 該配置的唯一標識符 --> <id>profile_id</id> <!-- | profile 的激活條件配置; | 其他激活方式: | 1. 通過 settings.xml 文件中的 activeProfile 元素進行指定激活。 | 2. 在命令行, 使用-P標記和逗號分隔的列表來顯式的激活, 如: mvn clean package -P myProfile)。 |--> <activation> <!-- 是否默認激活 --> <activeByDefault>false</activeByDefault> <!-- 內建的 java 版本檢測, 匹配規則: https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html --> <jdk>9.9</jdk> <!-- 內建操作系統屬性檢測, 配置規則: https://maven.apache.org/enforcer/enforcer-rules/requireOS.html --> <os> <!-- 操作系統 --> <name>Windows XP</name> <!-- 操作系統家族 --> <family>Windows</family> <!-- 操作系統 --> <arch>x86</arch> <!-- 操作系統版本 --> <version>5.1.2600</version> </os> <!-- | 如果Maven檢測到某一個屬性(其值可以在POM中通過${名稱}引用), 並且其擁有對應的名稱和值, Profile就會被激活。 | 如果值字段是空的, 那么存在屬性名稱字段就會激活profile, 否則按區分大小寫方式匹配屬性值字段 |--> <property> <!-- 屬性名 --> <name>mavenVersion</name> <!-- 屬性值 --> <value>2.0.3</value> </property> <!-- 根據文件存在/不存在激活profile --> <file> <!-- 如果指定的文件存在, 則激活profile --> <exists>/path/to/active_on_exists</exists> <!-- 如果指定的文件不存在, 則激活profile --> <missing>/path/to/active_on_missing</missing> </file> </activation> <!-- 擴展屬性設置。擴展屬性可以在 POM 中的任何地方通過 ${擴展屬性名} 進行引用 | | 屬性引用方式(包括擴展屬性, 共 5 種屬性可以引用): | | env.x : 引用 shell 環境變量, 例如, "env.PATH"指代了 $path 環境變量(在 Linux / Windows 上是 %PATH% ). | project.x : 引用 pom.xml(根元素就是 project) 中 xml 元素內容.例如 ${project.artifactId} 可以獲取 pom.xml 中設置的 <artifactId /> 元素的內容 | settings.x : 引用 setting.xml(根元素就是 setting) 中 xml 元素內容, 例如 ${settings.offline} | Java System Properties : 所有可通過 java.lang.System.getProperties() 訪問的屬性都能在通過 ${property_name} 訪問, 例如 ${java.home} | x : 在 <properties/> 或者 外部文件 中設置的屬性, 都可以 ${someVar} 的形式使用 | |--> <properties> <!-- 在當前 profile 被激活時, ${profile.property} 就可以被訪問到了 --> <profile.property>this.property.is.accessible.when.current.profile.actived</profile.property> </properties> <!-- 遠程倉庫列表 --> <repositories> <!-- | releases vs snapshots | maven 針對 releases、snapshots 有不同的處理策略, POM 就可以在每個單獨的倉庫中, 為每種類型的 artifact 采取不同的策略 | 例如: | 開發環境 使用 snapshots 模式實時獲取最新的快照版本進行構建 | 生成環境 使用 releases 模式獲取穩定版本進行構建 | 參見repositories/repository/releases元素 |--> <!-- | 依賴包不更新問題: | 1. Maven 在下載依賴失敗后會生成一個.lastUpdated 為后綴的文件。如果這個文件存在, 那么即使換一個有資源的倉庫后, Maven依然不會去下載新資源。 | 可以通過 -U 參數進行強制更新、手動刪除 .lastUpdated 文件: | find . -type f -name "*.lastUpdated" -exec echo {}" found and deleted" \; -exec rm -f {} \; | | 2. updatePolicy 設置更新頻率不對, 導致沒有觸發 maven 檢查本地 artifact 與遠程 artifact 是否一致 |--> <repository> <!-- 遠程倉庫唯一標識 --> <id>maven_repository_id</id> <!-- 遠程倉庫名稱 --> <name>maven_repository_name</name> <!-- 遠程倉庫URL, 按protocol://hostname/path形式 --> <url>http://host/maven</url> <!-- | 用於定位和排序 artifact 的倉庫布局類型-可以是 default(默認)或者 legacy(遺留) | Maven 2為其倉庫提供了一個默認的布局;然而, Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(默認)還是legacy(遺留) | --> <layout>default</layout> <!-- 如何處理遠程倉庫里發布版本的下載 --> <releases> <!-- 是否允許該倉庫為 artifact 提供 發布版 / 快照版 下載功能 --> <enabled>false</enabled> <!-- | 每次執行構建命令時, Maven 會比較本地 POM 和遠程 POM 的時間戳, 該元素指定比較的頻率。 | 有效選項是: | always(每次構建都檢查), daily(默認, 距上次構建檢查時間超過一天), interval: x(距上次構建檢查超過 x 分鍾)、 never(從不) | | 重要: | 設置為 daily, 如果 artifact 一天更新了幾次, 在一天之內進行構建, 也不會從倉庫中重新獲取最新版本 |--> <updatePolicy>always</updatePolicy> <!-- 當 Maven 驗證 artifact 校驗文件失敗時該怎么做: ignore(忽略), fail(失敗), 或者warn(警告) --> <checksumPolicy>warn</checksumPolicy> </releases> <!-- 如何處理遠程倉庫里快照版本的下載 --> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> </repository> <!-- 國內可用的 maven 倉庫地址(updated @ 2019-02-08): http://maven.aliyun.com/nexus/content/groups/public http://maven.wso2.org/nexus/content/groups/public/ http://jcenter.bintray.com/ http://maven.springframework.org/release/ http://repository.jboss.com/maven2/ http://uk.maven.org/maven2/ http://repo1.maven.org/maven2/ http://maven.springframework.org/milestone http://maven.jeecg.org/nexus/content/repositories/ http://repo.maven.apache.org/maven2 http://repo.spring.io/release/ http://repo.spring.io/snapshot/ http://mavensync.zkoss.org/maven2/ https://repository.apache.org/content/groups/public/ https://repository.jboss.org/nexus/content/repositories/releases/ --> </repositories> <!-- | maven 插件的遠程倉庫配置。maven 插件實際上是一種特殊類型的 artifact。 | 插件倉庫獨立於 artifact 倉庫。pluginRepositories 元素的結構和 repositories 元素的結構類似。 |--> <!-- <pluginRepositories> <pluginRepository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </pluginRepository> </pluginRepositories> --> </profile> </profiles> <!-- | 手動激活 profiles 的列表, 按照 profile 被應用的順序定義 activeProfile | 任何 activeProfile, 不論環境設置如何, 其對應的 profile 都會被激活, maven 會忽略無效(找不到)的 profile |--> <!-- <activeProfiles> <activeProfile>not-exits-profile</activeProfile> </activeProfiles> --> </settings>