一篇明白:Maven 的 settings.xml 配置
综述
我们使用Maven有各种不同的具体形式,如:
- 直接在命令行终端使用Maven
- Windows的cmd、powershell命令行;
- MacOS的Terminal终端或者其他第三方的命令行终端;
- 也包括Linux中使用命令行
- IDE工具,如IDEA 里使用,其中又可以细分为
- 直接图形化操作 (附录里会详细讲这几种是什么意思)
- 图形化操作定义自己的命令
- 在 IDEA 中的 Terminal 中使用mvn
无论哪种形式,Maven最终生效的配置都是由 全局配置
和 用户配置
合成的(用户配置
在本文也称为局部配置
)。
合并全局和局部配置的规则是:存在冲突的,局部配置覆盖全局配置,不存在冲突的两者兼而有之。全局配置或局部配置的文件都可以不存在,甚至两者都可以不存在。两者都不存在的时候,有个默认配置,仓库位置在 ~/.m2/repository
,除此外没有任何其他配。
注:不同的使用Maven的方式,对于全局配置和局部配置的解释是不同的,下文会提到
详解
1、命令行中使用 Maven
在命令行中使用 mvn
命令,如 mvn clean package
,全局配置和局部配置分别是指
-
全局配置文件在
$M2_HOME/conf/settings.xml
(文件名就必须是 settings.xml 而不能是其他) -
用户配置文件在
~/.m2/settings.xml
(文件名就必须是 settings.xml 而不能是其他)
如果全局配置文件不存在,则使用局部的,如果局部配置文件不存在,则使用全局的,如果两个配置文件都不存在也是有一个默认配置的,这个配置非常简单:仓库位置在 ~/.m2/repository
,除此外没有任何其他配。详细的内容可以参
思考:如果配置了$M2_HOME,使用的全局配置是依据这个环境变量来的,如果没有配置该环境变量,那全局配置在哪个地方? 我没试验过,下面是我的猜测:不配置该环境变量,应该是依据
mvn
这个命令文件的位置来的,比如 …/conf/settings.xml(mvn在bin/里,在上一层的conf/目录下)
2、IDEA 中使用Maven
在 IDEA 中使用Maven,通常有3种形式
- 直接图形化操作
- 图形化操作定义自己的命令
- 在 IDEA 中的 Terminal 中使用mvn
对于3
其中3和直接在 “操作系统的命令行工具执行Maven” 的一样的,其全局和局部配置也在那两个位置。
对于1和2
对于1、2是一样的,全局配置和局部配置都决定于配置(Preferences->Budid,Execution,Deployment->Build Tools->Maven
),如图
思考:如果我不配置
Maven home directory
,那全局配置是什么? 答:不配有IDEA默认内置的maven,里面就有conf/settings.xml。那如果我不配置User settings file
呢? 答:那应该就不存在用户配置,不存在也是可以的,不是必须配置的。
附录
1、如何查看当前生效的是什么settings?
mvn help:effective-settings
注意结果并不是列出某某路径下的settings.xml正在生效,而仅仅列出所生效的settings配置的内容。这个内容也不是读取settings.xml原样输出(会丢弃你的注释信息)。其实输出的内容就是maven读取全局和局部的配置,合并结果,地到一颗配置树,输出的内容就是这颗配置树。
注:执行这个命令是需要下载依赖jar的。
2、没有全局配置&用户配置
若不存在全局配置文件,也不存在用户配置文件,执行
mvn help:effective-settings
,可以看到路径是/Users/stonewang/.m2/repository,即 ~/.m2/repository
Stone-MacBookPro15:docker-hello stonewang$ mvn help:effective-settings
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.wyf.test:docker-hello >----------------------
[INFO] Building docker-hello 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-help-plugin:3.2.0:effective-settings (default-cli) @ docker-hello ---
[INFO]
Effective user-specific configuration settings:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== -->
<!-- -->
<!-- Generated by Maven Help Plugin on 2020-09-01T17:47:22+08:00 -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/ -->
<!-- -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!-- -->
<!-- Effective Settings for 'stonewang' on 'Stone-MacBookPro15.local' -->
<!-- -->
<!-- ====================================================================== -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
<localRepository>/Users/stonewang/.m2/repository</localRepository>
<pluginGroups>
<pluginGroup>org.apache.maven.plugins</pluginGroup>
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
</settings>
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.897 s
[INFO] Finished at: 2020-09-01T17:47:27+08:00
[INFO] ------------------------------------------------------------------------
3、查看日志
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.36/tomcat-embed-websocket-9.0.36.pom (0 B at 0 B/s)
这里这个Downloaded from central
中的 central
是指中央仓库,如果配置了阿里的镜像,这个词会换成对应的id,如 alimaven
。另外 0 B at 0 B/s
估计就是已经下载过了此次并未下载。
Downloaded from alimaven: http://maven.aliyun.com/nexus/content/groups/public/org/apache/commons/commons-exec/1.3/commons-exec-1.3.pom (11 kB at 8.6 kB/s)
阿里镜像配置
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
4、前文提到的IDEA里使用Maven的几种方式
-
直接图形化操作:即直接使用Lifecycle里的
-
图形化操作定义自己的命令:即定义自己的mvn命令并执行
-
在 IDEA 中的 Terminal 中使用mvn:即打开Terminal并输入mvn命令