这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
使用 Maven 时,最绕不开的文件一个是 pom.xml,另一个就是配置文件 setting.xml。
1. Maven 配置
Maven 属性可以在不止一处配置,有全局配置、用户配置、项目配置三种。
- 全局配置,指 Maven 安装目录下的
/conf/settings.xml文件,其中定义了系统中 Maven 的默认全局参数配置 - 用户配置,指系统中当前登录用户的配置信息,该配置文件是系统用户目录下的
/{user.home}/.m2/settings.xml - 项目配置,指编译器中对应项目下的
pom.xml文件,其中可以对项目使用的 Maven 参数做定义配置 项目执行时,环境配置的选择优先级为 项目配置 > 用户配置 > 全局配置。
2. settings.xml 文件
settings.xml 配置文件中可以使用成对的标签来配置 Maven 相关参数,并在项目没有指定其他参数时发挥作用,主要有 proxy、server、respository、mirror 等标签,其中每个标签的功能如下:
- respository 是 Maven 用于下载 jar 包的仓库地址
- mirror用来配置镜像资源替代无法访问或下载速度慢的仓库地址
- proxy 用来配置本地 Maven 不能访问外网时设置的代理服务,不常用
- server 用来配置 Maven 项目中打 jar 包并上传至 maven 私服时的鉴权信息,如 id 和密码
2.1 localRepository 标签
<localRepository> 标签可以用于设置 Maven 本地仓库的地址,在引入新的依赖时将远程依赖下载到该路径文件夹中。
settings.xml 中的 <localRepository> 标签默认是不启用的,此时依赖包会下载到用户的 .m2/ 文件夹中,可以去掉注释并自定义路径。
<localRepository>D:\maven\repository</localRepository>
2.2 repositories 标签
repositories 标签用来设置依赖 Jar 包下载时使用的远程仓库信息,其中可以通过定义 repository 标签来设置具体仓库内容。
- id,定义远程仓库唯一标识
- name,定义远程仓库名称
- url,远程仓库的地址信息
- releases,定义处理远程仓库发布版本的下载逻辑
- snapshots,与releases并列的配置
2.3 mirrors 标签
2.3.1 使用定义
mirrors 标签用于管理多个 mirror 标签,而每个 mirror 标签中可以配置一个镜像实例,表示使用一个远程仓库来代替另外指定的 Maven 仓库。
<!-- 表示使用aliyun镜像来替代官方central仓库 -->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
对于 mirror 标签中的属性,有:
- id,镜像的唯一标识
- name,镜像名称
- url,指使用镜像的仓库地址
- mirrorOf,镜像匹配规则,即在何种情形下会使用该配置镜像
- 如果值为仓库名,如 central,则表示在 Maven 去 central 仓库查询时,转成使用阿里云镜像获取
- 可以使用逗号,来间隔匹配多个仓库
- 使用
*代表匹配所有情况,即所有仓库的请求都会到 aliyun 仓库获取依赖
2.3.2 作用顺序
- 尽管 mirrors 标签中可以配置多个子节点,但是只有其中第一个节点生效,当前一个 mirror 无法连接的时候,才会去找后一个
- 配置多个 mirror 镜像时,下载依赖 Jar 包只会找其中一个,如果在第一个仓库中没有找到,则会报错找不到Jar包
- 如果多个镜像的 mirrorOf 值相同,则选择第一个镜像访问,如果不同,则精准匹配优先于
*通配符匹配 - mirror 标签可以配合 maven 的 profiles 标签,根据不同的配置来启动不同镜像仓库,改变环境以实现 Jar 包下载
实际使用时,如果 respository 和 mirror 配置同时存在,则生效顺序规则为:
- 如果没有配置 respository 和 mirror 内容,Maven 初始化时有默认的仓库配置,即中央仓库 central
- 如果配置的 mirror 标签中的 mirrorOf 值与 respositoryId 相同,则意味着使用镜像地址来代替仓库地址
- Maven 在加载仓库地址时会去遍历 mirror 配置,是否有指向该仓库地址的镜像,有则替换
- 如果 mirrorOf 为 central,Maven 默认的中央仓库被替换为 mirror 指向的地址
- mirrorOf 等于
*的时候覆盖所有 repository 配置,即所有 Jar 包依赖都会到镜像地址下载
2.3.3 依赖包下载流程
- 本地仓库查找,找不到则走下一步
- 去仓库地址查找,此时会判断是否有 mirrorOf 为
*的镜像,有则到镜像地址下载,否则走下一步 - 判断是否有私服配置,settings.xml 和 pom.xml 中可以配置私服地址,先全局后项目独有,否则走下一步
- 去到中央仓库下载,如果中央仓库有镜像配置,则走镜像地址下载,如果没有则报错找不到依赖
2.4 profiles 标签
一个 profile 可以覆盖项目构件的最终名称,项目依赖,插件配置以影响构建行为,profile 还可以覆盖分发配置。
profiles 标签中可以定义多个 profile 标签,而每个 profile 标签可以定义一个环境配置信息,并为每个 profile 配置对应的激活条件,在使用时可以通过条件来激活并使用需要的环境配置。
2.4.1 不同位置的 profile
与 Maven 的配置文件相同, profile 标签也可以定义在不同位置,并产生不同的作用范围
- 如果在 pom.xml 中配置 profile,则该配置只针对当前项目
- 如果在用户目录下
.m2/中的 settings.xml 中配置 profile,则该配置针对当前系统用户有效 - 如果是在 maven 安装目录下的
/conf/settings.xml中配置 profile,则该配置是全局生效的
2.4.2 profile 中可以配置的内容
- 在settings.xml中配置的 profile 因为是全局的,针对多个项目,则使用时可以配置的内容是有限的,如 respositories 标签、pluginRepositories 标签、 properties 标签。
- 而在pom.xml中定义的 profile 可以配置更多的内容,除了以上三种标签外,还有 dependencies、plugin、dependencyManagement、distributionManagement、以及 build 标签下的子标签 defaultGoal、resources、testResources、finalName 等。
2.4.3 自定义激活 profile 配置
Maven 中可以使用命令 mvn help:active-profiles 查看当前激活的 profile 配置,并可以根据需要来自定义激活 profile 配置。
- 定义 profile 时设置默认激活:
<!--true表示设置当前profile为默认激活,即其他没有激活时使用该profile-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
- 还可以根据配置条件激活,如根据 jdk 版本激活配置
<profiles>
<profile>
<id>profile_id</id>
<!--定义属性,可以在pom.xml中根据标签名变量使用属性值-->
<properties>
<hello>world</hello>
</properties>
<!--jdk1.5时激活当前profile-->
<jdk>1.5</jdk>
</profile>
</profiles>
- settings.xml 文件中使用 activeProfiles 指定激活 如果指定多个 profile,会按照 profile 的定义顺序(不是激活顺序)使用最后一个
<activeProfiles>
<activeProdile>profile1_id</activeProdile>
<activeProdile>profile2_id</activeProdile>
</activeProfiles>
- 使用 mvn 命令
mvn package -P [profile_id],根据指定的 id 来激活 profile 配置- 如果在配置文件中激活了,则可以使用命令
mvn package -P ![profile_id]取消激活