Java Maven settings.xml中私有倉庫配置詳解
Maven setting中私有倉庫配置淺析
最近遇到過不少這樣那樣的問題,曾經做過maven的分享,但是發現當時部分內容還是太想當然瞭,下面經過嘗試後簡單總結下:
首先幾個邏輯:
- pom>啟用的profile>maven原有配置
- mirror配置mirrorOf和id匹配優先
簡單maven配置
一般大傢的配置(略去無關私有倉庫配置)都是這樣的
<mirrors> <mirror> <id>nexus</id> <name>mvn.xxx.com</name> <mirrorOf>central</mirrorOf> <url>http://mvn.xxx.com/nexus/content/groups/t_repo_group/</url> </mirror> </mirrors> <profile> <id>dev</id> <repositories> <repository> <id>nexus</id> <url>http://mvn.xxx.com/nexus/content/groups/t_repo_group/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>alibaba</id> <url>http://code.alibabatech.com/mvn/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <url>http://mvn.xxx.com/nexus/content/groups/t_repo_group/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
mirrors
這個標簽重要的屬性包括id、mirrorOf。id用來唯一區分。mirrorOf用來關聯repository。
url用來表示私服地址。
mirrorOf常見大傢配置成*、central、repo啥的。這裡剛才提到瞭是用來關聯respository的,等提到下面<respository>標簽的時候在解釋。
profile
這個就簡單說下吧,就是算是個配置,可以配多個,具體哪個生效可以通過mvn命令指定,或者配置<activeProfiles>
repositories
這裡面算是配置的重點
<repository> <id>alibaba</id> <url>http://code.alibabatech.com/mvn/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository>
幾個重要的配置,一目瞭然吧,id標識,url地址,是否從該倉庫下release,是否從該倉庫下快照版本。
這裡就有人會懵逼瞭,這裡怎麼又配瞭個地址,跟mirrors裡面的地址哪個生效呢?
好的,那咱們試試。先規定一下配置:
<mirrors> <mirror> <id>nexus</id> <name>mvn.ws.netease.com</name> <mirrorOf>central</mirrorOf> <url>http://mvn.xxx.com/nexus/content/groups/t_repo_group/</url> </mirror> </mirrors> <repositories> <repository> <id>nexus</id> <url>http://mvn.ccc.com/nexus/content/groups/t_repo_group/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories>
把地址區分下,mirror裡配成xxx,repository配成ccc
隨便找一個項目,設定一個不存在的依賴,mvn -U compile下:
可以發現去ccc找瞭。說明repository裡的生效瞭。
那麼mirror裡的地址什麼時候生效呢?其實剛才說瞭,mirror裡的是靠mirrorOf中的內容和repository中id關聯的。比如我們把剛才配置改為
<mirrors> <mirror> <id>nexus</id> <name>mvn.ws.netease.com</name> <mirrorOf>central</mirrorOf> <url>http://mvn.xxx.com/nexus/content/groups/t_repo_group/</url> </mirror> </mirrors> <repositories> <repository> <id>central</id> <url>http://mvn.ccc.com/nexus/content/groups/t_repo_group/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories>
把repository中的id改成central
這樣就行瞭。此外mirrorOf中可以配置通配符,例如*,表示任何repository都和這個關聯。
其實簡單來說就是如果repository的id能和mirrorOf關聯上,那麼url以mirror的為準,否則以repository中自己的url為準。
其他還有一些點,repositories中可以配置多個repository,配置多個話,一個找不到會找下一個,比如我們在剛才基礎上加上阿裡的配置
<repositories> <repository> <id>nexus</id> <url>http://mvn.ccc.com/nexus/content/groups/t_repo_group/</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>alibaba</id> <url>http://code.alibabatech.com/mvn/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
在構建一次:
當配置多個時,會逐一進行下載嘗試。
總結
咱們在回顧下起初的配置,可以看到啟用的profile是dev,dev中的repository的id是nexus,跟mirrorOf沒有匹配,那麼生效的配置就是repository中自己的url配置,所以這裡完全可以省略掉mirror的配置。當然如果多個profile公用一個私服地址,也可以指定mirror地址,然後repository中的id指定成和mirrorOf相同,同時可以省略掉自己標簽中url。
此外還有幾個點要說,pluginRepositories,配置信息基本和repository一致,不過這個地址是用來下maven的插件的,就是pom中這樣的配置
<plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors> <webResources> <resource> <directory>${basedir}/src/main/webapp/WEB-INF</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> <includes> <include>**</include> </includes> </resource> </webResources> </configuration> </plugin> </plugins>
還有,pom也可以指定repository:
這樣配置會和settings.xml中生效的配置合並,並優先從這個庫找,找不到繼續走settings.xml配置。
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!