彻底理解maven + 配置私服 + 阿里云镜像

关于maven配置本地私服和镜像的流程,网上一大堆,写的神乎其乎,初学者总是很难理解其中的真正原理,
    笔者通过这篇文章来终结他们;
    
    setting.xml的结构
    
    

<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">  
        <localRepository/>
        <interactiveMode/>
        <offline/>
        <pluginGroups/>
        <servers/>
        <mirrors/>
        <proxies/>
        <profiles/>
        <activeProfiles/>
    </settings>

    
    localRepository: 配置本地存储库的位置,默认为${user.home}/.m2/repository
    interactiveMode: 是否与用户开启交互模式,默认为 true
    offline: 离线模式,默认为 false
    pluginGroups: 比如<pluginGroup>org.eclipse.jetty</pluginGroup>, 默认有org.apache.maven.plugins and org.codehaus.mojo。
    servers: 配置私服的用户名和密码
    mirrors: mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
    proxies: 代理配置
    profiles: 配置环境
    activeProfiles: 配置默认激活的环境
    

配置镜像

    因为中央仓库在国外,下载比较慢,所以可以配置为定向到阿里云镜像,阿里云镜像里面一般都很全
  

 

<mirror>
        <id>Nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

    
    这样访问中央仓库时就会定位到阿里云,不再访问中央仓库。如果阿里云仓库没有呢?怎么办?这种情况一般不会出现,因为阿里云仓库的jar很全
    如果你希望如果在阿里云镜像找不到资源时也可以访问问中央仓库,那么阿里云镜像就不能使用<mirrorOf>central</mirrorOf>,可以把阿里云镜像配置成一个私服,
    如<mirrorOf>aliyun</mirrorOf>
    
    关于mirrorOf,如果有同名的mirrorOf,那么只会匹配第一个,
    如果有<mirrorOf>*</mirrorOf>,优先匹配名字完全相同的,其次匹配通配符
    
   

配置profile
    
 

<profile>
        
        <id>nexus-mr</id>
        
        <repositories>
            <!-- 配置的顺序决定了下载 jar 包的顺序 -->
            <!--  maven下载时,按顺序查找,优先找nexus,找不到再找central  -->
            
            <!-- 这里nexus为我的私服地址 -->
            <repository>
                 <id>nexus</id>
                <url>http://172.16.8.6:8082/repository/maven-public/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
            
            <!-- 中央仓库此处可省略 -->
            <repository>
                 <id>central</id>
                <url>https://maven.aliyun.com/repository/central</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
            
            
        </repositories>
        <pluginRepositories>
            <pluginRepository>          
                <id>nexus</id>
                 <url>http://172.16.8.6:8082/repository/maven-public/</url>
                 <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
            
            <pluginRepository>          
                <id>central</id>
                 <url>https://maven.aliyun.com/repository/central</url>
                 <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
            
            
        </pluginRepositories>
        
        
    </profile>

    <!--配置activeProfiles
    用于激活前面的环境配置-->
    
  

 <activeProfiles>
        <activeProfile>nexus-mr</activeProfile>
    </activeProfiles>

 
  

 完整的setting.xml配置如下

   

 

<?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">
        
        <!-- 本地存放jar的位置 -->
        <localRepository>D:\m2\repository</localRepository>
      
 
      <pluginGroups>
      
        
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
        
      </pluginGroups>
 
     
      <proxies>
        
      </proxies>
 
      
      <servers>
        <!-- 此处为我自己的私服账号配置 -->
        <server>
          <id>maven_3rd_party</id>
          <username>maven</username>
          <password>maven</password>
        </server>
        <server>
          <id>maven-releases</id>
          <username>maven</username>
          <password>maven</password>
        </server>
        <server>
          <id>maven-snapshots</id>
          <username>maven</username>
          <password>maven</password>
        </server>
            
      </servers>
 
 
      <mirrors>
        
        <!-- 此处的mirrorOf不能随便写,要和下面profile中的repository name标签的一致 ;如果配置的是central,后面profile中可以省略配置对应的central  --> 
        <!-- 
            maven获取真正起作用的repository集合流程:首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素,
            如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository,
            如果该repository找不到对应的mirror,
            则使用其本身,依此可以得到最终起作用的repository集合
        -->
         
         
         
         
        <!-- 将 central 的请求重定向到阿里云的公共 Maven 仓库 -->
        <!-- 其它的不重定向到阿里云 -->
        <mirror>
            <id>Nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>https://maven.aliyun.com/repository/central</url>
        </mirror>
        
        
        
      </mirrors>
 
      
      <profiles>
        
            <profile>
                
                <id>nexus-mr</id>
                
                <!-- 
                这里的 repositories 如果不配置的话,默认会有一个 Maven 中央仓库的配置,
                同样 pluginRepositories 中如果没有配置的话,默认也是有一个 Maven 中央仓库的配置。
                还有!如果 repositories 中没有配置 repository.id 是 central 的 repository,
                会自动增加一个 Maven 中央仓库的配置,并且是以追加的方式,也就是配置在 repositories 的最后一个。
                所以如果只配置了私服的 repository 情况下,就会先去私服中下载,私服中下载不到时再去追加上来的 Maven 中央仓库中下载
                
                -->
                
                <repositories>
                <!-- 配置的顺序决定了下载 jar 包的顺序 -->
                    <repository>
                         <id>nexus</id>
                        <url>http://172.16.8.6:8082/repository/maven-public/</url>
                        <releases><enabled>true</enabled></releases>
                        <snapshots><enabled>true</enabled></snapshots>
                    </repository>
                    
                    <!-- 
                        如果前面mirrorOf配置了central定位到阿里云镜像,这里的central配置可以省略,nexus中找不到会自动根据central去阿里云镜像查找;
                    
                        如果上面mirrorOf没有配置central ,这里不配central的话,nexus中找不到会自动去maven默认中央仓库找
                    
                    -->
                    <repository>
                         <id>central</id>
                        <url>https://maven.aliyun.com/repository/central</url>
                        <releases><enabled>true</enabled></releases>
                        <snapshots><enabled>true</enabled></snapshots>
                    </repository>
                    
                    
                </repositories>
                <pluginRepositories>
                    <pluginRepository>          
                        <id>nexus</id>
                         <url>http://172.16.8.6:8082/repository/maven-public/</url>
                         <releases><enabled>true</enabled></releases>
                        <snapshots><enabled>true</enabled></snapshots>
                    </pluginRepository>
                    
                    <pluginRepository>          
                        <id>central</id>
                         <url>https://maven.aliyun.com/repository/central</url>
                         <releases><enabled>true</enabled></releases>
                        <snapshots><enabled>true</enabled></snapshots>
                    </pluginRepository>
                    
                    
                </pluginRepositories>
                
                
                
            </profile>
            <profile>
                <id>jdk-1.8</id>
 
                <activation>
                    <activeByDefault>true</activeByDefault>
                    <jdk>1.8</jdk>
                </activation>
 
                <properties>
                    <maven.compiler.source>1.8</maven.compiler.source>
                    <maven.compiler.target>1.8</maven.compiler.target>
                    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
                </properties>
            </profile>
            
        </profiles>
        <activeProfiles>
            <!-- 激活环境配置 ,使上面的配置生效 --> 
            <activeProfile>nexus-mr</activeProfile>
        </activeProfiles>
    </settings>

  
    注意:此文中虽然mirrorOf和profile中central都同时配置了,也可以无需都配置,二者有一个配置了就可以了
    如果你想把私服nexus也配置成mirrorOf也可以,但mirrorOf不可配置为*,否则全部请求都走nexus了,不会走central
    
    
    测试,我们测试一下是否走了阿里云镜像
    项目中增加一个新的pom
    

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        <version>0.2.1.RELEASE</version>
    </dependency>

    
    
    更新maven,到本地下载的m2e-lastUpdated.properties文件中查看下载信息,

 

 

内容为
    
    nexus|http\://172.16.8.6\:8082/repository/maven-public/|sources=1628230775917
    Nexus-aliyun|https\://maven.aliyun.com/repository/central|sources=1628230775917
    
    
    证明maven访问仓库顺序为:172.16.8.6(nexus)、 maven.aliyun.com(阿里云镜像)
    
    我们将上面的mirrorOf和profile中的central对应的配置都注释,删除本地jar,再次更新项目maven,内容变成:
    
    nexus|http\://172.16.8.6\:8082/repository/maven-public/|javadoc=1628217742198
    nexus|http\://172.16.8.6\:8082/repository/maven-public/|sources=1628217716685
    central|https\://repo.maven.apache.org/maven2|javadoc=1628217742198
    central|https\://repo.maven.apache.org/maven2|sources=1628217716685
    
    证明maven访问仓库顺序为:172.16.8.6(nexus)、repo.maven.apache.org(默认中央仓库)

posted @ 2023-01-31 16:06  姚春辉  阅读(1666)  评论(0编辑  收藏  举报