一、settings.xml 的作用

  settings.xml 是 Maven 参数的配置文件,它用于配置本地仓库、远程仓库和联网使用的代理等信息。

二、settings.xml 的位置

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

  • Maven 安装:$ {maven.home} /conf/settings.xml
  • 用户的安装:$ {user.home} /.m2 / settings.xml

  前一个 settings.xml 也称为全局设置,后一个 settings.xml 称为用户设置。如果两个文件都存在,则它们的内容将合并,其中用户特定的 settings.xml 是主要文件。

三、settings.xml 中元素详解

1、所有顶级元素

 1<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
 2	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 3	  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0https://maven.apache.org/xsd/settings-1.0.0.xsd">
 4  <localRepository/>
 5  <interactiveMode/>
 6  <offline/>
 7  <pluginGroups/>
 8  <servers/>
 9  <mirrors/>
10  <proxies/>
11  <profiles/>
12  <activeProfiles/>
13</settings>

2、LocalRepository

  LocalRepository 用于设置本地仓库的路径,默认 ~/.m2/repository

1<localRepository> F:\develop\apache-maven-3.6.1\local </localRepository>

3、InteractiveMode

  InteractiveMode 用于表示 maven 是否需要和用户交互以获得输入。如果 maven 需要和用户交互以获得输入,则设置成 true,反之则应为 false。默认为 true。

假如我们使用 Maven 创建一个 Java Web 项目。

方法一:

  只需在 cmd 中输入:mvn archetype:generate,随后 Maven 将下载 Archetype 插件及其所有的依赖插件,这些插件其实都是 jar 包,它们存放在您的 Maven 本地仓库中。这时你会看到很多 Archetype(原型),即为项目模板。我们选择 maven-archetype-webapp创建 Java Web 项目,接着 Maven 会等待你输入一些信息。这种方式称为 Interactive Mode(交互模式)。

方法二:

  如果你觉得上面的交互过于繁琐,那么你可以使用一条命令完成操作。mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.smart -DartifactId=smart-demo -Dversion=1.0。这种方式称为 Batch Mode(批处理模式)。

方法三:

  我也可以使用 IDE 来快速创建 Maven 项目,这种操作非常简单。

5、offline

  如果此构建系统应在离线模式下运行,则为 true,默认为 false。对于网络设置或安全原因而无法连接到远程存储库的构建服务器,此元素很有用。

6、pluginGroups

  该元素包含一个 pluginGroup元素列表,每个元素都包含一个 groupId。使用插件时搜索列表,并且命令行中未提供 groupId。此列表自动包含 org.apache.maven.pluginsorg.codehaus.mojo

1<pluginGroups>
2    <pluginGroup>org.eclipse.jetty</pluginGroup>
3</pluginGroups>

  例如,给定上述设置,Maven 命令行可以以简写形式执行 org.eclipse.jetty:jetty-maven-plugin:run

1mvn jetty:run

7、servers

  用于下载和部署的存储库由 POM 的 repositoriesdistributionManagement元素定义。但是,某些设置(如用户名和密码)不应与 pom.xml 一起分发。此类信息应存在于 settings.xml中的构建服务器上。

 1<servers>
 2    <server>
 3      <!--仓库的名称-->
 4      <id>server001</id>
 5      <!--username和password用于对此服务器进行身份验证-->
 6      <username>my_login</username>
 7      <password>my_password</password>
 8      <!--privateKey和passphrase表示私钥的路径(默认是`${user.home}/.ssh/id_dsa`)和密码。密码和密码元素将来可能会外部化,但是现在必须在`settings.xml`文件中设置纯文本。-->
 9      <privateKey>${user.home}/.ssh/id_dsa</privateKey>
10      <passphrase>some_passphrase</passphrase>
11      <!--filePermissions和directoryPermissions 在部署中创建存储库文件或目录时,这些是使用权限。每个文件的合法值是一个三位数,与* nix文件的权限相对应,例如664或775。-->
12      <filePermissions>664</filePermissions>
13      <directoryPermissions>775</directoryPermissions>
14      <configuration></configuration>
15    </server>
16</servers>

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

8、mirrors

  mirrors 用于定义远程仓库的镜像,如果访问远程仓库的速度比较慢,我们可以选择一个速度比较快的镜像。也可以将特定存储库替换为你可以更好地控制的内部存储库。

 1<mirrors>
 2  <!-- 给定仓库的下载镜像-->
 3  <mirror>
 4    <!-- 该镜像的唯一标识符。id用来区分不同的mirror元素-->
 5    <id>planetmirror.com</id>
 6    <!-- 镜像名称 -->
 7    <name>PlanetMirror Australia</name>
 8    <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL-->
 9    <url>http://downloads.planetmirror.com/pub/maven2</url>
10    <!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。 -->
11    <mirrorOf>central</mirrorOf>
12  </mirror>
13</mirrors>

mirrorOf 属性详解

  当属性值为:center表示当前镜像为远程中央仓库的镜像。请注意,给定存储库最多可以有一个镜像。你不可以将单个存储库映射到完全相同 <mirrorOf>值的一组镜像,Maven 不会汇总镜像,而只是选择第一个匹配项。你可以通过使 Maven 镜像将所有存储库请求来强制其使用单个存储库。存储库必须包含所有所需的工件,或者能够将请求代理到其他存储库。则将 <mirrorOf>的值设置为 *

从 Maven 2.0.9 开始的语法:

  • * = 一切
  • external:* = 一切不在本地主机上,也不基于文件。
  • repo,repo1 =repo 或 repo1
  • *,!repo1 = 除了 repo1 以外的所有内容

9、proxies

  如果你访问不了某一个仓库,可以使用代理,用的不多。

 1<proxies>
 2   <proxy>
 3      <!-- 此代理的唯一标识符。这用于区分代理元素-->
 4      <id>myproxy</id>
 5      <!-- 如果此代理处于活动状态,则为true。这对于声明一组代理很有用,但是一次只能激活一个代理-->
 6      <active>true</active>
 7      <!-- 代理的protocol:// host:port,分为独立的元素-->
 8      <protocol>http</protocol>
 9      <host>proxy.somewhere.com</host>
10      <port>8080</port>
11      <!-- 表示验证此代理服务器所需的登录名和密码-->
12      <username>proxyuser</username>
13      <password>somepassword</password>
14      <!-- 这是不应代理的主机列表。列表的定界符是代理服务器的预期类型,示例是管道分隔符-逗号分隔也是常见的-->
15      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
16   </proxy>
17</proxies>

10、profiles

  profiles可以有多个 profile,在 settings.xml中的 profile元素是 pom.xmlprofile元素的精简版本。它由 idactivationpropertiesrepositoriespluginRepositories元素组成。它整个构建系统有关(这是 settings.xml文件的作用),而不是单个项目对象模型设置。如果 profilesettings.xml中被激活,则其值将覆盖 POM 或 profiles.xml文件中任何等效的 id配置。

① activation 的作用
 1<profiles> 
 2    <profile> 
 3      <id> test </id> 
 4      <activation> 
 5        <!--profile默认是否激活的标识 -->
 6        <activeByDefault> false </activeByDefault> 
 7        <jdk> 1.5 </jdk> 
 8        <os> 
 9          <name> Windows XP </name> 
10          <family> Windows </family> 
11          <arch> x86 </arch> 
12          <version> 5.1.2600 </version>
13        </os> 
14        <property> 
15          <!--激活profile的属性的名称 -->
16          <name> mavenVersion </name>
17          <!--激活profile的属性的值 -->
18          <value> 2.0.3 </value> 
19        </property> 
20        <file> 
21          <!--如果指定的文件存在,则激活profile。 -->
22          <exists> $ {basedir} /file2.properties </exists> 
23          <!--如果指定的文件不存在,则激活profile。 -->
24          <missing> $ {basedir} /file1.properties </missing> 
25        </file > 
26      </activation> 
27      ... 
28    </profile> 
29</profiles> 

当满足所有指定条件时激活,但不是一定都需要:

  • jdk:activation 在 jdk 元素中有一个内置的,以 Java 为中心的检查。如果测试是在与给定前缀匹配的 jdk 版本号下运行,则会激活此选项。在上面的例子中,1.5.0_06将匹配。从 Maven 2.1 开始也支持范围。有关支持的范围的更多详细信息,请参阅maven-enforcer-plugin
  • os:os 元素可以定义上面显示的一些操作系统特定属性。有关 OS 值的更多详细信息,请参阅maven-enforcer-plugin
  • property:如果 Maven 检测到相应name=value对的属性(可以在 POM 中取消引用${name}的值),则将激活该配置文件。
  • file:给定的文件名可以通过文件的存在或缺少文件来激活配置文件。

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

  要查看将在特定版本中激活的配置文件,请使用 maven-help-plugin

1mvn help:active-profiles
② properties 的作用

  Maven 属性是值占位符,就像 Ant 中的属性一样。可以使用符号 ${X}在 POM 内的任何位置访问它们的值,其中 X是属性。它们有五种不同的样式,都可以从 settings.xml 文件中访问:

  1. env.X:使用“env.”前缀变量将返回 shell 的环境变量。例如,${env.PATH}返回 $path 环境变量(Windows 中是%PATH%
  2. project.x:POM 中的点(.)标记路径将包含相应元素的值。例如:<project><version>1.0</version></project>可通过${project.version}访问。
  3. settings.xsettings.xml中的点(.)标记路径将包含相应元素的值。例如:<settings><offline>false</offline></settings>可通过${settings.offline}访问。
  4. Java 系统属性:可通过java.lang.System.getProperties()访问的所有属性都可用作 POM 属性,例如${java.home}
  5. x:在<properties />元素或外部文件中设置的值,该值可以用作${someVar}
1<profiles>
2   <profile>
3      ...
4      <properties>
5        <user.install>${user.home}/our-project</user.install>
6      </properties>
7      ...
8   </profile>
9</profiles>

如果此配置文件被启用,则可以在 POM 中使用 ${user.install}访问该属性。

③ repositories 的作用

  Repositories 是项目的远程集合,Maven 使用这些资源来填充构建系统的本地存储库。Maven 在此本地存储库中将其称为插件和依赖项。不同的远程存储库可能包含不同的项目,并且在启用的 profile 下,可以搜索它们以查找匹配的版本或快照工件。

 1<repositories>
 2  <!--包含需要连接到远程仓库的信息 -->
 3  <repository>
 4    <!--远程仓库唯一标识 -->
 5    <id>codehausSnapshots</id>
 6    <!--远程仓库名称 -->
 7    <name>Codehaus Snapshots</name>
 8    <!--如何处理远程仓库里发布版本的下载 -->
 9    <releases>
10      <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
11      <enabled>false</enabled>
12      <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
13      <updatePolicy>always</updatePolicy>
14      <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
15      <checksumPolicy>warn</checksumPolicy>
16    </releases>
17    <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
18    <snapshots>
19      <enabled>true</enabled>
20      <updatePolicy>never</updatePolicy>
21      <checksumPolicy>fail</checksumPolicy>
22    </snapshots>
23    <!--远程仓库URL,按protocol://hostname/path形式 -->
24    <url>http://snapshots.maven.codehaus.org/maven2</url>
25    <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
26    <layout>default</layout>
27  </repository>
28</repositories>
  • releases, snapshots:这是针对每种工件,Release 或 snapshot 的策略。通过这两个集合,POM 可以在单个存储库中独立于另一个类型更改每种类型的策略。例如,对于开发目的的远程库,可以决定仅启用快照下载。
  • enabled:是否为相应类型(releasessnapshots)启用此存储库,是true还是false
  • updatePolicy:此元素指定更新本地库频率。Maven 会将本地 POM 的时间戳(存储在存储库的 maven-metadata 文件中)与远程数据进行比较。选项包括:alwaysdaily(默认),interva:X(其中 X 是以分钟为单位的整数)或never
  • checksumPolicy:当 Maven 将文件部署到存储库时,它还会部署相应的校验和文件。您可以选择ignorefailwarn缺少或不正确的校验和。
  • layout:在以上对存储库的描述中,提到它们都遵循相同的布局。这基本上是正确的。Maven 2 的存储库具有默认布局。但是,Maven 1.x 具有不同的布局。使用此元素可以指定默认还是传统。
④ pluginRepositories 的作用

  存储库是两种主要类型的工件的所在地。第一个是用作其他工件的依赖项的工件,这些是驻留在 Central 中的大多数插件。另一种类型的工件是插件。Maven 插件本身就是一种特殊的工件。因此,插件存储库可能与其他存储库分离。在任何情况下,pluginRepositories元素块的结构类似于 repositories元素。 pluginRepository元素指定 Maven 可以在哪里找到新插件的远程位置。

11、ActiveProfiles

  activeProfiles 元素包含一组 activeProfile 元素,每个元素都有一个配置文件 ID 的值。无论任何环境设置如何,任何定义为 activeProfile 的配置文件 ID 都将处于活动状态。如果找不到匹配的配置文件,则不会发生任何事情。例如,如果 env-test 是 activeProfile,则 pom.xml(或具有相应 ID 的 profile.xml)中的配置文件将处于活动状态。如果未找到此类配置文件,则执行将照常继续。

1<activeProfiles>
2    <!-- 要激活的profile id -->
3    <activeProfile> env-test </activeProfile>
4</activeProfiles>

四、总结

1、proxy、server、repository、mirror 的作用

  • proxy 是服务器不能直接访问外网时需要设置的代理服务,不常用。
  • server 是服务器要打包上传到私服时,设置私服的鉴权信息。
  • repository 是服务器下载 jar 包的仓库地址。
  • mirror 是用于替代仓库地址的镜像地址。

2、mirror 和 repository 的特点

  • 在 mirrorOf 与 repositoryId 相同的时候优先是使用 mirror 的地址。
  • mirrorOf 等于 * 的时候覆盖所有 repository 配置。
  • 存在多个 mirror 配置的时候 mirrorOf 等于 * 放到最后。
  • 只配置 mirrorOf 为 central 的时候可以不用配置 repository。

标题:settings.xml 的配置——Maven
作者:Yi-Xing
地址:http://zyxwmj.top/articles/2019/11/06/1573018143484.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!