Maven settings.xml 文件详解

2021-09-05  本文已影响0人  rosy_dawn

概述

settings.xml 文件中的 settings 元素包含用于以各种方式配置 Maven 的元素(就像 pom.xml 文件一样),但不应捆绑到任何特定项目,或分发给受众。其中包括本地存储库位置、备用远程存储库服务器和身份验证信息等值。

settings.xml 文件可能位于两个位置:

如果两个文件都存在,则它们的内容将合并,如果某些相同的设置同时出现在两个文件中,则以采用用户特定的设置。

提示:如果需要从头开始创建特定于用户的设置,最简单的方法是将全局设置的 ${maven.home}/conf/settings.xml 文件从 Maven 安装目录复制到 ${user.home}/.m2 目录。Maven 默认的 settings.xml 文件是一个带有注释和示例的模板,因此可以根据需要快速调整它。

以下是 settings 元素中的各顶级子元素的结构:

<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>

可以使用以下方式来覆盖 settings.xml 的内容:

请注意,在 settings.xml 中的 profile 中定义的 property 不能用于覆盖 settings.xml 中的内容。

一些简单设置

settings 元素中有一半是简单设置(一个 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>${user.home}/.m2/repository</localRepository>
  <interactiveMode>true</interactiveMode>
  <offline>false</offline>
  ...
</settings>

pluginGroups

pluginGroups 元素包含 pluginGroup 子元素的列表,每个元素都包含一个 groupId。当在命令行中使用形如 mvn prefix:goal 的命令且未提供插件的 groupId 时,将搜索该列表。该列表自动包含了 org.apache.maven.pluginsorg.codehaus.mojo

<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">
  ...
  <pluginGroups>
    <pluginGroup>org.eclipse.jetty</pluginGroup>
  </pluginGroups>
  ...
</settings>

例如,如果使用上述设置,可以在命令行中使用插件前缀来执行完成的插件命令。比如 mvn jetty:run 等同于执行 org.eclipse.jetty:jetty-maven-plugin:run 命令。

Servers

用于下载工件(artifact)和部署工件的仓库由 POM 的 repositoriesdistributionManagement 元素定义。但是,某些设置(如用户名和密码)不应与 pom.xml 一起分发。此类信息应存在于构建服务器的 settings.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">
  ...
  <servers>
    <server>
      <id>server001</id>
      <username>my_login</username>
      <password>my_password</password>
      <privateKey>${user.home}/.ssh/id_dsa</privateKey>
      <passphrase>some_passphrase</passphrase>
      <filePermissions>664</filePermissions>
      <directoryPermissions>775</directoryPermissions>
      <configuration></configuration>
    </server>
  </servers>
  ...
</settings>

注意:如果使用私钥登录服务器,请确保省略 <password> 元素。否则,该键将被忽略。

从 Maven 2.1.0+,可以对 passwordpassphrase 元素值进行加密,详情请参阅这里

Mirrors

<mirrors> 元素指定从远程仓库下载工件(artifact)时所使用的镜像列表。它是这样工作的:一个 POM 可以声明一个仓库来解析某些工件。然而,这个仓库有时可能会遇到流量过大的问题,所以将其副本复制到了好几个地方。这个副本仓库将有一个唯一的 id,因此我们可以为该副本仓库创建一个镜像引用,用作代替原先的下载站点。

<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">
  ...
  <mirrors>
    <mirror>
      <id>planetmirror.com</id>
      <name>PlanetMirror Australia</name>
      <url>http://downloads.planetmirror.com/pub/maven2</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  ...
</settings>

下面是几个在国内下载速度比较快的镜像网站配置:

    <mirrors>
        <!-- 国内的镜像网站(下载速度应该快上不少) -->
        <mirror>
            <id>huaweiyun</id>
            <mirrorOf>central</mirrorOf>
            <name>华为云公共仓库</name>
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
        </mirror>
        <mirror>
            <id>aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
        <mirror>
            <id>tencentyun</id>
            <mirrorOf>central</mirrorOf>
            <name>腾讯云公共仓库</name>
            <url>http://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
        </mirror>
        <!-- 国外的镜像网站(下载速度可能较慢) -->
        <mirror>    
            <id>repo2</id>    
            <mirrorOf>central</mirrorOf>    
            <name>Maven Central Public Repository</name>    
            <url>http://repo2.maven.org/maven2/</url>    
        </mirror>
        <mirror>
            <id>ibiblio</id>    
            <mirrorOf>central</mirrorOf>    
            <name>ibiblio Repository</name>    
            <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>    
        </mirror>    
        <mirror>    
            <id>jboss-public-repository-group</id>    
            <mirrorOf>central</mirrorOf>    
            <name>JBoss Public Repository Group</name>    
            <url>http://repository.jboss.org/nexus/content/groups/public</url>    
        </mirror>  
        <mirror>    
            <id>JBossJBPM</id>   
          <mirrorOf>central</mirrorOf>   
          <name>JBossJBPM Repository</name>   
          <url>https://repository.jboss.org/nexus/content/repositories/releases/</url>  
        </mirror>  
    </mirrors>

Proxies

<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">
  ...
  <proxies>
    <proxy>
      <id>myproxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.somewhere.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
    </proxy>
  </proxies>
  ...
</settings>

除非另有指定(通过系统属性或命令行开关),否则将使用 proxies 元素中第一个激活的代理设置。

Profiles

settings.xml 文件中的 profile 元素是 pom.xml 文件中 profile 元素的缩减版本。settings.xml 文件中的 profile 元素由 activationrepositoriespluginRepositoriesproperties 这四个子元素组成,它们与构建系统作为一个整体(这正是 settings.xml 文件所扮演的角色),而与单个项目的对象模型设置无关。

如果一个 profilesettings 元素中处于激活状态,则其值将覆盖 POM 或 profiles.xml 文件中的任何等效 ID 的 profile 设置。

与 POM 的 profile 一样, settings 元素中的 profile 的好处在于它可以在特定情况下修改某些值,这通常是通过 activation 元素来指定的。

<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">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>mavenVersion</name>
          <value>2.0.3</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
  ...
</settings>

当所有指定的条件都满足时才会激活,尽管并非所有条件都需要同时满足。

activation 元素不是激活 profile 的唯一方式。settings.xml 文件的 activeProfile 元素可能包含 profile 的 id。它们也可以通过在命令行中的 -P 标志后跟一个逗号分隔列表来显式激活某个 profile(例如 -P test)。

要查看哪个 profile 将在特定构建中激活,请使用 maven-help-plugin 插件。

mvn help:active-profiles

Properties

Maven 中的 property 是值占位符,就像 Ant 中的 property 一样,它们的值可以通过使用诸如 ${X} 的形式在 POM 中的任何位置访问名为 X property 的值。它们有五种不同的样式,都可以从 settings.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">
  ...
  <profiles>
    <profile>
      ...
      <properties>
        <user.install>${user.home}/our-project</user.install>
      </properties>
      ...
    </profile>
  </profiles>
  ...
</settings>

如果该 profile 处于激活状态,则可以从 POM 文件访问 ${user.install} property。

Repositories

仓库是项目的远程集合,Maven 可以使用这些远程项目填充构建系统的本地仓库,Maven 将其 plugindependency 存储在这个本地仓库中。不同的远程仓库可能包含不同的项目,在某个激活的 profile 下,可以搜索这些远程仓库来查找匹配的 release 或 snapshot 的工件。

<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">
  ...
  <profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>codehausSnapshots</id>
          <name>Codehaus Snapshots</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://snapshots.maven.codehaus.org/maven2</url>
          <layout>default</layout>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>myPluginRepo</id>
          <name>My Plugins repo</name>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <url>https://maven-central-eu....com/maven2/</url>
        </pluginRepository>
      </pluginRepositories>
      ...
    </profile>
  </profiles>
  ...
</settings>

Plugin Repositories

仓库是两种主要类型工件的所在地:

在任何情况下,pluginRepositories 元素的结构都类似于 repositories 元素。pluginRepository 元素都指定了 Maven 可以在其中找到插件的远程地址。

Active Profiles

<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">
  ...
  <activeProfiles>
    <activeProfile>env-test</activeProfile>
  </activeProfiles>
</settings>

settings.xml 元素的最后一块是 activeProfiles 元素。这包含一组 activeProfile 元素,每个 activeProfile 元素都有一个 profileid 值。无论环境设置如何,定义为 activeProfile 的任何 profile id 都将处于激活状态。如果没有找到匹配的 profile,则什么也不会发生。例如,如果 env-testactiveProfile,则 pom.xml(或 profile.xml)中具有相应 idprofile 将处于激活状态。如果没有找到这样的 profile,则会忽略并继续执行其他配置。

上一篇 下一篇

猜你喜欢

热点阅读