首先需要了解的是Maven配置文件以及配置方式的分级,才能做到我们自己在日常开发配置中灵活使用。
根据Maven官方资料,Maven将配置文件分为两级:
Maven
在运行的时候会merge(合并)
用户层级和全局层级的配置。
Maven默认使用settings.xml
作为Maven的配置文件,对应的两个层级的配置文件的路径会在
用户层级
配置文件是提供给某个具体的用户,通常该配置文件路径为:
${user.home}/.m2/settings.xml
${user.home}
是指用户目录:
在Linux、Mac系统下这个路径代表~/
;在windows下是C:/Users/xxx
(xxx代表你的用户名)
如果需要指定某个配置文件,可以在运行mvn
时使用-s
传参:
-s ${path}/xxx.xml
全局层级
配置文件是给当前设备
所有用户公用的配置文件,通常该配置文件路径为:
${maven.conf}/settings.xml
${maven.conf}
是指Maven安装目录${maven.home}
下的conf
文件,在${maven.home}/bin/m2.conf
文件里面配置的。有兴趣的可以去到自己安装Maven的目录扒一扒相关的文件信息。
同样地,如果需要指定某个配置文件作为全局配置,可以在运行mvn
时使用-gs
传参:
-gs ${path}/xxx.xml
Maven的XML配置文件是以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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
.....
.....
settings>
Maven指定本地仓库路径,用localRepository
标签对:
<localRepository>/path/to/local/repolocalRepository>
没有配置的话,默认的目录是:${user.home}/.m2/repository
,也就是用户目录下的.m2
文件里面。这也是Windows朋友在C盘用户目录下为什么有个.m2
文件,而且还”那么占空间“。
就是开启mvn
执行中用户控制,当Maven在执行中需要输入一些操作指令或者一些参数时,会让用户输入。这个互动模式默认开启true
。如果设置为false
,Maven会在执行的时候采取默认值
,这些默认值可能是已经有的,可能是链式默认值。配置方式如下:
<interactiveMode>trueinteractiveMode>
默认开启的,我们就不用管了。
这个很简单明了,官方翻译吧:确定maven在执行构建时是否应尝试连接到网络,这会对构件的下载、部署和其他操作产生影响。
默认是关闭的:false
配置方式如下:
<offline>falseoffline>
如果在使用Maven时需要指定代理服务器,则通过在proxies
代理服务器列表标签对里面配置服务器
在proxy
标签对里面配置对应的服务器信息,通过active
标签对激活配置好的代理:
<proxies>
<proxy>
<id>proxy-server-1id>
<active>trueactive>
<protocol>httpprotocol>
<username>proxyuserusername>
<password>proxypasspassword>
<host>proxy.host.nethost>
<port>80port>
<nonProxyHosts>local.net|some.host.comnonProxyHosts>
proxy>
...
-->
proxies>
注:
proxies
是代理列表组,proxy
才是配置服务器,配置的内容大家都知道了吧,如果是socks5协议的就在protocol
中设为socks5。servers
标签对相信用过有分级使用权限私服的朋友都很熟悉,就是配置我们每个私服对应的账号密码
或者私钥指纹
。
特别是公司中最常见,项目组之间各自有自己的仓库,但是不想让其他项目组的人触碰到私仓,这样在账号上面就可以做操作:指定某个账号只能访问某个仓库。(当然,有的公司是公开的,匿名者账号走遍天下,内网就行了)
回归正文:在servers
列表中,我们可以根据不同的私服server
(根据id
区分)来配置每个私服的账号和密码。
这个id
是在项目的pom.xml
中distributionManagement
里面配置的私服的id
是一致的。下面举个例子:
项目的pom.xml
中使用了两个仓库,一个是snapshot的仓库(id为:cat-snapshot
),一个是releases仓库(id为:cat-release
),配置如下:pom.xml
:
<distributionManagement>
<repository>
<id>cat-releaseid>
<name>RELEASESname>
<url>http://172.10.0.100:8081/repository/cat-releases/url>
repository>
<snapshotRepository>
<id>cat-snapshotid>
<name>SNAPSHOTname>
<url>http://172.10.0.100:8081/repository/cat-snapshot/url>
snapshotRepository>
distributionManagement>
其中:
id
是指上面配置仓库的ID,和下面指定的账号密码中的id
一一对应name
是指仓库的名称url
本地公仓的地址在Maven配置文件中,配上对应的账号:settings.xml
:
<servers>
<server>
<id>cat-releaseid>
<username>laomaousername>
<password>123456password>
server>
<server>
<id>cat-snapshotid>
<username>laomaousername>
<password>123456password>
server>
...
servers>
其中:
id
是指仓库的ID,这里和上面pom.xml
配置的是一样的username
是用户名password
是密码注意看id
标签中的字符串是一一对应的,这个是指明了私服的账号,我这里私服中laomao
账号都给了访问操作两个仓的权限,如果要灵活配置,自己可以去Nexus中配置不同账号访问不同的仓库来试试。
没有权限的话,在打包发布到私仓的时候,会提示
code 401
,权限不足,或者Access Denied
,拒绝访问。
出现这个问题的时候,排查方法如下:
- 首先要确定
id
是否对应;- 然后检查
账号密码
是否错误;- 最后去检查私服中是否给对应的账号配置了对应私仓的权限。
首先,我想说下我对Maven镜像
的理解:镜像是指目标仓库
的镜像
、备用库
、copy
。配置了镜像之后,Maven会从“备用仓库”里面获取依赖,而不是目标仓库。
Maven镜像
是在mirrors
(镜像列表)中配置的,下面以阿里仓库作为中央仓库的镜像
为例:
<mirrors>
<mirror>
<id>aliid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
...
mirrors>
其中:
id
是这个镜像的ID,全局唯一不能重复。name
是这个镜像的名称。url
是镜像地址,指定了从哪个地址中获取依赖。mirroOf
是指这个镜像对哪个库生效。在上面的配置中,配置了阿里仓库作为Maven中央仓库(central)的镜像
,获取依赖时,maven选择的是这个阿里仓库的镜像地址(上面配置的url
)去获取依赖,而不是Maven官方的仓库地址。
也就是说,镜像是项目中目标仓库的备用路线,用mirrorOf
标签对来指定这个镜像对应是哪个仓库,上面指定的central
,是Maven官方给出的默认中央仓库的ID。如果mirrorOf
中给出的是*
,那就是匹配所有的仓库。
按照翻译来说profile
中文是总则
,profile
可以让我们定义一系列的配置信息,包含在profiles
配置列表标签对中,每个profile配置都可以通过activeProfile
或命令行
或者activeByDefault
来激活,达到在不同的环境
下自由切换配置的目的,激活的会在下面说明,先看看profile
的配置。
profile
可以在settings.xml
中配置,也可以在pom.xml
文件中配置。
注意:profile
一定要给定一个全局唯一的ID,不能冲突
settings.xml
中配置profile
下面给出一个配置在settings.xml
中profile
的例子:
<profile>
<id>jdk-1.8id>
<activation>
<jdk>1.8jdk>
activation>
<properties>
...
properties>
<repositories>
<repository>
<id>jdk18id>
<name>Repository for JDK 1.8 buildsname>
<url>http://....url>
<layout>defaultlayout>
<snapshotPolicy>alwayssnapshotPolicy>
repository>
repositories>
<pluginRepositories>
...
pluginRepositories>
profile>
可以看到,配置在settings.xml
中的文件并不多,主要是用于指定某个依赖仓库或者插件仓库。
其中:
activation
是指激活条件,上面的例子是在jdk 1.8的环境下就会被激活。activation
可以不写。
pom.xml
中的profile
而配置在pom.xml
文件中的profile
可配置项则多很多。
下面给出一个配置在pom.xml
中profile
配置的例子:
<project>
<profiles>
<profile>
<id>xxxxid>
<build>
<defaultGoal>...defaultGoal>
<finalName>...finalName>
<resources>...resources>
<testResources>...testResources>
<plugins>...plugins>
build>
<reporting>...reporting>
<modules>...modules>
<dependencies>...dependencies>
<dependencyManagement>...dependencyManagement>
<distributionManagement>...distributionManagement>
<repositories>...repositories>
<pluginRepositories>...pluginRepositories>
<properties>...properties>
profile>
profiles>
project>
profile
的位置选择关于profile
配置的位置,下面给点建议:
pom.xml
文件中配置.m2
文件夹下(Windows、Linux、Mac的Maven用户目录位置在一开始有说)${maven.home}
、${m2.home}
再次注意:profile
一定要给定一个全局唯一的ID,不能冲突
properties
属性的覆盖在profile
中可以定义
属性列表,如果两个属性列表中都有相同的key
,如:
<profile>
<id>profile-ID-1id>
...
<properties>
<env>testenv>
properties>
...
profile>
<profile>
<id>profile-ID-2id>
...
<properties>
<env>devenv>
properties>
...
profile>
上面两个profile中都定义了env
属性,如果都没被激活或激活某一个profile的话,是没问题的。如果两个profile都被激活,那么会根据profile在配置文件中定义的位置,后面的属性会覆盖前面的属性。
profile
的方式上面说了,profile
在配置之后并不是直接生效的,需要通过activeProfile
或命令行
或者activeByDefault
来激活。
settings.xml
通过activeProfile
激活profile
在settings.xml
配置文件activeProfiles
列表里通过activeProfile
方式激活profile
,可以激活一个或多个profile
。
下面给出在settings.xml
中同时激活两个profile
的配置:
<activeProfiles>
<activeProfile>profile-ID-1activeProfile>
<activeProfile>profile-ID-2activeProfile>
activeProfiles>
注意:关于两个profile中定义相同的properties
属性的情况上面有说明
activeByDefault
激活activeByDefault
是配置在profile
中activation
标签对中的,上面有说了,activation
是激活条件,可以在某个环境的时候触发激活该profile
。而activeByDefault
是在默认的状态下激活profile:
<profiles>
<profile>
...
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
<profile>
...
profile>
profiles>
当为activeByDefault
的值true
的时候,表示在没有指定激活其他profile
的时候,这个profile
会默认被激活。如果有其他profile
被指定激活之后,这个profile
将不会被激活。
profile
激活状态为什么说是管理,因为bash命令行可以激活,也可以取消激活某个profile
。
需要激活某个profile
,在mvn
命令中,使用参数-P
来指定要激活的profile
:
mvn -P <profileID>
如,激活ID为profile-ID-2
的profile
:
mvn -P profile-ID-2
当某个profile
在activeProfile
、activeByDefault
中被激活了,在某次mvn运行中并不需要使用该profile,但是又不想改配置那么麻烦(cd来cd去的确实很麻烦)。
可以通过命令行取消使用某个profile,用!
即可达到目的:
mvn -P !<profileID>
如,在某次mvn
命令中取消使用ID为profile-ID-2
的profile
:
mvn -P !profile-ID-2
pluginGroup
pluginGroup
并不熟悉,后面用上了会补。
profile
指令之前我写了一篇文章,是关于Maven查看当前生效配置、pom、环境变量及指定使用配置文件执行命令的,会一直更新,为了一致性这里就不复述了:
简书:https://www.jianshu.com/p/6184fa25fd53
CSDN:https://blog.csdn.net/nthack5730/article/details/82385124
此文同时在简书发布:https://www.jianshu.com/p/32f348dbf3d4
此文同时在CSDN发布:https://blog.csdn.net/nthack5730/article/details/84590027
转载要加原文链接!谢谢支持!