Maven的聚合特性能够把项目的各个模块聚合在一起构建,而maven的继承特性怎能帮助抽取各个模块相同的依赖和插件配置,在简化pom的同时,促进各个模块的一致性。
(一)聚合
聚合可以一次构建多个项目,而不是到多个模块的目录下分别执行mvn命令。
聚合实例:
创建一个新的模块,命名为account-aggregator。通过该模块可以聚合多个项目。注意:该模块的文件夹放置的位置 会导致与其他模块是父子关系,还是并行关系。
1,如果聚合模块与其他模块放在同一个文件夹里,那就是平行关系:
文件夹位置:
在聚合模块中,只需要pom文件,其他的src/main/java 和src/main/test文件夹都可以直接删除。并修改pom中的配置如下:
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式必须为pom-->
<packaging>pom</packaging>
<name>account-aggregator</name>
<!--这样会是三者 平行关系-->
<modules>
<module>../chapter05</module>
<module>../chapter08</module>
</modules>
运行聚合模块后,会出现如下结果:
2、建议将多个项目放在聚合模块文件夹的里面,这样形成父子关系。修改的pom为:
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式必须为pom-->
<packaging>pom</packaging>
<name>account-aggregator</name>
<!--这样会是三者 父子关系-->
<modules>
<module>chapter05</module>
<module>chapter08</module>
</modules>
对多个项目执行mvn命令时,直接在聚合模块下执行,结果如下:
显示 的是各模块的名字,所有建议配置合理的name字段。
(二)继承
不同模块中有很多相同的配置,比如:groupid和version,有相同的spring-core,spring-beans,spring-context和junit依赖等。这些重复可以通过继承消除。
创建pom的父子结果,在父Pom中声明一些配置供子pom继承。
1、新创建一个account-parent模块,也只有一个文件pom,用作父pom。该模块放置的位置也是与其他模块是平行的。
父pom文件如下:
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--继承中,打包方式也是pom-->
<packaging>pom</packaging>
<name>account-parent</name>
让其他模块来继承该父pom。例如在account-email中,对其pom作如下修改:
<!--声明父模块-->
<parent>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父模块的相对位置,与当前文件平行的account-parent目录下的pom.xml-->
<relativePath>../account-parent/pom.xml</relativePath>
</parent>
<artifactId>account-email</artifactId>
<packaging>jar</packaging>
这个修改后的account-email没有groupid和version,实际上,这个子模块隐式从父模块继承了这两个元素。父子模块使用同样的groupid和version。如果子模块需要使用不同的groupid和version,那么可以在子模块中显式声明。
同样,还需要把account-parent模块加入到聚合中:
<modules>
<module>../chapter05</module>
<module>../chapter08</module>
<module>../account-parent</module>
</modules>
2、依赖管理
也可以将dependencies元素中的依赖,通过继承来消除重复。将这些重复的依赖配置到父模块中,可以简化配置。
但是在父模块中配置的依赖,并不是每一个子模块都需要引用。可以使用dependencyManagement元素能让子模块灵活继承父模块的依赖配置。
在account-parent中使用dependencyManagement元素:
<!--通用的version值-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springframework.version>4.3.3.RELEASE</springframework.version>
<junit.version>4.7</junit.version>
</properties>
<!--父模块中,将子模块可能要使用的依赖都配置-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
这段配置不会给account-parent引入依赖,也不会给子模块引入依赖。子模块可以根据自己的需求对其进行继承其中的某一些依赖。
例如,在account-email中继承该依赖,配置如下:
<dependencies>
<!--junit可以不配置版本号version和scope。这些都是通过继承得到-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
子模块只需要配置简单的groupid和artifactid就行,其他信息从父模块中继承得到。
如果子模块不需要某个依赖,不声明就行,该依赖不会被引入。
对于插件的管理,可以使用pluginManagement。