欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Maven的聚合与继承

程序员文章站 2022-05-04 12:29:49
...

聚合

如果我们想要一次构建两个项目,而不是到两个模块的目录下分别执行mvn命令,Maven聚合(或者称为多模块)这一特性就是为该需求服务的。
假设现在有account-email和account-persist两个模块。为了能够使用一条命令就能够构建account-email和account-persist两个模块,我们需要创建另一个新模块account-aggregator,然后通过该模块构建整个项目的所有模块。account-aggregator本身作为一个Maven项目,它必须有自己的POM,不过同时作为一个聚合项目,其POM又有特殊的地方,如下是
account-aggregator的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.cc.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>om</packaging>

  <name>Account Aggregator</name>

   <modules>
     <module>account-email</module>
     <module>account-persist</module>
  </modules>


 </project> 

上述代码第一个特殊的地方为packaging,其值为POM。对于聚合模块来说,其打包方式packaging的值必须为pom,否则就无法构建。

用户可以通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块的聚合。这里每个module的值都是一个当前POM的相对目录。

继承

在聚合的两个POM中会有这很多相同的配置,例如他们有相同的groupId和version,有这相同的junit依赖等等,还有相同的maven-compiler-plugin与maven-resources-plugin配置。这就会产生大量的重复。在面向对象的世界中, 程序员可以使用类继承来在一定程度上消除重复。在Maven世界中,也有类似的机制能够让我们抽取出重复的配置,这就是POM的继承。

面向对象设计中,程序员可以建立一种类的父子结构,然后在父类中声明一些字段和方法供子类继承,这样就可以做到“一处声明,多处使用”。类似地,我们需要创建POM的父子结构,然后在父POM中声明一些配置供子POM继承,以实现“一处声明,多处使用”的目的。

我们在account-aggregator下创建一个名为account-parent的子目录,然后在该子目录下创建一个所有除account-aggregator之外模块的父模块。为此,在该子目录下创建一个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.cc.account</groupId>
  <artifactId>account-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Parent</name>

</project>

上述的packaging打包类型也必须为pom
由于父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java/之类的文件夹了。

有了父模块,就需要其他模块来继承他,首先将account-email的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>

<parent>
  <groupId>com.cc.account</groupId>
  <artifactId>account-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <relativePath>../account-parent/pom.xml</relativePath>
</parent>
   <artifactId>account-email</artifactId>
     <name>Account Email</name>
</project>

<dependencies>
   ......
  </dependencies>



  <build>
    <plugins>
        .........
    </plugins>

  </build>

上述POM中使用parent元素声明父模块,parent下的子元素groupId、artifactId和version指定了父模块的坐标。这三个元素是必须的。元素relativePath表示父模块POM的相对路径。当项目构建时,Maven会首先根据relativePath检查父POM,如果找不到,再从本地仓库查找。relativePath的默认值是../pom.xml,也就是说,Maven默认父POM在上一层目录下。

可继承的POM元素

groupId和version是可以被继承的,那么还有哪些POM元素可以被继承呢?
Maven的聚合与继承

相关标签: maven