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的更多內容!

推薦閱讀: