settings.xml
是 Java 项目中用于配置 Maven 的重要文件,它详细规定了 Maven 的运行规则和行为。该文件通常位于用户家目录下的 .m2 文件夹中,或者项目根目录下的. mvn 文件夹内。settings.xml 中包含了众多配置项,从代理设置、镜像仓库配置,到服务器认证信息、插件组等,均可以在此文件中进行细致定义。通过合理配置 settings.xml ,我们可以优化 Maven 的依赖下载速度,保障仓库访问的安全性,甚至实现私有仓库的搭建与管理。
一、settings.xml 文件位置
settings.xml文件存在于两个位置:
Maven安装目录下(全局配置):${maven.home}/conf/setting.xml
用户目录下(用户级配置):${user.home}/.m2/settings.xml
配置优先级从高到低:项目pom.xml > user settings > global settings。
二、settings.xml 元素详解
2.1 localRepository
构建系统本地仓库的路径。其默认值为 ~/.m2/repository
<!-- 默认值是${user.home}/.m2/repository -->
<localRepository>/Users/zhangqin/mydata/repository/</localRepository>
2.2 interactiveMode
Maven是否需要和用户交互以获得输入。如果Maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为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>
2.3 usePluginRegistry
Maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让Maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。
<!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false -->
<usePluginRegistry>false</usePluginRegistry>
2.4 offline
表示Maven是否需要在离线模式下运行。如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
<!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 -->
<offline>false</offline>
2.5 pluginGroups
当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo。
<!--插件组 在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 -->
2.6 servers
用来下载和部署的仓库是用 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>
2.7 Mirrors
为仓库列表配置的下载镜像列表。
<mirrors>
<mirror>
<!-- 镜像标识id -->
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
mirrorOf 说明:
指向此镜像的仓库Id,任何对于远程仓库的请求都会被转至此 url 。多个逗号隔开,或者*
号统配,或者!
排除某个之外的所有仓库。 external:*
匹配除使用 localhost 或基于文件的存储库之外的所有存储库。自 Maven 3.8.0 起,external:http:*
匹配所有使用 HTTP 的存储库,但使用 localhost 的存储库除外。
*
:一切external:*
:一切不在本地主机上,也不基于文件。repo1,repo2
:repo1 或 repo2。*,!repo1
:除了 repo1 之外的所有东西。
2.8 proxies
代理设置,主要用于无法直接访问中心的库用户配置。用来配置不同的代理,多代理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>
2.9 profiles
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构件。 -->
<!--插件仓库(plugin repositories)
仓库包含了两种重要类型的构件:第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。-->
</profile>
</profiles>
2.10 activation
自动触发 profile 的条件逻辑。Activation 是 profile 的开启钥匙。如 POM 中的 profile 一样,profile 的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation 元素并不是激活 profile 的唯一方式。settings.xml 文件中的 activeProfile 元素可以包含 profile 的 id。profile 也可以通过在命令行,使用 -P 标记和逗号分隔的列表来显式的激活(如,-P test)。
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
2.11 properties
Maven的属性是值占位符,就像Ant中的属性。如果X是一个属性的话,那么它的值在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从 settings.xml 文件中访问到。
env.X:使用“env.”前缀将会返回当前的环境变量。例如${env.PATH}就是使用了$path环境变量。
project.X:一个点“.”分割的路径,在POM中就是相关的元素的值。例如:<project><version>1.0</version></project>就可以通过${project.version}来访问。
settings.X:一个点“.”分割的路径,在settings.xml中就是相对应的元素的值,例如:<settings><offline>false</offline></settings>就可以通过${settings.offline}来访问。
Java系统属性:所有通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如:${java.home}
X:被<properties/>或者外部文件定义的属性,值可以这样访问${someVar}
<properties>
<test.jdbc.url>
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
</test.jdbc.url>
<test.jdbc.driverClassName>com.mysql.jdbc.Driver</test.jdbc.driverClassName>
<test.jdbc.username>root</test.jdbc.username>
<test.jdbc.password></test.jdbc.password>
<test.host.url>http://172.16.11.43:80</test.host.url>
</properties
2.12 repositories
远程仓库列表,它是 Maven 用来填充构建系统本地仓库所使用的一组远程项目。
<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>
2.13 pluginRepositories
发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。
<pluginRepositories>
<pluginRepository>
<id>ccl-nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
2.14 activeProfiles
手动激活 profiles 的列表,按照 profile 被应用的顺序定义 activeProfile 。 该元素包含了一组 activeProfile 元素,每个 activeProfile 都含有一个 profile id 。任何在 activeProfile 中定义的 profile id ,不论环境设置如何,其对应的 profile 都会被激活。如果没有匹配的 profile ,则什么都不会发生。例如,env-test 是一个 activeProfile ,则在 pom.xml(或者 profile.xml )中对应 id 的 profile 会被激活。如果运行过程中找不到这样一个 profile ,Maven 则会像往常一样运行。