Maven setting中私有倉(cāng)庫(kù)配置淺析
最近遇到過(guò)不少這樣那樣的問(wèn)題,曾經(jīng)做過(guò)maven的分享,但是發(fā)現(xiàn)當(dāng)時(shí)部分內(nèi)容還是太想當(dāng)然了,下面經(jīng)過(guò)嘗試后簡(jiǎn)單總結(jié)下:
首先幾個(gè)邏輯:
- pom>啟用的profile>maven原有配置
- mirror配置mirrorOf和id匹配優(yōu)先
簡(jiǎn)單maven配置
一般大家的配置(略去無(wú)關(guān)私有倉(cāng)庫(kù)配置)都是這樣的
<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
這個(gè)標(biāo)簽重要的屬性包括id、mirrorOf。id用來(lái)唯一區(qū)分。mirrorOf用來(lái)關(guān)聯(lián)repository。
url用來(lái)表示私服地址。
mirrorOf常見(jiàn)大家配置成*、central、repo啥的。這里剛才提到了是用來(lái)關(guān)聯(lián)respository的,等提到下面<respository>標(biāo)簽的時(shí)候在解釋。
profile
這個(gè)就簡(jiǎn)單說(shuō)下吧,就是算是個(gè)配置,可以配多個(gè),具體哪個(gè)生效可以通過(guò)mvn命令指定,或者配置<activeProfiles>
repositories
這里面算是配置的重點(diǎn)
<repository> <id>alibaba</id> <url>http://code.alibabatech.com/mvn/releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository>
幾個(gè)重要的配置,一目了然吧,id標(biāo)識(shí),url地址,是否從該倉(cāng)庫(kù)下release,是否從該倉(cāng)庫(kù)下快照版本。
這里就有人會(huì)懵逼了,這里怎么又配了個(gè)地址,跟mirrors里面的地址哪個(gè)生效呢?
好的,那咱們?cè)囋嚒O纫?guī)定一下配置:
<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>
把地址區(qū)分下,mirror里配成xxx,repository配成ccc
隨便找一個(gè)項(xiàng)目,設(shè)定一個(gè)不存在的依賴,mvn -U compile下:
可以發(fā)現(xiàn)去ccc找了。說(shuō)明repository里的生效了。
那么mirror里的地址什么時(shí)候生效呢?其實(shí)剛才說(shuō)了,mirror里的是靠mirrorOf中的內(nèi)容和repository中id關(guān)聯(lián)的。比如我們把剛才配置改為
<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都和這個(gè)關(guān)聯(lián)。
其實(shí)簡(jiǎn)單來(lái)說(shuō)就是如果repository的id能和mirrorOf關(guān)聯(lián)上,那么url以mirror的為準(zhǔn),否則以repository中自己的url為準(zhǔn)。
其他還有一些點(diǎn),repositories中可以配置多個(gè)repository,配置多個(gè)話,一個(gè)找不到會(huì)找下一個(gè),比如我們?cè)趧偛呕A(chǔ)上加上阿里的配置
<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>
在構(gòu)建一次:
當(dāng)配置多個(gè)時(shí),會(huì)逐一進(jìn)行下載嘗試。
總結(jié)
咱們?cè)诨仡櫹缕鸪醯呐渲茫梢钥吹絾⒂玫膒rofile是dev,dev中的repository的id是nexus,跟mirrorOf沒(méi)有匹配,那么生效的配置就是repository中自己的url配置,所以這里完全可以省略掉mirror的配置。當(dāng)然如果多個(gè)profile公用一個(gè)私服地址,也可以指定mirror地址,然后repository中的id指定成和mirrorOf相同,同時(shí)可以省略掉自己標(biāo)簽中url。?
此外還有幾個(gè)點(diǎn)要說(shuō),pluginRepositories,配置信息基本和repository一致,不過(guò)這個(gè)地址是用來(lái)下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:
這樣配置會(huì)和settings.xml中生效的配置合并,并優(yōu)先從這個(gè)庫(kù)找,找不到繼續(xù)走settings.xml配置。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!
原文鏈接:https://www.jianshu.com/p/b734f075a85a