• 笔记:Maven 聚合和继承


    1. 聚合模块

      我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并且该模块可以为其他模块的父目录,也可以是平级目录,首先目录结构如下:

    • account-aggregator(聚合模块目录)
      • pom.xml
      • account-email(email模块)
        • src
        • pom.xml
      • account-service(service模块)
        • src
        • pom.xml

    account-aggregator 模块的 POM 文件配置如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>

       

        <groupId>org.drsoft.account</groupId>

        <artifactId>account-aggregator</artifactId>

        <version>1.0-SNAPSHOT</version>

        <!-- 聚合和父POM模块必须为 pom -->

        <packaging>pom</packaging>

          

        <!-- 配置需要聚合的模块的相对目录 -->

        <modules>

            <module>account-email</module>

            <module>account-service</module>

        </modules>

    </project>

       

    此时,在account-aggregator目录下执行 Maven 命令,就会同时构建在 modules 中的模块,示例命令:

    mvn clean

    命令结果:

    1. 继承模块

      面向对象设计中,程序员可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以做到一处声明多处使用,类似的,我们也可以创建POM的父子结构,在父POM中声明一些配置供子POM继承,我们继续以聚合中的模块来说明,其account-aggregator模块POM不变,我们看子POM的account-service配置示例:

      <?xml version="1.0"?>

      <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

          <modelVersion>4.0.0</modelVersion>

          <!-- groupId 和 version 一致,因此从父 POM 继承 -->

          <artifactId>account-service</artifactId>

          <name>account-service</name>

          <url>http://maven.apache.org</url>

          <!-- 父POM配置 -->

          <parent>

              <!-- 父POM的项目组 -->

              <groupId>org.drsoft.account</groupId>

              <!-- 父POM的项目唯一标识 -->

              <artifactId>account-aggregator</artifactId>

              <!-- 父POM的版本 -->

              <version>1.0-SNAPSHOT</version>

              <!-- 父POM的文件相对路径,默认值:../pom.xml

      (可选,如果设置了将首先根据该属性找父POM,找不到则从本地仓库查找)

      -->

              <relativePath>../pom.xml</relativePath>

          </parent>

      </project>

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

      我们可以看到 dependencies元素是可以被继承的,因此在父POM中声明的依赖都会被继承到子POM中,但还存在一个问题,我们无法确认将来添加的子模块一定需要目前所有的依赖项,可能只是简单的 util 工具模块,Maven 还提供了 dependencyManagement 元素既能让子元素模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,在 dependencyManagement 元素下的依赖声明不会不会引入实际的依赖,不过他能约束dependencies下的依赖使用,配置示例如下:

      • account-aggregator 模块的 POM 文件配置如下:

        <?xml version="1.0" encoding="UTF-8"?>

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

            <modelVersion>4.0.0</modelVersion>

            <groupId>org.drsoft.account</groupId>

            <artifactId>account-aggregator</artifactId>

            <version>1.0-SNAPSHOT</version>

            <packaging>pom</packaging>

            <name>account-aggregator</name>

            <url>http://maven.apache.org</url>

            <!-- 聚合模块 -->

            <modules>

                <module>account-email</module>

                <module>account-service</module>

            </modules>

            <!-- 实际依赖 -->

            <dependencies>

                <dependency>

                    <groupId>junit</groupId>

                    <artifactId>junit</artifactId>

                    <version>3.8.1</version>

                    <scope>test</scope>

                </dependency>

            </dependencies>

            <!-- 声明依赖,但不会实际依赖 -->

            <dependencyManagement>

                <dependencies>

                    <dependency>

                        <groupId>org.springframework</groupId>

                        <artifactId>spring-context</artifactId>

                        <version>4.3.6.RELEASE</version>

                    </dependency>

                </dependencies>

            </dependencyManagement>

        </project>

        查询 account-aggregate 依赖,命令如下:

        mvn dependency:tree

        命令结果:

        根据依赖显示结果,发现其依赖关系中只有 junit,没有 org.springframework

      • account-service子POM的配置示例:

        <?xml version="1.0"?>

        <project

            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

            xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

            <modelVersion>4.0.0</modelVersion>

            <artifactId>account-email</artifactId>

            <name>account-email</name>

            <url>http://maven.apache.org</url>

            <!-- 父POM配置 -->

            <parent>

                <!-- 父POM的项目组 -->

                <groupId>org.drsoft.account</groupId>

                <!-- 父POM的项目唯一标识 -->

                <artifactId>account-aggregator</artifactId>

                <!-- 父POM的版本 -->

                <version>1.0-SNAPSHOT</version>

                <!-- 父POM的文件相对路径 -->

                <relativePath>../pom.xml</relativePath>

            </parent>

            <!-- 依赖配置,依赖信息从父POM 的 dependencyManagement 内的依赖,

                 因此只需要 groupId 和 artifactId -->

            <dependencies>

                <dependency>

                    <groupId>org.springframework</groupId>

                    <artifactId>spring-context</artifactId>

                </dependency>

            </dependencies>

        </project>

        查询account-email的依赖,命令如下:

        mvn dependency:tree

        命令结果:

        可以看到继承到了父POM的 junit依赖,和设置的 org.springframework 依赖

    1. 插件管理

      Maven 提供了 pluginManagement 元素帮助管理插件,该元素中配置的依赖不会造成实际的插件调用行为,但POM中配置了真正的plugins元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,才会影响实际的插件行为。

    • account-aggregate 的POM配置:

      <?xml version="1.0" encoding="UTF-8"?>

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

          <modelVersion>4.0.0</modelVersion>

          <groupId>org.drsoft.account</groupId>

          <artifactId>account-aggregator</artifactId>

          <version>1.0-SNAPSHOT</version>

          <packaging>pom</packaging>

          <name>account-aggregator</name>

          <url>http://maven.apache.org</url>

          <!-- 聚合模块 -->

          <modules>

              <module>account-email</module>

              <module>account-service</module>

          </modules>

          <build>

              <!-- 插件管理-->

              <pluginManagement>

                  <plugins>

                      <plugin>

                          <groupId>org.apache.maven.plugins</groupId>

                          <artifactId>maven-source-plugin</artifactId>

                          <version>3.0.1</version>

                          <executions>

                              <execution>

                                  <phase>verify</phase>

                                  <goals>

                                      <goal>jar-no-fork</goal>

                                  </goals>

                              </execution>

                          </executions>

                      </plugin>

                  </plugins>

              </pluginManagement>

          </build>

      </project>

    • account-service子POM配置:

      <?xml version="1.0"?>

      <project

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

          xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

          <modelVersion>4.0.0</modelVersion>

          <artifactId>account-service</artifactId>

          <name>account-service</name>

          <url>http://maven.apache.org</url>

          <!-- 父POM配置 -->

          <parent>

              <!-- 父POM的项目组 -->

              <groupId>org.drsoft.account</groupId>

              <!-- 父POM的项目唯一标识 -->

              <artifactId>account-aggregator</artifactId>

              <!-- 父POM的版本 -->

              <version>1.0-SNAPSHOT</version>

              <!-- 父POM的文件相对路径 -->

              <relativePath>../pom.xml</relativePath>

          </parent>

          <build>

              <!-- 子POM定义使用插件,只需要 groupId 和 artifactId

                   其他由父POM的 pluginManagement 一定 -->

              <plugins>

                  <plugin>

                      <groupId>org.apache.maven.plugins</groupId>

                      <artifactId>maven-source-plugin</artifactId>

                  </plugin>

              </plugins>

          </build>

      </project>

       

  • 相关阅读:
    推荐]历史上最强的绕口令
    超级经理人的关系学:打造黄金人脉
    个人创业的难点和解决之道
    你的人脉关系中不可缺少的十种人[推荐]
    哲理短文一则:揭示最好的成功法则
    [经验交流]太精彩,太有启发性了(经典经典) 转
    权力领域是人才浪费的致命区域
    2006创业完全手册
    爱你我的宝贝(转)
    最远的你是我最近的爱
  • 原文地址:https://www.cnblogs.com/li3807/p/6416223.html
Copyright © 2020-2023  润新知