不知道Maven中依赖的聚合与继承的关系?这个文章用通俗易懂的话语告诉你答案!
首先我们要了解依赖的聚合与继承是处理什么问题的
引入
依赖聚合引入
在我们分模块开发中,突然有一个模块的依赖需要变更(比如依赖的版本之类的),但是不知道这个模块的改变会对整个项目产生什么样的影响(依赖间版本号不兼容执行会报错),所以此时就需要引入一个主项目,也就是聚合工程,来让项目间的依赖同时构建
所以依赖聚合的作用如下:
依赖聚合的作用
当工程中某个模块的pom文件有变更时,保障要更新的模块与其他相关联的模块同步更新
依赖继承引入
有一些重要的依赖几乎每个模块都需要,比如springboot的起步依赖,如果你需要修改它版本号,就要把所有模块的pom文件修改一遍,如果你想新增一些利用率高的依赖,也要把所有模块的pom文件翻一遍然后添加进去,而依赖的继承就是用来简化这个问题的
依赖继承的白话文理解
项目中一些重复利用率较高的依赖,我们就把它交给一个父模块来管理,子模块只需要“继承”父模块的依赖就可以使用了,这样新增或者修改重复利用率较高的依赖都很方便,不用每个模块都去改
依赖继承的作用
减少版本冲突,实现版本控制:只用改父模块的一个依赖,就可以实现对整个项目的依赖更改
简化配置:一些重要的依赖,不用每个子模块都去添加一遍,父模块添加一次即可
实现
此时项目结构是这样的
依赖聚合的实现
①创建一个聚合模块,该模块下只留一个pom.xml文件
现在创建一个模块module-boss,该模块被称为聚合模块,这个模块只留下一个pom.xml文件来统一管理依赖即可
此时的项目结构:
② 设置该聚合模块的打包方式为pom
在聚合模块module-boss的pom.xml文件下设置打包方式
<packaging>pom</packaging>
③设置需要统一管理的模块的名称
在聚合模块module-boss的pom文件下添加需要统一管理的模块的名称
即可!
依赖继承的实现
此时module-a、module-b、module-c都有这三个依赖
① 在子模块中指定父模块,并写入父模块的位置
在三个子模块的pom.xml文件中的<parent>标签中引入父模块module-boss的坐标,再写上父模块的位置
②父模块中添加需要的依赖,子模块删去对应的依赖
在父模块中添加重复利用率高的依赖(这里是上面的springboot起步依赖、lombok依赖、test依赖 ),子模块中将这些已添加的依赖删去
父模块的pom:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
</parent>
<groupId>com.example</groupId>
<artifactId>module-boss</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<modules>
<module>../module-a</module>
<module>../module-b</module>
<module>../module-c</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
子模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>module-a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
即可!
依赖聚合与继承的异同
相同点
1.聚合与继承的主模块的pom.xml文件的打包方式均为pom(所以通常用一个主模块来实现这两个功能)
2.聚合与继承均属于设计型模块,并无实际的模块内容
不同点
1.作用不同:
聚合是用来统一管理模块依赖的,让依赖同时构建,防止一个模块依赖更新后整个项目出错的情况
继承是方便版本控制和依赖耦合的情况
2.配置的位置不同:
实现聚合是在主模块中写配置
实现继承是在子模块中写配置(好比于科学家实体类要继承人的实体类,则在科学家类里写extends)