Maven的聚合与继承
聚合
如果我们想要一次构建两个项目,而不是到两个模块的目录下分别执行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元素可以被继承呢?
上一篇: Linux桌面GUI系统的调度器应该怎么做才不卡顿呢?
下一篇: 数据结构与算法之队列