1

1. maven聚合

1.1 为什么使用聚合?

假设一个项目包含两个模块,我们想要一次构建两个模块,而不是到两个模块的目录下分别执行mvn命令,这时就需要用到聚合。

1.2 聚合配置

  1. 聚合模块pom配置

    • 聚合模块packaging类型为 pom
    • 聚合模块包含 modules元素,每个module对应一个要被聚合的子模块。
    • module的值是当前pom的相对目录。
    • 具体配置

      <modules>
          <module>模块1</module>
          <module>模块2</module>
          <module>模块3</module>
      </modules>
  2. 聚合模块相对位置

    • 通常将聚合模块放在项目目录的最顶层,其他模块作为聚合模块的子目录。
  3. 聚合模块意义

    • 聚合模块仅仅是帮助聚合其他模块构建的工具,本身并无实质内容。
    • 解决同时构建多个模块的问题。
  4. 聚合模块构建

    • maven首先会解析聚合模块的pom,分析要构建的模块,并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次构建各个模块。

2. maven继承

2.1 为什么使用继承?

解决重复配置问题。

2.2 继承配置

  1. 项目继承的配置

    • 父模块的packaging类型为pom
    • 子模块需要配置project -> parent元素信息

      • 父模块坐标配置,groupId:artifactId:version
      • relativePath: 父模块pom文件所在路径,默认父pom在上一层目录下(即 ../pom.xml)。
      • 构建过程中,maven会根据relativePath检查父pom,如果找不到,再从本地仓库查找。
    • 子模块继承父模块的配置

      <parent>
          <groupId>父构件groupId</groupId>
          <artifactId>父构件artifactId</artifactId>
          <version>父构件的版本号</version>
          <relativePath>父构件pom.xml路径</relativePath>
      </parent>
  2. 可继承的pom元素

    • groupId:项目组ID,项目坐标的核心元素。
    • version:项目版本,项目坐标的核心元素。
    • description:项目的描述信息。
    • organization:项目的组织信息。
    • inceptionYear:项目的创始年份。
    • url:项目的url地址。
    • developers:项目的开发者信息。
    • contributors:项目的贡献者信息。
    • distributionManagement:项目的部署配置信息。
    • issueManagement:项目的缺陷跟踪系统信息。
    • ciManagement:项目的持续集成系统信息。
    • scm:项目的版本控制系统信息。
    • mailingLists:项目的邮件列表信息。
    • properties:自定义的maven属性配置信息。
    • dependencyManagement:项目的依赖管理配置。
    • repositories:项目的仓库配置。
    • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等信息。
    • reporting:包括项目的报告输出目录配置、报告插件配置等信息。
  3. 依赖管理

    • maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性.
    • dependencyManagement元素下的依赖声明不会引入实际的依赖,但是它能约束对dependencies下的依赖使用。
    • import依赖范围:

      • 将目标pom中dependencyManagement配置导入,并合并到当前项目的dependencyManagement元素中。
      • 不想使用继承的方式,来达到使用目标pom中的依赖的目的。
      • import依赖范围一般都指向打包类型为pom的模块。

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>targetGroupId</groupId>
                    <artifactId>targetArtifactId</artifactId>
                    <version>targetVersion</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>构件1</dependency>
                <dependency>构件2</dependency>
            </dependencies>
        </dependencyManagement>
  4. 插件管理

    • maven中提供了dependencyManagement来帮助管理依赖继承,也提供了pluginManagement元素帮助管理插件继承。
    • 在父模块pom中该元素的配置不会造成实际的插件调用行为,只有在子pom.xml中配置plugins -> plugin元素声明该插件的时候,插件才会起效。
    • 子pom插件中只需要写groupId、artifactId,其他信息都可以从父pom中传递过来。
    • 举例,使用maven-source-plugin插件生成项目源码包,将该插件的jar-no-fork目标绑定到default生命周期的verify阶段。

      • 父pom插件管理配置

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.2.1</version>
                        <executions>
                            <execution>
                                <id>attach-source</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
      • 子pom插件声明配置

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

3. 聚合与继承

  1. 目的

    • 聚合主要是为了方便快速构建多模块项目。
    • 继承主要是为了消除重复配置。
  2. 与其他模块关系

    • 对于聚合模块来说,聚合模块知道有哪些被聚合的模块,而被聚合模块不知道聚合模块的存在。
    • 对于继承来说,父模块是不知道有哪些子模块继承它,而子模块需要使用parent来引用父模块。
  3. 共同点

    • 聚合模块和继承中的父模块的packaging属性都必须是pom类型的。
    • 同时,聚合模块和父模块除了pom.xml,一般都没有实际内容。
  4. 实际使用

    • 将聚合和继承一起使用,能同时使用到两者的优点。

4. 反应堆

4.1 介绍

  1. 反应堆

    • 多模块的maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构
  2. 单模块项目的反应堆

    • 就是该模块本身。
  3. 多模块项目的反应堆

    • 包含模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。

4.2 反应堆构建顺序

  • maven按聚合配置中的顺序读取pom。
  • 如果该pom没有依赖模块,那么就构建该模块,否则就先构建其依赖的模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。

4.3 裁剪反应堆

  1. 说明

    • 一般情况下,用户会选择构建整个项目或者选择构建单个模块。
    • 如果想要仅仅构建完整反应堆中的某些模块,就需要实时的裁剪反应堆
  2. 裁剪反应堆选项

    • 执行mvn -h可以看到裁剪反应堆的选项。
    • -am:--also-make, 同时构建所列模块的依赖模块。
    • -amd:-also-make-dependencies,同时构建依赖于所列模块的模块。
    • -pl:--projects <arg>,构建指定的模块,模块之间使用逗号分隔
    • -rf:-resume-from <arg>,从指定的模块继续反应堆

John
10 声望2 粉丝

好记性不如烂笔头。


引用和评论

0 条评论