日常开发中,除了在pom.xml
中配置单个项目的参数外,也可以在settings.xml
中配置全局参数,下面来看看这些参数。更多信息请参考官方文档。
settings.xml
文件中的settings
元素包含用于定义以各种方式配置Maven执行的值的元素,比如pom.xml
,但是不应该绑定到任何特定项目或分发给用户。这些值包括本地存储库位置、备用远程存储库服务器和身份验证信息。
settings.xml
文件可能存在两个位置:
${maven.home}/conf/settings.xml
${user.home}/.m2/settings.xml
前一个settings.xml
也称为全局设置,后一个settings.xml
称为用户设置。如果两个文件都存在,它们的内容将被合并,而用户特定的settings.xml
将占主导地位。
提示:如果需要从头创建特定于用户的设置,最简单的方法是将Maven安装中的全局设置复制到${user.home}/.m2
目录。Maven的默认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/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
settings>
settings.xml
的内容可以使用以下表达式进行插值:
${user.home}
和所有其他系统属性(自Maven 3.0以来)${env.HOME}
等环境变量注意,配置文件中定义的属性不能用于插值。
顶级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>${user.home}/.m2/repositorylocalRepository>
<interactiveMode>trueinteractiveMode>
<offline>falseoffline>
...
settings>
${user.home}/.m2/repository
。对于允许所有登录用户从公共本地存储库构建的主构建服务器,此元素特别有用。true
,如果不是,则为false
。默认值为true
。true
如果该构建系统以脱机模式运行,则默认为false
。对于由于网络设置或安全原因而无法连接到远程存储库的构建服务器,此元素非常有用。这个元素包含一个pluginGroup
元素的列表,每个元素包含一个groupId。当使用插件并且命令行中没有提供groupId时,会搜索列表。此列表自动包含org.apache.maven.plugins
和org.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.jettypluginGroup>
pluginGroups>
...
settings>
例如,给定上述设置,Maven命令行可以使用截断的命令执行org.eclipse.jetty:jetty-maven-plugin:run
:
mvn jetty:run
用于下载和部署的存储库由POM的repositories和distributionManagement元素定义。但是,某些设置(如username
和password
)不应该与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>server001id>
<username>my_loginusername>
<password>my_passwordpassword>
<privateKey>${user.home}/.ssh/id_dsaprivateKey>
<passphrase>some_passphrasepassphrase>
<filePermissions>664filePermissions>
<directoryPermissions>775directoryPermissions>
<configuration>configuration>
server>
servers>
...
settings>
${user.home}/.ssh/id_dsa)
和一个passphrase
(如果需要的话)。passphrase
和password
元素将来可能会外部化,但目前它们必须在settings.xml
文件中以明文设置。注意:如果使用私钥登录到服务器,请确保省略
元素。否则,该私钥将被忽略。
一个新功能-服务器密码和口令加密已经增加到2.1.0+。详情请参阅此页
<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.comid>
<name>PlanetMirror Australianame>
<url>http://downloads.planetmirror.com/pub/maven2url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
...
settings>
部分中选择相应的凭据。central
存储库(https://repo.maven.apache.org/maven2/
)的镜像,请将该元素设置为central
。更高级的映射,如repo1、repo2
或*,!inhouse
也是可能的。这必须与镜像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">
...
<proxies>
<proxy>
<id>myproxyid>
<active>trueactive>
<protocol>httpprotocol>
<host>proxy.somewhere.comhost>
<port>8080port>
<username>proxyuserusername>
<password>somepasswordpassword>
<nonProxyHosts>*.google.com|ibiblio.orgnonProxyHosts>
proxy>
proxies>
...
settings>
proxy
元素。true
。这对于声明一组代理很有用,但是一次只能有一个是活动的。protocol://host:port
,被分割成离散的元素。settings.xml
中的profile
元素是pom.xml
profile
元素的截断版本。它由activation
、repositories
、pluginRepositories
和properties
元素组成。profile
元素只包含这四个元素,因为它们与构建系统作为一个整体(这是settings.xml
文件的角色)有关,而不是单独的项目对象模型设置。
如果配置文件在settings
中处于活动状态,那么它的值将覆盖POM或profiles.xml
文件中ID相同的任何配置文件。
激活是概要文件的关键。与POM的概要文件一样,概要文件的强大之处在于它只在特定情况下修改某些值的能力;这些环境是通过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>testid>
<activation>
<activeByDefault>falseactiveByDefault>
<jdk>1.5jdk>
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>${basedir}/file2.propertiesexists>
<missing>${basedir}/file1.propertiesmissing>
file>
activation>
...
profile>
profiles>
...
settings>
当所有指定的条件都满足时,就会激活,尽管不是同时需要所有条件。
activation
在jdk
元素中有一个内建的、以java为中心的检查。如果测试在与给定前缀匹配的jdk版本号下运行,则此操作将被激活。在上面的示例中,1.5.0_06将匹配。也支持范围。有关受支持范围的更多详细信息,请参见maven-enforcer-plugin。os
元素可以定义一些操作系统特定的属性,如上所示。有关OS值的更多细节,请参见maven-enforcer-plugin。name=value
对的属性(可以在POM中通过${name}
解除引用的值),该profile
将被激活。existence
或missing
来激活profile
。activation
元素不是激活profile
的唯一方式。settings.xml
文件的activeProfile
元素可以包含概要文件的id
。它们也可以通过命令行激活,在-P
标志后通过逗号分隔的列表(例如-P test
)。
要查看在某个构建中将激活哪个配置文件,请使用maven-help-plugin
。
mvn help:active-profiles
Maven属性是值占位符,就像Ant中的属性一样。它们的值可以通过使用符号${X}
在POM中的任何位置访问,其中X
是属性。它们有五种不同的样式,都可以从settings.xml
文件中访问:
env.X
:将变量前缀为“env”。将返回shell的环境变量。例如,${env.PATH}
包含$PATH环境变量(在Windows中为%PATH%
)。project.x
:POM中的点(.)标记路径将包含相应元素的值。例如:1.0
可通过${project.version}
访问。settings.x
:settings.xml
中的点(.)标记路径将包含相应元素的值。例如:false
可以通过${settings.offline}
访问。java.lang.System.getpProperties()
访问的属性都可以作为POM属性使用,比如${java.home}
。x
:在
元素或外部文件中设置,可以使用${someVar}
。<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-projectuser.install>
properties>
...
profile>
profiles>
...
settings>
如果该配置文件是活动的,则可以从POM访问${user.install}
。
存储库是项目的远程集合,Maven使用它来填充构建系统的本地存储库。Maven正是通过这个本地存储库将其称为插件和依赖项。不同的远程存储库可能包含不同的项目,并且在活动的概要文件下,它们可能被搜索到匹配的发布或快照工件。
<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>codehausSnapshotsid>
<name>Codehaus Snapshotsname>
<releases>
<enabled>falseenabled>
<updatePolicy>alwaysupdatePolicy>
<checksumPolicy>warnchecksumPolicy>
releases>
<snapshots>
<enabled>trueenabled>
<updatePolicy>neverupdatePolicy>
<checksumPolicy>failchecksumPolicy>
snapshots>
<url>http://snapshots.maven.codehaus.org/maven2url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
...
pluginRepositories>
...
profile>
profiles>
...
settings>
releases
或snapshots
)启用了true
或false
。always
、daily
(默认)、interval:X
(其中X是以分钟为单位的整数)或never
。ignore
、fail
或在缺少或不正确的校验和时发出warn
。default
还是legacy
。存储库是两种主要类型的工件的所在地。第一种是用作其他工件依赖关系的工件。这些是驻留在central中的大部分工件。另一种类型的工件是插件。Maven插件本身就是一种特殊类型的工件。因此,插件存储库可能与其他存储库分离(尽管,我还没有听到有说服力的理由这么做)。在任何情况下,pluginRepositories
元素块的结构都类似于repositories
元素。每个pluginRepository
元素都指定了一个Maven可以找到新插件的远程位置。
<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-testactiveProfile>
activeProfiles>
settings>
settings.xml
难题的最后一部分是activeProfiles
元素。它包含一组activeProfile
元素,每个元素都有一个profile id
值。任何定义为activeProfile
的profile id
都将是活动的,而不管任何环境设置。如果没有找到匹配的配置文件,什么也不会发生。例如,如果env-test
是一个activeProfile
,那么pom.xml
(或具有相应id
的profile.xml
)中的profile将是活动的。如果没有找到这样的配置文件,那么执行将正常继续。
更多请参考仓库大全。下面是central仓和jcenter仓的聚合仓:
<mirror>
<id>alimavenid>
<mirrorOf>central,jcentermirrorOf>
<name>aliyun mavenname>
<url>https://maven.aliyun.com/repository/publicurl>
mirror>
<repositories>
<repository>
<id>top1id>
<name>Centralname>
<url>https://repo1.maven.org/maven2/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top2id>
<name>Sonatypename>
<url>https://oss.sonatype.org/content/repositories/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top3id>
<name>Spring Pluginsname>
<url>https://repo.spring.io/plugins-release/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top4id>
<name>Spring Lib Mname>
<url>https://repo.spring.io/libs-milestone/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top5id>
<name>Hortonworksname>
<url>https://repo.hortonworks.com/content/repositories/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top6id>
<name>Atlassianname>
<url>https://maven.atlassian.com/content/repositories/atlassian-public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top7id>
<name>JCentername>
<url>https://jcenter.bintray.com/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top8id>
<name>JBossEAname>
<url>https://repository.jboss.org/nexus/content/repositories/ea/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top9id>
<name>JBoss Releasesname>
<url>https://repository.jboss.org/nexus/content/repositories/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top10id>
<name>WSO2 Releasesname>
<url>https://maven.wso2.org/nexus/content/repositories/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top11id>
<name>Spring Lib Releasename>
<url>https://repo.spring.io/libs-release/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top12id>
<name>WSO2 Publicname>
<url>https://maven.wso2.org/nexus/content/repositories/public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top13id>
<name>IBiblioname>
<url>https://maven.ibiblio.org/maven2/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top14id>
<name>XWiki Releasesname>
<url>https://maven.xwiki.org/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top15id>
<name>Kotlin Devname>
<url>https://dl.bintray.com/kotlin/kotlin-dev/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top16id>
<name>Nuxeoname>
<url>https://maven-eu.nuxeo.org/nexus/content/repositories/public-releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top17id>
<name>Clojarsname>
<url>https://clojars.org/repo/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top18id>
<name>Gradle Pluginsname>
<url>https://plugins.gradle.org/m2/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top19id>
<name>Geomajasname>
<url>http://maven.geomajas.org/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>top20id>
<name>Redhat GAname>
<url>https://maven.repository.redhat.com/ga/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
repositories>