Maven中依赖的聚合和继承的关系与实现

不知道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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值