ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
一、为什么要聚合? 1、项目分模块开发,如果模块较多,在执行clean、package等构建相关操作时,费事费力!也不符合maven的自动化管理初衷,所以利用聚合可以管理多个模块的操作。 2、聚合模块和子模块的目录:他们可以是父子类(上下级目录),也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。 二、为什么需要继承 多模块那就是不同的组甚至是不同的部门来开发,比如junit依赖的version 很有可能就会不一样,但是为了项目后期维护以及项目人员调度尽可能的方便,我们需要将junit的版本设为统一的。所以就需要有一个机制来给统一这个标准,maven提供了一种机制就是 继承。继承可以提供对多模块的管理,提高复用性! 通过定义一个父工程,并且在该父工程的 pom 文件中使用 dependencyManagement来声明junit的统一version 父工程的pom.xml ``` <?xml version="1.0" encoding="UTF-8"?> <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.javxuam.maven</groupId> <artifactId>MavenProject</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project> ``` 2.A模块继承父工程pom.xml,定义junit依赖时候不声明version,去除A中pom.xml 与父工程pom.xml中重复的部分 ``` <?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>MavenProject</artifactId> <groupId>com.javxuam.maven</groupId> <version>1.0-SNAPSHOT</version> <!--最好声明一下以当前pom文件目录为基准 的父工程的pom文件--> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <!--本来A模块也是需要 三点确定的, 但是 groupId 与version与父工程的相同 所以去掉,不去掉也不会报错--> <groupId>com.javxuam.maven</groupId> <artifactId>A</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--不声明version--> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.6.RELEASE</version> </dependency> </dependencies> </project> ``` 同样给 B,C模块继承父模块,再查看A,B,C三个模块的junit依赖 ![](https://box.kancloud.cn/99509d493bfdd8ee21b0ea966dc1fe3e_358x530.png) 至此 继承就解决了 统一依赖版本的问题。 2.聚合 聚合在java 中是在A对象功能完整需要 另外B对象来实现,所以A类中有着B类对象的引用,但是A对象的生命周期结束,B对象依然可以存在,简而言之就两个对象的生命周期不同。当然在maven中,聚合又是为了解决另外一个问题而存在的一种机制。通常我们的项目都是都模块的,而每个模块又是一个 maven项目,所以每次开发完了编译都需要一个一个模块的去执行,这就违背了maven的自动化理念。 所以聚合应运而生,具体做法: ``` <?xml version="1.0" encoding="UTF-8"?> <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.javxuam.maven</groupId> <artifactId>MavenProject</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>A</module> <module>B</module> <module>C</module> <module>D</module> <module>WebProject</module> </modules> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> </project> ``` 然后执行一下 父模块的 clean 看 A,B,C,D模块是否也会一起clean ![](https://box.kancloud.cn/b26614bdb25ca4a8395c21544327bb8f_1328x434.png) 从图中可以看出所有的模块都执行了clean,这就避免了一个一个模块的clean操作了。 3 继承与聚合容易混淆的点 3.1 子模块并不一定是父项目的子模块(子模块只是一种称呼,并不一定真的是有继承关系的) 如:A项目下有 a,b,c三个子模块 A项目的pom.xml ``` <modules> <module>a</module> <module>b</module> <module>c</module> </modules> ``` a,b,c项目的pom.xml不一定有如下定义 ``` <parent> <artifactId>A</artifactId> <groupId>com.javxuam.maven</groupId> <version>1.0-SNAPSHOT</version> <!--最好声明一下以当前pom文件目录为基准 的父工程的pom文件--> <relativePath>../pom.xml</relativePath> </parent> ``` 3.2 聚合的目的只是为了把大型分模块项目的 clean package test等操作的简化, 有了聚合 对顶级项目 执行 mvn clean ,package等命令时 下的子模块 也会自动执行 借鉴:https://blog.csdn.net/u014297148/article/details/79939656