maven 应该是 java 程序员最常用的一个工具了,也因为他的工具性,很多人并不很在意 maven 如何配置,更别说原理了,只要能用就可以了。这种状况在有新员工入职时尤其明显:
小鲜肉:我这个包怎么下不下来啊?
老腊肉:别着急,我给你拷份配置文件。
小鲜肉:怎么还是有下不下来的?
老腊肉:哦哦哦,我忘记了还有没传到私服的,我给你拷一份我本地仓库的。
过程虽然麻烦,但一旦配置好很多人又忘记了当时的问题。
所以就整理了一下 maven setting 文件该如何配置。
本文使用的 maven 版本为 3.5.4
配置
首先 maven setting 可以被声明为两个级别:
- 用户级别。默认在 ${user.home}/.m2/settings.xml。可以通过命令行 -s /path/to/user/settings.xml 修改。
- 全局级别。默认在 ${maven.conf}/settings.xml。可以通过命令行 -gs /path/to/global/settings.xml 修改。
下面对配置中的每一个元素进行说明。
localRepository
本地仓库地址,默认值 ${user.home}/.m2/repository。
如果复制了别人的 setting,也要注意下这个值和原来的是否相同,不然又要重下一遍。
interactiveMode
是否需要和用户输入进行交互。如果为 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 是因为这两个都有默认值。
offline
是否使用离线模式,默认值为 false,这个应该不会设置成 true 的,要用通过命令行 -o
指定就可以了。
pluginGroups
如果 plugin 没有指定 groupId,会从设置的这些里查找。默认会有 org.apache.maven.plugins
和org.codehaus.mojo
。
比如,有了如下配置
<pluginGroups>
<pluginGroup>
org.mortbay.jetty
</pluginGroup>
</pluginGroups>
就可以通过 mvn jetty run
替代长命令mvn org.mortbay.jetty:jetty-maven-plugin:run
proxies
代理配置,可以配置多个,如果没有指定会使用第一个激活的配置。
可配置的属性
元素 | 类型 | 描述 |
---|---|---|
active | boolean | 是否激活,默认为 true |
protocol | String | 代理的协议,默认为 http |
username | String | 用户名 |
password | String | 密码 |
port | int | 端口号,默认 8080 |
host | String | host |
nonProxyHosts | String | 不代理的 host,用 | 分隔 |
id | String | id,默认为 default |
servers
用于认证,支持两种方式
- 密码
- privateKey
比如公司搭建了一个私服,上传和下载需要认证,就需要在这里配置。
元素 | 类型 | 描述 |
---|---|---|
username | String | 用户名 |
password | String | 密码,与 username 一起使用 |
privateKey | String | privateKey 路径 |
passphrase | String | 和 privateKey 一起使用 |
filePermissions | String | 新创建的文件权限 |
directoryPermissions | String | 新创建的文件夹的权限 |
configuration | DOM | 配置 |
id | String | id,默认 default |
id 需要与 repository/mirror 中的 id 相对应
使用密码
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
使用 privateKey
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
mirrors
仓库的镜像,如果仓库配置了镜像,就会去镜像中下载。
元素 | 类型 | 描述 |
---|---|---|
mirrorOf | String | 镜像的仓库 id,也就是说是那个仓库的镜像 |
name | String | 镜像的名字 |
url | String | 地址 |
layout | String | layout,默认 default |
mirrorOfLayouts | String | 镜像的仓库的 layout,默认值为 default,legacy |
id | String | id,默认 default |
mirrorOf
-
*
匹配所有的仓库 -
external:*
匹配所有远程仓库,使用 localhost 的除外,使用 file:// 协议的除外。也就是说,匹配所有不在本机上的远程仓库。 - 多个仓库可以使用英文逗号分隔
- 使用感叹号排除指定的仓库
举例:
repo,repo1
匹配 repo 或者 repo1
*,!repo1
匹配除了 repo1 的所有
在匹配的时候,会先找精确匹配的,如果没有用第一个匹配的。
layout
layout 在 Maven 2/ 3 中都是 default,只有在 Maven 1.x 中才是 legacy,所以也不太用管。
legacy 的目录结构
groupId
|--artifactId
|--jars
`--artifact
default 的目录结构
groupId
|--artifactId
|--version
| `---artifact
|---metadata
配置国内镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
<mirrorOf>central</mirrorOf>
</mirror>
profiles
setting 中的 profile 主要为了提供本地的路径以及定义构建中要使用到的仓库。
profile in setting VS profile in pom
setting 中的 profile 一般存放的是不太会变且不会影响构建过程的元素,对全局都影响。
pom 中的 profile 有更多的设置项,但是影响范围只有自身以及子模块。
profile 的激活方式
- 通过 setting 中的 activeProfiles 指定。
- 检测操作系统信息是否匹配。
- 检查环境变量是否匹配。
- 检测文件是否存在。
- 检测 JDK 版本是否匹配。
- 通过命令行
-P
指定。
元素 | 类型 | 描述 |
---|---|---|
activation | Activation | 激活的条件 |
properties | Properties | 配置 |
repositories | List<Repository> | 远程仓库 |
pluginRepositories | List<Repository> | 远程插件仓库 |
id | String | Id, 默认 default |
activation
profile 的激活条件,满足条件则激活。
元素 | 类型 | 描述 |
---|---|---|
activeByDefault | boolean | 是否默认激活 |
jdk | String | 如果 JDK 版本匹配则激活 |
os | ActivationOS | 如果操作系统匹配则激活 |
property | ActivationProperty | 如果系统属性匹配则激活 |
file | ActivationFile | 如果文件存在 / 不存在则激活 |
jdk
- 前缀匹配,比如 1.8 能匹配 jdk1.8.0_181
- [1.5,1.8)能匹配 1.5、1.6、1.7,语法具体可以参看 Version Range Specification
ActivationOS
元素 | 类型 | 描述 |
---|---|---|
name | String | 系统的名称 |
family | String | 系统的系列,如 windows、mac |
arch | String | Cpu 的架构 |
version | String | 系统版本 |
ActivationProperty
元素 | 类型 | 描述 |
---|---|---|
name | String | 系统属性名称 |
value | String | 系统属性值 |
ActivationFile
元素 | 类型 | 描述 |
---|---|---|
missing | String | 文件名称,当该文件不存在时激活 |
exists | String | 文件名称,当该文件存在时激活 |
repository
这里是经常需要修改的地方,公司里一般都有自己的私服,就需要把相应的仓库加进来。就是因为仓库没配置,才会有一些包下不下来。
元素 | 类型 | 描述 |
---|---|---|
releases | RepositoryPolicy | 如何下载 releases |
snapshots | RepositoryPolicy | 如何下载 snapshots |
id | String | 仓库的唯一标示 |
name | String | 仓库的名称 |
url | String | 仓库的地址 |
layout | String | layout,默认值 default |
RepositoryPolicy
元素 | 类型 | 描述 |
---|---|---|
enabled | boolean | 是否启用该仓库去下载这个类型的 artifact |
updatePolicy | String | 更新的频率,可选值 always(总是)、daily(每天,默认值)、interval:XXX(间隔多少分钟)、never(从不) |
checksumPolicy | String | 如果校验失败该如何做,可选值 fail、warn |
pluginRepository
插件仓库,配置的值和 repository 是一样的。
activeProfiles
激活的配置,可以配置多个。
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
看到了这里一定是真爱了,关注微信公众号【憨憨的春天】第一时间获取更新
参考
- maven setting 官方文档
- Maven Create Java Project – Interactive vs Non-interactive modes
- Maven settings.xml 配置解读
- Deploy an artifact in legacy layout
- Using Mirrors for Repositories
- Introduction to Build Profiles