當maven需要到的依賴jar包不在本地倉庫時, 就需要到遠程倉庫下載 .
這個時候如果mavensetting.xml中配置了鏡像 , 而且鏡像配置的規則中匹配到目標倉庫時 ,
maven認為目標倉庫被鏡像了, 不會再去被鏡像倉庫下載依賴jar包, 而是直接去鏡像倉庫下載.
簡單而言, mirror可以攔截對遠程倉庫的請求 , 改變對目標倉庫的下載地址。
在java的maven項目中編譯時經常會配置maven的mirrorOf,
例如在settings文件中配置aliyun的倉庫:
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> //代理倉庫配置 <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
mirrorOf可以理解“為某個倉庫(repository)的做鏡像”,填寫的是repostoryId。
”*“ 的意思就是匹配所有的倉庫(repository)。相當於一個攔截器,它會攔截maven對remote repository的相關請求,把請求里的remote repository地址,重定向到mirror里配置的地址。
我們知道maven倉庫有jar倉庫和plugin倉庫,
例如pom中配置倉庫,如下:
<repositories> <repository> <id>repo.jenkins-ci.org</id> //repostoryId <url>https://repo.jenkins-ci.org/public/</url> </repository> </repositories>
也可以配置在settings.xml中,settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。它包含了id、activation、repositories、pluginRepositories和 properties元素。例如<profiles>節點中配置如下:
<id>my-repo-id</id> //repostoryId <name>repo name</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> <layout>default</layout> </repository>
mirrorOf=“*”時鏡像所有的repositoryId,包括repositories和pluginRepositories。如果你需要某個jar就會從鏡像mirrorOd配置的地址去下載這個jar。
其他配置的repostory都沒用。
當然你也可以配置mirrorOf鏡像你自己的repository倉庫,例如你想鏡像my-repo-id,你把mirrorOf配置成my-repo-id,那么你配置的my-repo-id這個倉庫的url就沒用了,被鏡像代表了
在maven中配置一個mirror時,有多種形式,例如
mirrorOf=“*” //剛才經過,mirror一切,你配置的repository不起作用了
mirrorOf=my-repo-id //鏡像my-repo-id,你配置的my-repo-id倉庫不起作用了
mirrorOf=*,!my-repo-id //!表示非運算,排除你配置的my-repo-id倉庫,其他倉庫都被鏡像了。就是請求下載my-repo-id的倉庫的jar不使用mirror的url下載,其他都是用mirror配置的url下載
mirrorOf=external:* //如果本地庫存在就用本地庫的,如果本地沒有所有下載就用mirror配置的url下載
我們知道apache-maven的settings.xml不做任何配置時是有默認的倉庫的,這個倉庫就是central倉庫,默認值是https://repo.maven.apache.org/maven2/,我們可以配置mirrorOf=central只鏡像默認的central倉庫。
如果你只配置了mirrorOf=”my-repo-id“沒有配置central或*,那么請求maven會判斷,首先在默認的central倉庫https://repo.maven.apache.org/maven2/找依賴,如果找不到就去my-repo-id對應的倉庫找,遍歷所有倉庫后找不到就報錯。
例子
個人的maven配置了阿里的鏡像 , 而項目中需要使用到一些第三方jar包, 為了方便引入 , 已上傳到192.168.0.201的nexus私服下。
但由於個人maven阿里的鏡像使用默認mirrorOf規則=*, 所有的倉庫都被鏡像 , 不會再去192.168.0.201下下載第三方jar包。
上傳的第三方jar包目標路徑 :
http://192.168.0.201:8081/nexus/content/groups/public/com/alipay/sdk-java/20170615110434/sdk-java-20170615110434.pom
被鏡像后路徑 :
http://maven.aliyun.com/nexus/content/groups/public/com/alipay/sdk-java/20170615110434/sdk-java-20170615110434.pom
所以需要修改鏡像的mirrorOf規則 , 避免默認從鏡像中下載
maven的conf/setting.xml
<mirrors> <!--國內阿里雲提供的鏡像,非常不錯--> <mirror> <!--This sends everything else to /public --> <id>aliyun_nexus</id> <!--對所有倉庫使用該鏡像,除了一個名為maven_nexus_201的倉庫除外--> <!--這個名為maven_nexus_201的倉庫可以在javamaven項目中配置一個repository--> <mirrorOf>*,!maven_nexus_201</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors>
https://www.jianshu.com/p/c4f02c5bdfc7
https://www.jianshu.com/p/274c363ffd7c