乐趣区

maven-setting-配置详解

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.pluginsorg.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
退出移动版