背景:
自己在平時寫項目用的是阿里的鏡像地址,而在開發公司的項目是用的是公司提供的鏡像地址,這就導致了每次使用的時候
都需要來回的修改maven的settings.xml文件,這樣很容易出錯,而且還浪費時間;
需求:希望能夠不改動配置文件的情況下,動態切換mirror配置;
分析:
在maven的配置文件setting.xml大里面有個mirrors節點,用來配置鏡像URL。mirrors可以配置多個mirror,每個mirror有id,name,url,mirrorOf屬性,
id是唯一標識一個mirror,name節點名,url是官方的庫地址,mirrorOf代表了一個鏡像的替代位置,例如central就表示代替官方的中央庫。
雖然mirrors可以配置多個子節點,但是它只會使用其中的一個節點,即默認情況下配置多個mirror的情況下,只有第一個生效,只有當前一個mirror
無法連接的時候,才會去找后一個;而我們想要的效果是:當a.jar在第一個mirror中不存在的時候,maven會去第二個mirror中查詢下載,但是maven不會這樣做!)。
那么maven是使用哪個mirror節點的呢?
默認:mirror不是按settings.xml中寫的那樣的順序來查詢的,即所謂的第一個並不一定是最上面的那個。
當有id為B,A,C的順序的mirror在mirrors節點中,maven會根據字母排序來指定第一個,所以不管怎么排列,
一定會先找到A這個mirror來進行查找,當A無法連接,出現意外的情況下,才會去B查詢。
注意:
配置多個mirror時,mirrorOf不能配置" * "," * " 的意思就是(根據mirrorOf和repository的id)匹配所有的倉庫(repository),
這樣就是說如果你需要某個jar,他會從鏡像地址去下載這個jar。不管你配置了多少個庫,即使這些庫的地址不一樣,仍然會從鏡像地址訪問。
解決辦法:
settings.xml 中可以使用變量,可以嘗試使用變量解決:
<!-- mirror | Specifies a repository mirror site to use instead of a given repository. The repository that | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used | for inheritance and direct lookup purposes, and must be unique across the set of mirrors. | <mirror> --> <!-- 唯一標識一個mirror --> <id>mirrorId</id> <!-- 代表這個鏡像的替代位置,例如central就表示替代官方的中央倉庫。我們可以將這個地方設置為變量,然后通過手動指定變量地方式動態切換mirror --> <!-- mirrorOf指定這個鏡像是針對哪個repository的,配置成*就表示要代理所有repository的請求 --> <mirrorOf>repositoryId</mirrorOf> <!-- 名字(個人感覺這個name作用主要是給自己識別用,因為id已經在當前xml中唯一指定了一個mirror) --> <name>Human Readable Name for this Mirror.</name> <!-- 官方倉庫庫的地址 --> <url>http://my.repository.com/repo/path</url> </mirror>
實例:
<mirrors> <mirror> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>${aliyun}</mirrorOf> </mirror> <mirror> <id>netease</id> <url>http://mirrors.163.com/maven/repository/maven-public/</url> <mirrorOf>${netease}</mirrorOf> </mirror> <mirror> <id>default</id> <url>http://ip/nexus/repository/maven-public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
切換命令:
配置多個mirror的情況下,默認只有第一個生效。因此我們可以把最后一個作為默認值,前面配置的使用環境變量動態切換。
默認執行: mvn help:effective-settings可以看到使用的是最后一個
切換阿里鏡像執行mvn help:effective-settings -Daliyun=central即可
同理,切換網易mvn help:effective-settings -Dnetease=central
參考:Maven 的 settings.xml 配置中的mirror節點
maven的setting配置文件中mirror和repository的區別
maven動態切換mirror,無需修改settings.xml