Maven学习(三):配置

728 阅读6分钟

这是我参与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 作用顺序

  1. 尽管 mirrors 标签中可以配置多个子节点,但是只有其中第一个节点生效,当前一个 mirror 无法连接的时候,才会去找后一个
  2. 配置多个 mirror 镜像时,下载依赖 Jar 包只会找其中一个,如果在第一个仓库中没有找到,则会报错找不到Jar包
  3. 如果多个镜像的 mirrorOf 值相同,则选择第一个镜像访问,如果不同,则精准匹配优先于 * 通配符匹配
  4. 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 依赖包下载流程

  1. 本地仓库查找,找不到则走下一步
  2. 去仓库地址查找,此时会判断是否有 mirrorOf 为 * 的镜像,有则到镜像地址下载,否则走下一步
  3. 判断是否有私服配置,settings.xml 和 pom.xml 中可以配置私服地址,先全局后项目独有,否则走下一步
  4. 去到中央仓库下载,如果中央仓库有镜像配置,则走镜像地址下载,如果没有则报错找不到依赖

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 配置。

  1. 定义 profile 时设置默认激活:
<!--true表示设置当前profile为默认激活,即其他没有激活时使用该profile-->
<activation>
    <activeByDefault>true</activeByDefault>
</activation>
  1. 还可以根据配置条件激活,如根据 jdk 版本激活配置
<profiles>
	<profile>
    	<id>profile_id</id>
        <!--定义属性,可以在pom.xml中根据标签名变量使用属性值-->
        <properties>
            <hello>world</hello>
        </properties>
        <!--jdk1.5时激活当前profile-->
        <jdk>1.5</jdk>
    </profile>
</profiles>
  1. settings.xml 文件中使用 activeProfiles 指定激活 如果指定多个 profile,会按照 profile 的定义顺序(不是激活顺序)使用最后一个
<activeProfiles>
    <activeProdile>profile1_id</activeProdile>
    <activeProdile>profile2_id</activeProdile>
</activeProfiles>
  1. 使用 mvn 命令
  • mvn package -P [profile_id],根据指定的 id 来激活 profile 配置
  • 如果在配置文件中激活了,则可以使用命令mvn package -P ![profile_id] 取消激活