本文是对https://maven.apache.org/settings.html的翻译和总结
介绍
快速概览
settings文件是一个全局的配置,并不与某一个项目绑定。它包含了对本地库位置的配置,远程库服务,验证信息。
settings.xml
可以配置在两个位置:
- maven的安装目录
- 用户目录:
${user.home}/.m2/settings.xml
maven安装目录中的settings.xml
是一个全局的配置,用户目录中的settings.xml
文件只对当前用户有效。
如果两个文件都存在,则其内容将合并,用户特定的settings.xml
占主导地位。
以下是settings
下的顶级元素的概述:
可以使用以下表达式插入settings.xml
的内容:
- ${user.home} 和其他所有系统属性 (since Maven 3.0)
- ${env.HOME} 等环境变量
请注意,
settings.xml
中的元素中定义的
properties
不能用于插值。
settings 细节
简单值
一半的顶级元素是简单值,表示一系列值,用于描述构建系统中全程有效的元素。
${user.home}/.m2/repository
true
false
...
- localRepository:本地仓库的地址,默认是
${user.home}/.m2/repository
- interactiveMode:是否以交互式进行输入,则为true,否则为false。默认为true。例如在创建maven应用上时以交互式创建。
1. 非交互式创建应用:
mvn archetype:generate
-DgroupId=com.howtodoinjava
-DartifactId=DemoJavaProject
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
2. 交互式创建maven应用
mvn archetype:generate
此时,maven会让你输入项目的一些配置,例如groupId
,artifactId
,version
等
- offline:是否在offline模式下操作。由于网络设置或安全原因,此元素对无法连接到远程存储库的构建服务器很有用。
Plugin Groups
该元素包含一个pluginGroup
元素列表,每个元素都包含一个groupId
。使用插件时搜索列表,并且命令行中未提供groupId。此列表自动包含org.apache.maven.plugins
和org.codehaus.mojo
。
...
org.eclipse.jetty
...
例如,给定上述设置,Maven命令行可以以简写形式执行org.eclipse.jetty:jetty-maven-plugin:run
:
mvn jetty:run
Servers
用于下载和部署的存储库由POM的repositories
和distributionManagement
元素定义。但是,某些设置(如用户名和密码)不应与pom.xml一起分发。此类信息应存在于settings.xml
中的构建服务器上。
...
server001
my_login
my_password
${user.home}/.ssh/id_dsa
some_passphrase
664
775
...
- id:仓库的名称
- username,password:这些元素显示为一对,表示对此服务器进行身份验证所需的登录名和密码。
- privateKey, passphrase:这也是成对出现,表示私钥的路径(默认是
${user.home}/.ssh/id_dsa
)和密码。密码和密码元素将来可能会外部化,但是现在必须在settings.xml
文件中设置纯文本。 - filePermissions, directoryPermissions:在部署时创建存储库文件或目录时,这些是要使用的权限。每个的合法值是对应于* nix文件权限的三位数字,例如, 664或775。
注意:如果使用私钥登录服务器,请确保省略
元素。否则,密钥将被忽略。
密码加密
一个新功能 - 服务器密码和密码加密已添加到2.1.0+。查看此页面的详细信息
MIrrors
使用镜像的一些原因:
- 互联网上有一个同步镜像,地理位置更近,速度更快
- 您希望将特定存储库替换为您可以更好地控制的内部存储库
- 您希望运行存储库管理器以向镜像提供本地缓存,并且需要使用其URL
一般是第一个原因
...
planetmirror.com
PlanetMirror Australia
http://downloads.planetmirror.com/pub/maven2
central
...
- id,name:id必须唯一(不要与仓库
id
一样),name随意 - url:镜像的地址
- mirrorOf:需要被镜像的仓库
id
。例如,要指向Maven中央存储库(https://repo.maven.apache.org/maven2/)的镜像,请将此元素设置为central。更高级的映射,如repo1,repo2
或*,!inhouse
也是可能的。这必须与镜像ID不匹配。
有关镜像的更深入介绍,请阅读镜像设置指南。
Proxies
如果你访问不了某一个仓库,可以使用代理,用的不多,所以这里也不详细说明。想要了解的可以去官网查看。
...
myproxy
true
http
proxy.somewhere.com
8080
proxyuser
somepassword
*.google.com|ibiblio.org
...
Profiles
settings.xml
中的profile
元素是pom.xml
profile
元素的精简版本。它由activation
,repositories
,pluginRepositories
和properties
元素组成。概要文件元素仅包含这四个元素,因为它们关注整个构建系统(这是settings.xml
文件的作用),而不是单个项目对象模型设置。
如果profile
在settings.xml
中被激活,则其值将覆盖POM或profiles.xml
文件中任何等效的ID'd配置。
Activation
该属性可以配置配置文件的激活条件,例如,激活条件必须是 jdk8
,必须是windows
等。
...
test
false
1.5
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
${basedir}/file2.properties
${basedir}/file1.properties
...
...
当满足所有指定条件时激活,但不是一次都需要。
- 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
。
mvn help:active-profiles
Properties
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系统属性:可通过
java.lang.System.getProperties()
访问的所有属性都可用作POM属性,例如${java.home}
。 - x:在
元素或外部文件中设置的值,该值可以用作${someVar}
。
...
...
${user.home}/our-project
...
...
如果此配置文件被启用,则可以在POM中使用${user.install}
访问该属性。
Repositories
Repositories是Maven用于填充构建系统的本地存储库的项目的远程集合。它来自这个本地存储库,Maven称之为插件和依赖项。不同的远程存储库可能包含不同的项目,并且在启用的profile下,可以搜索它们以查找匹配的版本或快照工件。
...
...
codehausSnapshots
Codehaus Snapshots
false
always
warn
true
never
fail
http://snapshots.maven.codehaus.org/maven2
default
...
...
...
- releases, snapshots:这是针对每种工件,Release或snapshot的策略。通过这两个集合,POM可以在单个存储库中独立于另一个类型更改每种类型的策略。例如,对于开发目的的远程库,可以决定仅启用快照下载。
- enabled:是否为相应类型(
releases
或snapshots
)启用此存储库,是true
还是false
。 - updatePolicy:此元素指定更新本地库频率。Maven会将本地POM的时间戳(存储在存储库的maven-metadata文件中)与远程数据进行比较。选项包括:
always
,daily
(默认),interva:X
(其中X是以分钟为单位的整数)或never
。 - checksumPolicy:当Maven将文件部署到存储库时,它还会部署相应的校验和文件。您可以选择
ignore
,fail
或warn
缺少或不正确的校验和。 - layout:。。。
Plugin Repositories
存储库是两种主要类型的工件的所在地。第一个是用作其他工件的依赖项的工件。这些是位于中央的大多数插件。另一种类型的工件是插件。Maven插件本身就是一种特殊的工件。因此,插件存储库可能与其他存储库分离(尽管如此,我还没有听到令人信服的论据)。在任何情况下,pluginRepositories
元素块的结构类似于repositories
元素。 pluginRepository
元素指定Maven可以在哪里找到新插件的远程位置。
启用Profiles
...
env-test
settings.xml
拼图的最后一部分是activeProfiles
元素。它包含一组activeProfile
元素,包含一个profile
的id
。无论任何环境设置如何,任何定义为activeProfile
的profile
id
都将将被启用。如果没有找到匹配的profile,则不会发生任何事。
详细的maven属性说明
repository
和pluginRepository
的顺序会影响获取远程工建的顺序镜像匹配规则,首先找到完全匹配的镜像,如果未找到完全匹配的镜像,但是有多个间接匹配(符合条件),则会选择第一个镜像作为镜像。
maven拉取jar的过程: