一般來說Maven都是配合著idea一起使用,下載依賴速度慢就去網上找個鏡像配置一下,但總會遇到莫名其妙的問題,比如鏡像源不生效、Error reading file pom.xml等等。今天詳細講解一下maven配置文件settings.xml的配置方法。 小知識 maven的配置文件存在於兩個地 ...
一般來說Maven都是配合著idea一起使用,下載依賴速度慢就去網上找個鏡像配置一下,但總會遇到莫名其妙的問題,比如鏡像源不生效、Error reading file pom.xml等等。今天詳細講解一下maven配置文件settings.xml的配置方法。
小知識
maven的配置文件存在於兩個地方,一個是用戶目錄下的.m2目錄:${user.home}/.m2/
;另一個是maven程式目錄下的conf目錄下:C:\Program Files\apache-maven-3.9.6\conf
(假設maven程式被解壓到了C:\Program Files\)
如果沒有指定使用哪一個settings配置,maven會使用這兩個配置文件合併後的配置,相同的配置項會優先使用用戶目錄${user.home}/.m2/
中settings文件內的配置。建議這兩個目錄的settings文件保持一致。
settings.xml中的頂級標簽
<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 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
我們逐一講解一下
localRepository
localRepository就是你的本地倉庫位置,一般使用idea的話會在idea中配置這個屬性,但使用cmd的話就會用到這個配置,示例配置:<localRepository>D:/maven_repository/</localRepository>
interactiveMode
當interactiveMode
設置為true時,表示Maven處於交互模式。在交互模式下,當Maven需要用戶輸入時(例如需要用戶確認某些操作或提供必要的信息),它會提示用戶並等待用戶的輸入。這對於需要用戶交互的操作非常有用,例如在部署過程中需要用戶提供密碼或確認某些操作。
當interactiveMode
設置為false時,表示Maven處於非交互模式。在非交互模式下,Maven不會提示用戶輸入,而是使用預設值或者根據配置自動執行操作。這對於自動化構建或者持續集成環境非常有用,因為在這些場景下通常不希望Maven等待用戶輸入。
interactiveMode
預設是true,但也可以在settings中配置一下,示例:<interactiveMode>true</interactiveMode>
offline
當offline
設置為true時,表示Maven處於離線模式。在離線模式下,Maven不會嘗試從遠程倉庫下載任何依賴項或插件,而是只使用本地倉庫中已有的資源。這意味著,如果本地倉庫中缺少某些依賴項,Maven將無法自動下載它們,並可能導致構建失敗。
當offline
設置為false時,表示Maven處於線上模式。在線上模式下,Maven會根據需要從遠程倉庫下載依賴項和插件,並將它們存儲在本地倉庫中以供後續使用。
使用離線模式的主要目的是在無法連接到遠程倉庫的情況下進行構建,例如在沒有網路連接的環境中,或者為了加快構建速度而避免不必要的網路請求。
offline
預設是false,也可以在settings中配置一下,示例:<offline>false</offline>
pluginGroups
pluginGroups
是一個用於配置插件組的參數。它允許你定義一組插件的首碼,以便在項目的POM文件中使用較短的插件名稱。
當你在POM文件中使用插件時,通常需要指定插件的完整坐標,包括groupId
、artifactId
和version
。例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
...
</plugin>
但是,如果你在pluginGroups中配置了插件組,就可以省略插件的groupId,只使用較短的artifactId。Maven會根據pluginGroups中的配置自動推斷完整的插件坐標。
下麵是一個pluginGroups的配置示例:
<settings>
...
<pluginGroups>
<pluginGroup>org.apache.maven.plugins</pluginGroup>
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
...
</settings>
在上述示例中,我們定義了兩個插件組:org.apache.maven.plugins和org.codehaus.mojo。這意味著在POM文件中使用這兩個組下的插件時,可以省略groupId。
例如,在配置了上述pluginGroups後,可以在POM文件中簡化插件的聲明:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
...
</plugin>
Maven會自動將maven-compiler-plugin解析為完整的坐標org.apache.maven.plugins:maven-compiler-plugin:3.8.1
。
使用pluginGroups的好處是可以簡化POM文件中的插件聲明,減少重覆的groupId配置。它提供了一種更簡潔的方式來引用常用的插件組。
需要註意的是,如果項目的POM文件中明確指定了插件的groupId,那麼pluginGroups中的配置將被忽略,Maven會使用POM文件中指定的完整坐標。
servers
servers
是一個用於配置伺服器身份驗證信息的參數。它允許你定義一組伺服器的身份驗證詳細信息,以便Maven在訪問受保護的資源(如部署到遠程倉庫)時使用這些信息進行身份驗證。
當Maven需要訪問受保護的資源時,它會查找servers
配置,並使用匹配的伺服器身份驗證信息來進行身份驗證。
下麵是一個servers
的配置示例,一般使用私服會用到這個配置:
<settings>
...
<servers>
<server>
<id>my-repo</id>
<username>my-username</username>
<password>my-password</password>
</server>
<server>
<id>another-repo</id>
<username>another-username</username>
<password>another-password</password>
</server>
</servers>
...
</settings>
在上述示例中,我們定義了兩個伺服器的身份驗證信息:
第一個伺服器的id
為my-repo
,對應的用戶名為my-username
,密碼為my-password
。
第二個伺服器的id
為another-repo
,對應的用戶名為another-username
,密碼為another-password
。
伺服器的id
是一個唯一的標識符,用於在其他配置或POM文件中引用該伺服器。例如,在pom.xml的distributionManagement
部分中,你可以使用伺服器的id
來指定部署到遠程倉庫時使用的身份驗證信息。
<project>
...
<distributionManagement>
<repository>
<id>my-repo</id>
<url>https://example.com/my-repo</url>
</repository>
</distributionManagement>
...
</project>
在上述示例中,my-repo
對應於servers
中定義的伺服器id。Maven將使用與my-repo
關聯的用戶名和密碼來訪問和部署構件到指定的遠程倉庫。
通過在settings.xml文件中配置servers
,你可以集中管理Maven訪問受保護資源時所需的身份驗證信息。這樣可以避免在項目的POM文件中直接存儲敏感的用戶名和密碼,提高了安全性。
需要註意的是,在Maven2.1.0及更新的版本中,servers
中的密碼可以使用Maven的加密機制進行加密,以進一步提高安全性。你可以使用Maven的內置加密功能或使用外部加密工具來加密密碼,然後將加密後的密碼存儲在settings.xml文件中。
使用Maven加密密碼:
- 打開命令行終端或命令提示符。
- 導航到Maven的安裝目錄下的bin目錄。
- 執行以下命令來生成主密碼(master password):
系統會提示你輸入主密碼,輸入後按回車鍵。Maven會生成一個加密後的主密碼。mvn --encrypt-master-password
- 將加密後的主密碼複製,並將其添加到settings.xml文件中的
<settings>
元素下,使用<settingsSecurity>
元素進行配置:<settings> <settingsSecurity> <master>{加密後的主密碼}</master> </settingsSecurity> ... </settings>
- 執行以下命令生成加密後的伺服器密碼:
系統會提示你輸入要加密的密碼,輸入後按回車鍵。Maven會生成一個加密後的密碼。mvn --encrypt-password
- 將加密後的密碼複製,並將其添加到settings.xml文件中對應伺服器的
<password>
元素中:<servers> <server> <id>my-server</id> <username>my-username</username> <password>{加密後的密碼}</password> </server> </servers>
完成上述步驟後,settings.xml文件中的密碼就被加密了。當Maven需要訪問受保護的資源時,它會使用主密碼來解密伺服器密碼,然後使用解密後的密碼進行身份驗證。
以下是一個完整的示例:
<settings>
<settingsSecurity>
<master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>
<servers>
<server>
<id>my-server</id>
<username>my-username</username>
<password>{COQLCE6DU6GtcS5P=}</password>
</server>
</servers>
</settings>
主密碼和伺服器密碼都放在了settings文件中,那誰拿到這個文件都可以訪問伺服器,和不加密沒什麼區別,建議使用私鑰進行加密,maven密碼加密部分我會新寫一篇文章,感興趣的可以關註一下。
mirrors
這個配置項使我們使用最多的了,mirrors
用於配置倉庫鏡像。倉庫鏡像是一種代理伺服器,用於替代原始的倉庫URL,以提高下載速度、增強可用性或提供額外的安全性。
當Maven需要從倉庫下載構件時,它會先檢查是否有匹配的鏡像配置。如果找到了匹配的鏡像,Maven將使用鏡像URL替代原始的倉庫URL進行下載。
下麵是一個示例:
<settings>
...
<mirrors>
<mirror>
<id>my-mirror</id>
<name>My Mirror</name>
<url>https://my-mirror.example.com/repo</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
<id>
:鏡像的唯一標識符。它用於區分不同的鏡像配置。
<name>
:鏡像的名稱。這個名稱是可選的,主要用於提供一個友好的描述。
<url>
:鏡像的URL。這是鏡像伺服器的實際地址,Maven將使用這個URL替代原始的倉庫URL進行下載。
<mirrorOf>
:指定鏡像所代表的原始倉庫。這個值可以是倉庫的ID或者一個特殊的值,用於匹配多個倉庫。常見的值有:
central
:替代Maven中央倉庫。*
:匹配所有倉庫。external:*
:匹配除了本地倉庫之外的所有外部倉庫。repo1,repo2
:匹配倉庫ID為repo1和repo2的倉庫。*,!repo1
:匹配除了倉庫ID為repo1之外的所有倉庫。
當Maven需要下載構件時,它會按照以下順序查找鏡像:
- 如果有匹配的鏡像,且
<mirrorOf>
的值與要下載的倉庫ID
完全匹配,則使用該鏡像。 - 如果有匹配的鏡像,且
<mirrorOf>
的值為*
,則使用該鏡像。 - 如果有匹配的鏡像,且
<mirrorOf>
的值為external:*
,且要下載的倉庫不是本地倉庫,則使用該鏡像。 - 如果有匹配的鏡像,且
<mirrorOf>
的值包含要下載的倉庫ID
,則使用該鏡像。 - 如果沒有找到匹配的鏡像,則直接使用原始的倉庫URL進行下載。
當Maven需要從倉庫下載構件時,它會按照以下順序查找匹配的鏡像配置:
-
精確匹配:
- 如果有一個鏡像的
<mirrorOf>
值與要下載的倉庫ID完全匹配,則使用該鏡像。 - 例如,如果要下載的倉庫
ID
為my-repo
,且有一個鏡像的<mirrorOf>
值為my-repo
,則使用該鏡像。
- 如果有一個鏡像的
-
全匹配:
- 如果有一個鏡像的
<mirrorOf>
值為*
,則使用該鏡像。 - 這個鏡像將匹配所有的倉庫,無論倉庫
ID
是什麼。
- 如果有一個鏡像的
-
外部倉庫匹配:
- 如果有一個鏡像的
<mirrorOf>
值為external:*
,且要下載的倉庫不是本地倉庫,則使用該鏡像。 - 這個鏡像將匹配所有外部倉庫,但不包括本地倉庫。
- 如果有一個鏡像的
-
倉庫列表匹配:
- 如果有一個鏡像的
<mirrorOf>
值包含要下載的倉庫ID
,則使用該鏡像。 - 例如,如果要下載的倉庫
ID
為repo1
,且有一個鏡像的<mirrorOf>
值為repo1,repo2
,則使用該鏡像。
- 如果有一個鏡像的
-
排除倉庫匹配:
- 如果有一個鏡像的
<mirrorOf>
值排除了要下載的倉庫ID
,則不使用該鏡像。 - 例如,如果要下載的倉庫
ID
為repo1
,且有一個鏡像的<mirrorOf>
值為*,!repo1
,則不使用該鏡像。
- 如果有一個鏡像的
-
如果沒有找到匹配的鏡像,Maven將直接使用原始的倉庫URL進行下載。
在這裡推薦一下阿裡巴巴開源鏡像站,裡面有很多鏡像,有需要的同學可以去看看
proxies
需要通過代理伺服器訪問網路資源(如下載構件)時,可以使用<proxies>
配置來指定代理伺服器的詳細信息。
下麵是一個<proxies>
配置的示例:
<settings>
...
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<username>proxyuser</username>
<password>proxypassword</password>
<nonProxyHosts>*.example.com|localhost</nonProxyHosts>
</proxy>
</proxies>
...
</settings>
<id>
:代理的唯一標識符。它用於區分不同的代理配置。<active>
:表示是否激活該代理配置。值為true
表示激活,false
表示不激活。<protocol>
:指定代理伺服器使用的協議。常見的值有http
和https
。<host>
:代理伺服器的主機名或IP地址。<port>
:代理伺服器的埠號。<username>
:連接代理伺服器時使用的用戶名(如果代理伺服器需要身份驗證)。<password>
:連接代理伺服器時使用的密碼(如果代理伺服器需要身份驗證)。<nonProxyHosts>
:指定不需要通過代理伺服器訪問的主機列表。可以使用|
分隔多個主機,支持通配符*
。
當Maven需要訪問網路資源時,它會按照以下順序查找匹配的代理配置:
- 如果有激活的代理配置(
<active>
為true
),且目標主機不在<nonProxyHosts>
列表中,則使用該代理。 - 如果有多個激活的代理配置滿足條件,則按照它們在
<proxies>
中的順序,使用第一個匹配的代理。 - 如果沒有找到匹配的代理配置,則直接連接目標主機,不使用代理。
profiles
Profile
允許你定義一組配置設置,並根據不同的環境或條件激活這些設置。通過使用Profile
,可以輕鬆地在不同的環境中切換配置。
下麵是一個<profiles>
配置的示例:
<settings>
...
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<db.url>jdbc:mysql://localhost/mydb</db.url>
<db.username>devuser</db.username>
<db.password>devpassword</db.password>
</properties>
</profile>
<profile>
<id>production</id>
<activation>
<jdk>1.5</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.3</value>
</property>
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
<properties>
<db.url>jdbc:mysql://prodserver/mydb</db.url>
<db.username>produser</db.username>
<db.password>prodpassword</db.password>
</properties>
</profile>
</profiles>
...
</settings>
讓我們詳細解釋<profile>
元素的主要子元素:
<id>
:Profile
的唯一標識符。它用於在命令行或其他配置中引用該Profile
。<activation>
:定義Profile
的激活條件。可以通過以下方式激活Profile
:<activeByDefault>
:如果設置為true
,則預設激活該Profile
。<jdk>
:根據JDK版本激活Profile
。<os>
:根據操作系統屬性激活Profile
。<property>
:根據Maven屬性的存在或值激活Profile
。<file>
:根據文件的存在或缺失激活Profile
。
<properties>
:定義Profile
中的屬性。這些屬性可以在POM文件或其他配置中引用。<repositories>
:定義Profile
特定的倉庫配置。<pluginRepositories>
:定義Profile
特定的插件倉庫配置。
Profile配置可以在多個級別(如項目的POM文件、用戶的settings.xml文件、全局的settings.xml文件)中定義。當多個級別的Profile配置存在衝突時,會按照優先順序進行合併和覆蓋。
優先順序:POM文件 > 用戶目錄的settings > maven程式conf目錄的settings
activeProfiles
<activeProfiles>
部分用於顯式激活指定的Profile。通過在<activeProfiles>
中列出Profile的ID
,可以強制Maven在構建過程中使用這些Profile的配置,而無需通過其他方式(如命令行參數或激活條件)來激活它們。
下麵是一個<activeProfiles>
配置的示例:
<settings>
...
<activeProfiles>
<activeProfile>development</activeProfile>
<activeProfile>ci-server</activeProfile>
</activeProfiles>
...
</settings>
所有在<activeProfiles>
中列出的Profile都會被激活,無論它們在settings.xml文件中的定義順序如何。
如果多個激活的Profile具有相同的屬性或元素,則後面的Profile會覆蓋前面的Profile的配置。這意味著如果development
和ci-server
都定義了相同的屬性,則ci-server
中的屬性值會覆蓋development
中的屬性值。
如果激活的Profile之間沒有衝突的配置,則它們的配置會被合併應用於構建過程。
配置了阿裡雲鏡像的settings
複製下來替換掉自己本地的settings文件即可,包含了常用的配置,如需添加配置可以研究下這篇文章,發現錯誤請評論區指正,謝謝
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<localRepository>D:/maven_repository/</localRepository>
<interactiveMode>true</interactiveMode>
<offline>false</offline>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>aliyunmaven_central</id>
<mirrorOf>central</mirrorOf>
<name>阿裡雲公共倉庫</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>aliyunmaven_public</id>
<mirrorOf>public</mirrorOf>
<name>阿裡雲公共倉庫</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>aliyunmaven_apache-snapshots</id>
<mirrorOf>apache-snapshots</mirrorOf>
<name>阿裡雲公共倉庫</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>aliyun_spring</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</profile>
</profiles>
<activeProfiles>
<activeProfile>aliyun_spring</activeProfile>
</activeProfiles>
</settings>
附言
寫這篇文章時好多不懂的地方我都是使用Claude-3-opus查的,不得不說現在的大模型是真的牛,Claude官方宣稱超越了chatGPT4.0,目前只用了接近一個月,體驗非常好,不限制使用頻率,回覆的準確率很高,讓分析個代碼寫個代碼都沒問題,感謝科技進步。
另外有想一起討論chatGPT、Claude大模型的同學可以加我微信:_3306aigc
,我們一起進步。