(五)Maven中的聚合和继承
一、为什么要聚合?
- 定义:我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven project --- aggregator。
- 注意:
- 该aggregator本身也做为一个Maven项目,它必须有自己的POM它的打包方式必须为: pom
- 它的打包方式必须为: pom
- 引入了新的元素:modules---module,每个module的值都是一个当前POM的相对目录
- 聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
-
案例:
结果:
二、继承
-
为什么要继承?
-
- 我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入。继承是解决包冲突的解决方法之一。
-
如何配置:
- <packaging>: 作为父模块的POM,其打包类型也必须为POM
- 结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
- 新的元素:<parent> , 它是被用在子模块中的
- 子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素
-
案例:
- maven_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.shyroke</groupId> <artifactId>maven_parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>maven_parent</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 定义公用的依赖包,不负责具体的jar包引用,jar包的引用在子工程中实现 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </dependencyManagement> </project>
- maven05/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.shyroke</groupId> <artifactId>maven_parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>maven05</artifactId> <!-- 如果版本号与maven_parent父工程一致的话可以省略,因为子工程会继承父工程的groupId和version --> <version>2.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>maven05</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <!-- 父工程中已经定义了junit的版本,所以这里就不需要定义版本了 --> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
结果: