zoukankan      html  css  js  c++  java
  • 笔记: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>

       

  • 相关阅读:
    android 多线程
    Uva 10881 Piotr’s Ants 蚂蚁
    LA 3708 Graveyard 墓地雕塑 NEERC 2006
    UVa 11300 Spreading the Wealth 分金币
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    HDU 4162 Shape Number
    HDU 1869 六度分离
    HDU 1041 Computer Transformation
    利用可变参数函数清空多个数组
  • 原文地址:https://www.cnblogs.com/li3807/p/6416223.html
Copyright © 2011-2022 走看看