《项目管理利器Maven》学习(十):Maven核心之聚合和继承

       Maven聚合

       为什么要聚合?

       随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采

用各种方式进行开发,于是就有了我们的分层架构、分模块开发,来提高代码的清晰和重用。针对于这一特性,

maven也给予了相应的配置。

       我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独

立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工

作,这时Maven给出了聚合的配置方式。

        聚合配置

        所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven 

project ---  aggregator。

       建立该project的时候,我们要注意以下几点:

       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也需要做出相应的更改。

       聚合示例

       如果在Maven中我们想将多个项目安装到本地仓库中,必须对多个项目依次执行install命令,Maven提供了一种

的方式可以将多个项目放在在一起进行执行,那么这种方式就是Maven中的聚合。

       如果我们想将之前做的三个项目demo1、demo2和demo3进行聚合,我们就需要新建一个Maven项目

demo5,在它的POM中加入如下的配置:

<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.demo</groupId>
  <artifactId>demo5</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <modules>
      <module>../demo1</module>
      <module>../demo2</module>
      <module>../demo3</module>
  </modules>
  
</project>

      我们执行clean install命令:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] demo1
[INFO] demo2
[INFO] demo3
[INFO] demo5
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building demo1 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo1 ---
[INFO] Deleting E:\Java\JavaEE\Demo\demo1\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo1\src\main\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo1\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo1 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo1\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo1\target\test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo1 ---
[INFO] Surefire report directory: E:\Java\JavaEE\Demo\demo1\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.demo.demo1.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ demo1 ---
[INFO] Building jar: E:\Java\JavaEE\Demo\demo1\target\demo1-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ demo1 ---
[INFO] Installing E:\Java\JavaEE\Demo\demo1\target\demo1-0.0.1-SNAPSHOT.jar to E:\Java\develop\maven\m2\repository\com\demo\demo1\0.0.1-SNAPSHOT\demo1-0.0.1-SNAPSHOT.jar
[INFO] Installing E:\Java\JavaEE\Demo\demo1\pom.xml to E:\Java\develop\maven\m2\repository\com\demo\demo1\0.0.1-SNAPSHOT\demo1-0.0.1-SNAPSHOT.pom
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building demo2 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo2 ---
[INFO] Deleting E:\Java\JavaEE\Demo\demo2\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo2 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo2\src\main\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo2 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo2\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo2 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo2\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo2 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo2\target\test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo2 ---
[INFO] Surefire report directory: E:\Java\JavaEE\Demo\demo2\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.demo.demo2.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ demo2 ---
[INFO] Building jar: E:\Java\JavaEE\Demo\demo2\target\demo2-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ demo2 ---
[INFO] Installing E:\Java\JavaEE\Demo\demo2\target\demo2-0.0.1-SNAPSHOT.jar to E:\Java\develop\maven\m2\repository\com\demo\demo2\0.0.1-SNAPSHOT\demo2-0.0.1-SNAPSHOT.jar
[INFO] Installing E:\Java\JavaEE\Demo\demo2\pom.xml to E:\Java\develop\maven\m2\repository\com\demo\demo2\0.0.1-SNAPSHOT\demo2-0.0.1-SNAPSHOT.pom
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building demo3 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo3 ---
[INFO] Deleting E:\Java\JavaEE\Demo\demo3\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo3 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo3\src\main\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo3 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo3\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo3 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Java\JavaEE\Demo\demo3\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo3 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to E:\Java\JavaEE\Demo\demo3\target\test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo3 ---
[INFO] Surefire report directory: E:\Java\JavaEE\Demo\demo3\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.demo.demo3.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ demo3 ---
[INFO] Building jar: E:\Java\JavaEE\Demo\demo3\target\demo3-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ demo3 ---
[INFO] Installing E:\Java\JavaEE\Demo\demo3\target\demo3-0.0.1-SNAPSHOT.jar to E:\Java\develop\maven\m2\repository\com\demo\demo3\0.0.1-SNAPSHOT\demo3-0.0.1-SNAPSHOT.jar
[INFO] Installing E:\Java\JavaEE\Demo\demo3\pom.xml to E:\Java\develop\maven\m2\repository\com\demo\demo3\0.0.1-SNAPSHOT\demo3-0.0.1-SNAPSHOT.pom
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building demo5 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo5 ---
[INFO] Deleting E:\Java\JavaEE\Demo\demo5\target
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ demo5 ---
[INFO] Installing E:\Java\JavaEE\Demo\demo5\pom.xml to E:\Java\develop\maven\m2\repository\com\demo\demo5\0.0.1-SNAPSHOT\demo5-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] demo1 .............................................. SUCCESS [  4.255 s]
[INFO] demo2 .............................................. SUCCESS [  1.058 s]
[INFO] demo3 .............................................. SUCCESS [  0.858 s]
[INFO] demo5 .............................................. SUCCESS [  0.035 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.356 s
[INFO] Finished at: 2016-12-29T20:49:32+08:00
[INFO] Final Memory: 17M/128M
[INFO] ------------------------------------------------------------------------

       这就是聚合。

       Maven继承

       为什么要继承?

       做面向对象编程的人都会觉得这是一个没意义的问题,是的,继承就是避免重复,maven的继承也是这样,它还

有一个好处就是让项目更加安全。

       我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要

Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入

       如何配置继承:

       1.说到继承肯定是一个父子结构,那么我们在aggregator中来创建一个parent project

       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: 包括项目的报告输出目录配置、报告插件配置等

       继承示例

       我们前面的三个项目demo1、demo2和demo3他们都使用了Junit单元测试,这样出现了很多重复的依赖代码,

Maven也可以像Java中一样将它们共同的特性抽象一个父类,这一次我们新建一个他们的父项目demo6。

       它的POM配置如下:

<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.demo</groupId>
  <artifactId>demo6</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>3.8.1</junit.version>
  </properties>

  <dependencyManagement>
     <dependencies>
          <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit.version}</version>
             <scope>test</scope>
          </dependency>
      </dependencies>    
  </dependencyManagement>
  
</project>

       子项目demo1的POM可以改为下面:

<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>

  <artifactId>demo1</artifactId>
  <packaging>jar</packaging>

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

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <parent>
       <groupId>com.demo</groupId>
       <artifactId>demo6</artifactId>
       <version>0.0.1-SNAPSHOT</version>
  </parent>
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    
  </dependencies>
  
</project>

       注意:

       1.子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、

version ,也可指定;

       2.不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同

的 groupId或version,同样的 artifactId也容易产生混淆。

       3.使用继承后 parent也必须像自模块一样加入到聚合模块中。也就是在在聚合模块的 pom中加入

<module>account-parent</module>。

        聚合与继承的关系

        区别  :

        1. 对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

        2. 对于继承关系的父POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父POM是什

么。

        共同点  :

        1. 聚合POM与继承关系中的父POM的packaging都是pom。

        2. 聚合模块与继承关系中的父模块除了POM之外都没有实际的内容。

        Maven聚合关系与继承关系的比较:

        

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


        参考文章:Maven详解之聚合与继承

                                           Maven聚合与继承

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值