目录

1、settings.xml介绍

2、Mirrors

3、mirrorOf

4、几个好用Maven 镜像仓库地址

5、Maven配置Nexus私服账号密码

6、Profile配置

7、repositories 远程仓库列表

8、pluginRepositories

9、参考


1、settings.xml介绍

    从settings.xml的文件名就可以看出,它是用来设置maven参数的配置文件。

    并且,settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。

    settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。

settings.xml文件一般存在于两个位置:
    (1)全局配置: ${M2_HOME}/conf/settings.xml;
    (2)用户配置: user.home/.m2/settings.xml。

 配置优先级:
    (1)需要注意的是:局部配置优先于全局配置。
    (2)配置优先级从高到低:pom.xml> user settings > global settings
    (3)如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
 

2、Mirrors

作用:为仓库列表配置的下载镜像列表。

<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">
  <!-- Default: ${user.home}/.m2/repository
  -->
   <localRepository>/mvn</localRepository>
......
<mirrors>
    <!-- 给定仓库的下载镜像。 -->
    <mirror>
      <!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
      <id>alimaven</id>
      <!-- 镜像名称 -->
      <name>aliyun maven</name>
      <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
      <!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库 
     (http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中 
      央仓库的id central完全一致。 -->
      <mirrorOf>central</mirrorOf>
    </mirror>
 
  </mirrors>

mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。

2.1 没有配置mirror

2.2 配置mirror

3、mirrorOf

<mirrorOf></mirrorOf>标签里面放置的是要被镜像的Repository ID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置:

<mirrorOf>central</mirrorOf> 
表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像
 
<mirrorOf>*</mirrorOf> 
匹配所有仓库请求,即将所有的仓库请求都转到该镜像上
 
<mirrorOf>repo1,repo2</mirrorOf> 
将仓库repo1和repo2的请求转到该镜像上,使用逗号分隔多个远程仓库。 
 
<mirrorOf>*,!repo1</miiroOf> 
匹配所有仓库请求,repo1除外,使用感叹号将仓库从匹配中排除。

4、几个好用Maven 镜像仓库地址

1 阿里云镜像

<mirror>
    <id>nexus-aliyun</id>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

2 maven官方2号镜像

<mirror>
    <id>repo2</id>
    <name>Mirror from Maven Repo2</name>
    <url>http://repo2.maven.org/maven2/</url>
    <mirrorOf>central</mirrorOf>
</mirror>

5、Maven配置Nexus私服账号密码

在servers列表中,我们可以根据不同的私服server(根据id区分)来配置每个私服的账号和密码。
这个id是在项目的pom.xml中distributionManagement里面配置的私服的id是一致的。配置POM的distributionManagement来指定Maven分发构件的位置,下面举个例子:
项目的pom.xml中使用了两个仓库,一个是snapshot的仓库(id为:cat-snapshot),一个是releases仓库(id为:cat-release),配置如下:pom.xml:

<distributionManagement>
    <repository>
        <id>cat-release</id>
        <name>RELEASES</name>
        <url>http://172.10.0.100:8081/repository/cat-releases/</url>
    </repository>

    <snapshotRepository>
        <id>cat-snapshot</id>
        <name>SNAPSHOT</name>
        <url>http://172.10.0.100:8081/repository/cat-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

其中:

  • id是指上面配置仓库的ID,和下面指定的账号密码中的id一一对应
  • name是指仓库的名称
  • url本地公仓的地址

在Maven配置文件中,配上对应的账号:settings.xml

<servers>
    <server>
        <id>cat-release</id>
        <username>laomao</username>
        <password>123456</password>
    </server>
    <server>
        <id>cat-snapshot</id>
        <username>laomao</username>
        <password>123456</password>
    </server>
    ...
</servers>

其中:

  • id是指仓库的ID,这里和上面pom.xml配置的是一样的
  • username是用户名
  • password是密码

注意看id标签中的字符串是一一对应的,这个是指明了私服的账号,我这里私服中laomao账号都给了访问操作两个仓的权限。

没有权限的话,在打包发布到私仓的时候,会提示code 401,权限不足,或者Access Denied,拒绝访问。
出现这个问题的时候,排查方法如下:

  1. 首先要确定id是否对应;
  2. 然后检查账号密码是否错误;
  3. 最后去检查私服中是否给对应的账号配置了对应私仓的权限。

6、Profile配置

6.1. 配置Profile
按照翻译来说profile中文是总则,profile可以让我们定义一系列的配置信息,包含在profiles配置列表标签对中,每个profile配置都可以通过activeProfile或命令行或者activeByDefault来激活,达到在不同的环境下自由切换配置的目的,激活的会在下面说明,先看看profile的配置。
profile可以在settings.xml中配置,也可以在pom.xml文件中配置。
注意:profile一定要给定一个全局唯一的ID,不能冲突

6.1.1 在settings.xml中配置profile
下面给出一个配置在settings.xml中profile的例子:

<profile>
    <id>jdk-1.8</id>

    <activation>
        <jdk>1.8</jdk>
    </activation>

    <properties>
    ...
    </properties>

    <repositories>
        <repository>
            <id>jdk18</id>
            <name>Repository for JDK 1.8 builds</name>
            <url>http://....</url>
            <layout>default</layout>
            <snapshotPolicy>always</snapshotPolicy>
        </repository>
    </repositories>
    
    <pluginRepositories>
    ...
    </pluginRepositories>
</profile>

activation是指激活条件,上面的例子是在jdk 1.8的环境下就会被激活。activation可以不写。

6.1.2 配置在pom.xml中的profile
而配置在pom.xml文件中的profile可配置项则多很多。
下面给出一个配置在pom.xml中profile配置的例子:

<project>
    <profiles>
        <profile>
            <id>xxxx</id>
            <build>
                <defaultGoal>...</defaultGoal>
                <finalName>...</finalName>
                <resources>...</resources>
                <testResources>...</testResources>
                <plugins>...</plugins>
            </build>
            <reporting>...</reporting>
            <modules>...</modules>
            <dependencies>...</dependencies>
            <dependencyManagement>...</dependencyManagement>
            <distributionManagement>...</distributionManagement>
            <repositories>...</repositories>
            <pluginRepositories>...</pluginRepositories>
            <properties>...</properties>
        </profile>
    </profiles>
</project>

6.1.3 配置profile的位置选择
关于profile配置的位置,下面给点建议:

特定项目的配置就在项目的pom.xml文件中配置
特定用户的配置则放在用户目录下的.m2文件夹下(Windows、Linux、Mac的Maven用户目录位置在一开始有说)
全局的配置则放在Maven安装目录下${maven.home}、${m2.home}

6.1.4 properties属性的覆盖

profile中可以定义<properties>...</properties>属性列表,如果两个属性列表中都有相同的key,如:

<profile>
    <id>profile-ID-1</id>
    ...
    <properties>
        <env>test</env>
    </properties>
    ...
</profile>    

<profile>
    <id>profile-ID-2</id>
    ...
    <properties>
        <env>dev</env>
    </properties>
    ...
</profile>   

上面两个profile中都定义了env属性,如果都没被激活或激活某一个profile的话,是没问题的。如果两个profile都被激活,那么会根据profile在配置文件中定义的位置,后面的属性会覆盖前面的属性

6.2. 激活profile的方式

上面说了,profile在配置之后并不是直接生效的,需要通过activeProfile或命令行或者activeByDefault来激活。

6.2.1 在settings.xml通过activeProfile激活profile
在settings.xml配置文件activeProfiles列表里通过activeProfile方式激活profile,可以激活一个或多个profile。
下面给出在settings.xml中同时激活两个profile的配置:

<activeProfiles> 
    <activeProfile>profile-ID-1</activeProfile> 
    <activeProfile>profile-ID-2</activeProfile>
</activeProfiles> 

注意:关于两个profile中定义相同的properties属性的情况上面有说明

6.2.2 使用activeByDefault激活
activeByDefault是配置在profile中activation标签对中的,上面有说了,activation是激活条件,可以在某个环境的时候触发激活该profile。而activeByDefault是在默认的状态下激活profile:

<profiles> 
    <profile> 
        ...
        <activation> 
            <activeByDefault>true</activeByDefault> 
        </activation> 
    </profile> 

    <profile> 
        ...
    </profile> 
</profiles> 

当为activeByDefault的值true的时候,表示在没有指定激活其他profile的时候,这个profile会默认被激活。如果有其他profile被指定激活之后,这个profile将不会被激活。
 

7、repositories 远程仓库列表

先看一下<repositories>的配置,你可以在它下面添加多个<repository> ,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。
此外,<releases><enabled>true</enabled></releases>告诉Maven可以从这个仓库下载releases版本的构件,而<snapshots><enabled>false</enabled></snapshots>告诉Maven不要从这个仓库下载snapshot版本的构件。
禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。

<!-- 远程仓库列表
<repositories>
     | releases vs snapshots
     | maven 针对 releases、snapshots 有不同的处理策略,POM 就可以在每个单独的仓库中,为每种类型的 artifact 采取不同的策略
     | 例如:
     |     开发环境 使用 snapshots 模式实时获取最新的快照版本进行构建
     |     生成环境 使用 releases 模式获取稳定版本进行构建
     | 参见repositories/repository/releases元素
     |
     | 依赖包不更新问题:
     | 1. Maven 在下载依赖失败后会生成一个.lastUpdated 为后缀的文件。如果这个文件存在,那么即使换一个有资源的仓库后,Maven依然不会去下载新资源。
     |    可以通过 -U 参数进行强制更新、手动删除 .lastUpdated 文件:
     |      find . -type f -name "*.lastUpdated" -exec echo {}" found and deleted" \; -exec rm -f {} \;
     |
     | 2. updatePolicy 设置更新频率不对,导致没有触发 maven 检查本地 artifact 与远程 artifact 是否一致
     |
    <repository>
        远程仓库唯一标识
        <id>jdk14</id>
        远程仓库名称
        <name>Repository for JDK 1.4 builds</name>
        远程仓库URL,按protocol://hostname/path形式
        <url>http://www.myhost.com/maven/jdk14</url>
        用于定位和排序 artifact 的仓库布局类型-可以是 default(默认)或者 legacy(遗留)
        Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)
        <layout>default</layout>

        如何处理远程仓库里发布版本的下载
        <releases>
            是否允许该仓库为 artifact 提供 发布版 / 快照版 下载功能
            <enabled>false</enabled>
             | 每次执行构建命令时,Maven 会比较本地 POM 和远程 POM 的时间戳,该元素指定比较的频率。
             | 有效选项是:
             |     always(每次构建都检查),daily(默认,距上次构建检查时间超过一天),interval: x(距上次构建检查超过 x 分钟)、 never(从不)
             | 重要:
             |     设置为 daily,如果 artifact 一天更新了几次,在一天之内进行构建,也不会从仓库中重新获取最新版本
            <updatePolicy>always</updatePolicy>
            当 Maven 验证 artifact 校验文件失败时该怎么做: ignore(忽略),fail(失败),或者warn(警告)
            <checksumPolicy>warn</checksumPolicy>
        </releases>

        如何处理远程仓库里快照版本的下载
        <snapshots>
            <enabled />
            <updatePolicy />
            <checksumPolicy />
        </snapshots>
    </repository>
</repositories>

8、pluginRepositories

<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和<repository>完全一样

<!--
| maven 插件的远程仓库配置。maven 插件实际上是一种特殊类型的 artifact。
| 插件仓库独立于 artifact 仓库。pluginRepositories 元素的结构和 repositories 元素的结构类似。
|-->
<pluginRepositories>
<pluginRepository>
    <id>nexus</id>
    <name>Nexus Repository</name>
    <url>http://nexus.helloworld.com:8081/repository/maven-public/</url>
    <releases>
        <enabled>true</enabled>
        <updatePolicy />
        <checksumPolicy />
    </releases>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy />
        <checksumPolicy />
    </snapshots>
</pluginRepository>
</pluginRepositories>

9、参考

Maven settings.xml 配置镜像_南方有乔木的博客-CSDN博客

Maven配置文件settings.xml详解_机智猫-CSDN博客_maven配置文件

maven settings.xml 详解_小单的博客专栏-CSDN博客_maven setting.xml

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐