Loading

maven settings.xml配置详解

settings.xml文件位置

settings.xml文件一般存在于两个位置:

全局配置: ${M2_HOME}/conf/settings.xml

用户配置: user.home/.m2/settings.xml

 

配置优先级

需要注意的是:局部配置优先于全局配置。

配置优先级从高到低:pom.xml> user settings > global settings

如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。

 

settings.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">
        <!-- 默认值是${user.home}/.m2/repository -->
    <localRepository>E:/project/localRepository</localRepository>
    <!-- 表示是否使用交互模式,默认是true
    如果为false,命令如下
    mvn archetype:generate -DgroupId=com.zworks -DartifactId=maven-setting -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    需要指定groupId、artifactId、archetypeArtifactId,如果不指定会报错,因为这些是无法推测出值的。
    如果为true,命令如下
    mvn archetype:generate
    后面会让你选择或输入archetype、groupId、artifactId、version、package、为false的时候之所以不用指定version和package是因为这两个都有默认值。
    -->
    <interactiveMode>true</interactiveMode>
    <!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false -->
    <usePluginRegistry>false</usePluginRegistry>
    <!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 -->
    <offline>false</offline>
  
    <!--插件组
    在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。
    pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。-->
    <pluginGroups>
      <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
    <!--例如,有了上面的配置,Maven命令行可以使用简单的命令执行org.morbay.jetty:jetty-maven-plugin:run,如下:
    mvn jetty run
    -->
    <!--服务器
    用来下载和部署的仓库是用POM中的repositories和distributionManagement元素来定义的。
    但是某些配置例如username和password就不应该随着pom.xml来分配了。这种类型的信息应该保存在构建服务器中的settings.xml中。
    -->
    <servers>
        <server>
        <!-- 这是Server的ID(不是登录进来的user),与Maven想要连接上的repository/mirror中的id元素相匹配。 -->
            <id>nexus_server_id</id>
            <username>my_login</username>
            <password>my_password</password>
        <!-- 与前两个元素一样,这两个成对出现,分别指向了一个私钥(默认的${user.home}/.ssh/id_dsa)和一个passphrase。即分别表示私钥位置和私钥密码 -->
            <privateKey>${user.home}/.ssh/id_dsa</privateKey>
            <passphrase>some_passphrase</passphrase>
        <!-- 文件和目录被创建时的权限。后续需要用此权限来访问。
                这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 -->
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
        <!-- 传输层额外的配置项 -->
            <configuration></configuration>
        </server>
    </servers>
        <!--镜像-->
    <mirrors>
        <mirror>
            <!-- 镜像标识id -->
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <!-- 指向此镜像的仓库Id,任何对于远程仓库的请求都会被转至此url。
                        多个逗号隔开,或者*号统配,或者!排除某个之外的所有仓库
            external:*匹配除使用 localhost 或基于文件的存储库之外的所有存储库。当您想要排除为集成测试定义的重定向存储库时使用。
            自 Maven 3.8.0 起,external:http:*匹配所有使用 HTTP 的存储库,但使用 localhost 的存储库除外。
            * = 一切
            external:* = 一切不在本地主机上,也不基于文件。
            repo,repo1 = repo或repo1
            *,!repo1 = 除了 repo1 之外的所有东西
                        注意不要在逗号分隔列表中的标识符或通配符周围包含额外的空格。
                        例如,<mirrorOf设置为 >的镜像!repo1, *不会镜像任何内容,而!repo1,*会镜像除repo1
                        注意多个mirrorOf内容相同并不会都生效,每个仓库只能有一个镜像,Maven 不会聚合镜像,而只是选择第一个匹配项
                        -->
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
    <!-- 代理设置,主要用于无法直接访问中心的库用户配置 -->
        <!--用来配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 --> 
        <proxies>
          <proxy>
             <id>myproxy</id>
             <active>true</active>
             <protocol>http</protocol>
             <host>proxy.somewhere.com</host>
             <port>8080</port>
             <!-- 两个元素成对出现,提供连接proxy服务器时的认证 -->
             <username>proxyuser</username>
             <password>somepassword</password>
             <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。-->
             <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
         </proxy>
        </proxies>
    <!--配置文件
    settings.xml中的profile是pom.xml中的profile的简洁形式。
    它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。
    profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。
    如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。
    -->
    <profiles>
        <profile>
            <id>dev</id>
            <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。
                        如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;
                        这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。
                        settings.xml文件中的activeProfile元素可以设置需要激活profile的id。
                        profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。-->
                    <activation>
              <!-- 默认激活的标识 -->
              <activeByDefault>false</activeByDefault>
              <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。-->
              <jdk>1.5</jdk>
              <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。-->
              <os>
                <!--激活profile的操作系统的名字 -->
                <name>Windows XP</name>
                <!--激活profile的操作系统所属家族(如 'windows')  -->
                <family>Windows</family>
                <!--激活profile的操作系统体系结构  -->
                <arch>x86</arch>
                <!--激活profile的操作系统版本-->
                <version>5.1.2600</version>
              </os>
              <!--如果Maven检测到某一个属性(其值可以在POM中通过${name}引用),其满足对应的name = 值,Profile就会被激活。
                            如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段-->
              <property>
                <name>mavenVersion</name>
                <value>2.0.3</value>
              </property>
              <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。
                            另一方面,exists则会检查文件是否存在,如果存在则激活profile。-->
              <file>
                <!--如果指定的文件存在,则激活profile。 -->
                <exists>${basedir}/file2.properties</exists>
                <!--如果指定的文件不存在,则激活profile。-->
                <missing>${basedir}/file1.properties</missing>
              </file>
                </activation>
            <!--如果以上所有指定的条件都达到了,那么,activation就被触发,而且不需要一次性全部达到。-->
            <!--仓库(repositories)
            仓库是Maven用来构筑构建系统的本地仓库的远程项目集合。它来自于被Maven叫做插件和依赖的本地仓库。
                        不同的远程仓库包含不同的项目,当profile被激活,他们就会需找匹配的release或者snapshot构件。 -->
            <repositories>
                <repository>
                    <id>ccl-nexus</id>
                    <url>http://172.16.10.99:8081/nexus/content/groups/public</url>
                    <!--如何处理远程仓库里发布版本的下载-->
                    <releases>
                        <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。  -->
                        <enabled>true</enabled>
                        <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。
                                                选项是:always(一直), 
                                                            daily(默认,每日),
                                                            interval:X(这里X是以分钟为单位的时间间隔),
                                                            never(从不)。 -->
                                            <updatePolicy>always</updatePolicy>
                        <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。-->
                                        <checksumPolicy>warn</checksumPolicy>
                    </releases>
                    <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,
                                        POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。
                                        例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素-->
                    <snapshots>
                        <enabled>true</enabled>
                                            <updatePolicy>never</updatePolicy>
                                        <checksumPolicy>fail</checksumPolicy>
                    </snapshots>
                </repository>
            </repositories>
            <!--插件仓库(plugin repositories)
            仓库包含了两种重要类型的构件:第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。
                        Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。
                        pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。
            -->
            <pluginRepositories>
                <pluginRepository>
                    <id>ccl-nexus</id>
                    <url>http://172.16.10.99:8081/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <!--属性(properites)
            Maven的属性是值占位符,就像Ant中的属性。如果X是一个属性的话,那么它的值在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从settings.xml文件中访问到。
            1.env.X:使用“env.”前缀将会返回当前的环境变量。例如${env.PATH}就是使用了$path环境变量。
            2.project.X:一个点“.”分割的路径,在POM中就是相关的元素的值。例如:<project><version>1.0</version></project>就可以通过${project.version}来访问。
            3.settings.X:一个点“.”分割的路径,在settings.xml中就是相对应的元素的值,例如:<settings><offline>false</offline></settings>就可以通过${settings.offline}来访问。
            4.Java系统属性:所有通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如:${java.home}
            5.X:被<properties/>或者外部文件定义的属性,值可以这样访问${someVar}
            -->
            <properties>
              <sonar.jdbc.url>
                jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
              </sonar.jdbc.url>
              <sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
              <sonar.jdbc.username>root</sonar.jdbc.username>
              <sonar.jdbc.password></sonar.jdbc.password>
              <sonar.host.url>http://172.16.11.43:80</sonar.host.url>
            </properties>
                        <!--如果这个profile被激活,那么属性${sonar.jdbc.url}就可以被访问了-->
        </profile>     
    </profiles>
        <!--激活配置(Active Profiles)-->
    <activeProfiles>
        <activeProfile>dev</activeProfile>
    </activeProfiles>
   
</settings>

 

科普

中央仓库:目前来说,http://repo1.maven.org/maven2/ 是真正的Maven中央仓库的地址,该地址内置在Maven的源码中,其它地址包括著名的ibiblio.org,都是镜像。

索引:中央仓库带有索引文件以方便用户对其进行搜索,完整的索引文件至2019年1月22日大小约为1.04G,索引每周更新一次。

提交内容:只要你的项目是开源的,而且你能提供完备的POM等信息,你就可以提交项目文件至中央仓库,这可以通过Sonatype提供的开源Maven仓库托管服务实现。

 

IntelliJ IDEA利用索引实现自动补全

众所周知,由于伟大的中国防火墙,所以在使用IDEA下载Maven仓库索引的时候,要么无法访问,要么就是速度极慢,这对开发人员带来了极大的不便,所以一般公司都用Nexus搭建一个公司内部的私服。同时利用私服更有利于对公司内部开发人员依赖的Jar包版本进行控制。

也许你会问,中央仓库带有索引,为什么本地的IDEA也需要下载索引呢?那么直接看下图你就明白了,如果本地没有下载索引的话,在pom.xml文件中添加依赖是得不到任何提示的。

 

 

下载Maven仓库的索引

在配置完成之后就可以下载仓库索引了,注意这是一个非常耗时的过程,建议利用晚上或者出去午饭时间下载。下载过程及下载完成之后状态如下图所示。

 

 

posted @ 2021-08-20 14:54  梦醒点灯  阅读(3347)  评论(0编辑  收藏  举报