前言
當我們進入一個公司,基本會統一發maven的setting文件,因爲很多公司都有自己的私有倉庫,很少有人去了解過setting文件,爲什麼有的setting文件要配repository、server還要配mirror?這些配置又有什麼含義,他們之間的關係是什麼?配置多個repository查找jar的順序是什麼?結合mirror又會如何查找?
節點理解
proxy是maven服務器不能訪問外網時需要設置的代理服務(不常用)
server是maven需要打包代碼上傳到私服時,設置私服的鑑權信息,賬號+密碼
repository是maven去下載jar包的地址
mirror用於代替repository的鏡像地址
internal repository(私服)指在局域網內部搭建的repository,跟local repository、jboss repository等的區別僅僅在於其URL是一個內部地址
mirro(鏡像),相當於一個代理,會攔截去指定的遠程repository下載構件的請求,然後從自己這裏找出構件返回給客戶端。配置mirror一般是出於網速。
私服和mirror是不同的,repository,用來提供公司內部的maven構件,而mirror只是遠程repository的網絡加速器
很多internal repository搭建工具也會提供mirror服務,比如Nexus可以讓同一個URL用作internal repository,又讓它成爲所有repository的mirror
mirror配置
一個mirror節點可以對應一個或對個repository節點,由mirrorOf中的值決定
<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">
...
<mirrors>
<mirror>
<id>planetmirror.com</id>
<name>PlanetMirror Australia</name>
<url>http://downloads.planetmirror.com/pub/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
- id: mirror標識
- name: 屬性、名稱
- url: 屬性,鏡像地址
- mirrorOf: 該鏡像對應repository的ID
以下是使用網易的鏡像,來替代中央的倉庫的配置樣例:
<mirrors>
<mirror>
<id>maven.163.com</id>
<name>maven mirror in China</name>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
在使用的過程中,會出現這種不標準的配置:
<mirrors>
<mirror>
<id>maven.163.com</id>
<name>maven mirror in China1</name>
<url>http://mirrors.163.com/maven/repository/maven-public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<mirrors>
<mirror>
<id>aliyun.com</id>
<name>maven mirror in China2</name>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
這時候將兩個鏡像同時指向(central)中央倉庫,這種maven只會選取第一個鏡像,第二個永遠不會生效。
repository配置
repository節點必須作爲repositorys的子節點存在,而repositorys節點又必須作爲profiles節點的子節點存在
<profiles>
<profile>
<id>nexus</id>
<repositories>
<!-- 公司私服配置 -->
<repository>
<id>you-internal-repos</id>
<url>you-internal-repos-address</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
<!-- 阿里雲私服配置 -->
<repository>
<id>aliyun-repos</id>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<!-- 默認生效 -->
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
mirror、repository查找順序
當一個repository存在mirror時,maven查找jar時永遠都是使用mirror配置的地址
當repository不存在mirror時,按照repositorys節點定義的先後順序。先定義,在查找。
配置實例
<?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">
<localRepository>你的本地倉庫地址</localRepository>
<pluginGroups></pluginGroups>
<proxies></proxies>
<servers></servers>
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>nexus-mine</id>
<name>Nexus mine</name>
<mirrorOf>*</mirrorOf>
<url>http://xx.xx.xx.xx/nexus/content/groups/public</url>
</mirror>
</mirrors>
</settings>