Maven的继承与聚合

maven的继承

  继承和聚合有相似的地方,继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件,父模块的打包方式必须为pom,否则无法构建项目。父模块和聚合模块经常可以做到合二为一。

如何配置继承:

  • 1.说到继承肯定是一个父子结构,我们先创建一个父工程
  • 2.<packaging>: 作为父模块的POM,其打包类型也必须为POM
  • 3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
  • 4.新的元素:<parent> , 它是被用在子模块中的
  • 5.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
  • 6.relativePath的默认值: ../pom.xml
  • 7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素.

可被继承的POM元素:

groupId:项目组ID,项目坐标的核心元素

version: 项目版本, 项目坐标的核心元素

description: 项目的描述信息

organization: 项目的组织信息

inceptionYear: 项目的创始年份

url: 项目的URL地址

developers: 项目开发者信息

contributors: 项目的贡献者信息

distributionManagement: 项目的部署配置

issueManagement: 项目的缺陷跟踪系统信息

ciManagement: 项目的持续集成系统信息

scm: 项目的版本控制系统信息

mailingLists: 项目的邮件列表信息

properties: 自定义的maven属性

dependencies: 项目的依赖配置

dependencyManagement: 项目的依赖管理配置

repositories: 项目的仓库配置

build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

reporting: 包括项目的报告输出目录配置、报告插件配置等

dependencyManagement属性

  我们知道dependencies是可以被继承的,这个时候我们就想到让我们的发生了共用的依赖元素转移到parent中,这样我们又进一步的优化了配置。

可是问题也随之而来,如果有一天我创建了一个新的模块,但是这个模块不需要这些parent的依赖,这时候如何处理?

  dependencyManagement也是可以被继承的,这恰恰满足了我们的需要,

它既能够让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性

  特性:在dependencyManagement中配置的元素既不会给parent引入依赖,也不会给它的子模块引入依赖,仅仅是它的配置是可继承的.

创建一个父级项目:

 父级项目的pom.xml

<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>com.zl</groupId>
    <artifactId>book-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 项目的设置 -->
    <properties>
        <!-- 编码的处理 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 定义版本 -->
        <mybatis.version>3.4.5</mybatis.version>
        <oracle.version>10.2.0.5.0</oracle.version>
    </properties>

    <!-- 子项目继承依赖的配置,子项目根据实际需求,添加需要的依赖 -->
    <dependencyManagement>
        <!-- 添加mybatis的依赖 -->
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- 添加oracle的依赖 -->
            <dependency>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc14</artifactId>
                <version>${oracle.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <!-- 更改jdk版本: 使用插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
        <!-- pluginManagement按需加载 -->
        <pluginManagement>
            <plugins>
                <!--添加Tomcat插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <configuration>
                        <port>8888</port>
                        <path>/</path>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

创建一个子类继承父类

子级继承父级项目的pom.xml

<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>
    <!-- 继承的项目 -->
    <parent>
        <groupId>com.zl</groupId>
        <artifactId>test-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <!-- 默认的值为../pom.xml :表示父类的pom.xml的路径 如果relativePath找不到父项目的pom.xml,从本地仓库找 
            如果本地仓库,找不到,报错 开发阶段,推荐些写relativePath -->
        <relativePath>../user-parent/pom.xml</relativePath>
    </parent>
    <!-- 基础父类,地址不变,只需要填写名字 -->
    <artifactId>test-common</artifactId>

    <!-- entity没有需要导入的jar包不需要引入 -->
</project>

在本层中添加需要的依赖

<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>
    <parent>
        <groupId>com.zl</groupId>
        <artifactId>book-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>test-mapper</artifactId>

    <!-- 添加本层需要的依赖 -->
    <dependencies>
        <!-- 添加上一层maven项目的依赖的代码
    由于继承关系,上一层继承了父类,故本类也继承了test-parent父类 -->
        <dependency>
            <groupId>com.zl</groupId>
            <artifactId>book-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    <!-- 因为父类中定义了版本号,不需要定义-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
    </dependencies>
</project>

maven的聚合

  我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。所谓聚合,顾名思义,就是把多个模块或项目聚合到一起。

   简单的说:我们在一个项目中会存在模块A和模块B,在各自的项目目录下,我们可以分别通过命令 mvn clean package 来构建各个模块,

但是如果我们想将这两个模块一起构建呢?

       答案是我们需要建立一个模块C做为一个聚合模块。

建立一个聚合项目,满足如下几点要求:

  • 1.该aggregator本身也做为一个Maven项目,它必须有自己的POM
  • 2.它的打包方式必须为: pom
  • 3.引入了新的元素:modules---module
  • 4.版本:聚合模块的版本和被聚合模块版本一致
  • 5.relative path:每个module的值都是一个当前POM的相对目录
  • 6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录 </module>相一致。
  • 7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
  • 8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
  • 9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。

注:在现有的实际项目中一个 POM既是聚合POM,又是父 POM,这么做主要是为了方便

使用聚合的好处

  将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。

posted @ 2020-06-06 16:56  64Byte  阅读(307)  评论(0编辑  收藏  举报