Maven聚合与继承

news2024/9/21 16:35:19

聚合

当我们一次想要构建多个项目时,而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性

在这里插入图片描述

  • 这里第一个特殊的地方是packaging,值设置为pom。我们正常开发的其他模块中都没有声明packaging,默认使用了默认值jar,但是对于聚合模块来说,其打包方式必须为pom,否则无法构建。

  • 元素 modules 是实现聚合的核心配置,用户可以通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块的聚合,这里每一个module值都是一个当前pom的相对目录,因此一般来说模块所处的目录名称应当与其artifactId一致,也可以进行自定义名称更改对应的module配置就可以。

  • 一般来说,为了方便用户构建项目,通常将聚合模块放在项目目录的最底层,其他模块则作为聚合模块的子目录存在,这样当用户得到源码的时候第一眼发现的就是聚合模块的pom,不用从多个模块中去寻找聚合模块来构建整个项目。
    在这里插入图片描述

继承

当我们多个模块下存在很多相同的配置时,例如它们都有相同的groupId和version,有相同的spring-core,slf4j,junit依赖,还有相同的maven-compiler-plugin配置时。在mavne的世界中,也有类似的机制能让我们抽取出重复的配置,这就是pom的继承
在这里插入图片描述

  • 上图pom中使用parent声明父模块,parent下的子元素,groupId,artifactId和version指定了父模块的坐标,这三个元素是必须的,还有一个元素relativePath表示父模块pom相对路径。当项目构建时,Maven会首先根据relativePath检查父pom,如果找不到,再从本地仓库查找。relativePath默认值是<relativePath>../pom.xml</relativePath>,也就是说Maven默认父pom在上一层目录下。

  • 图中我们的pipeline 这个模块并没有声明groupId和verison,这并不代表我们这个模块中没有groupId和verison。实际上我们这个子模块隐式的从父模块中继承了这两个元素,消除了一些不必要的配置,如果遇到子模块需要使用和父模块不一样的groupId和verison,那么可以在子模块中显示声明

可继承的POM元素

  1. groupId:项目组ID,项目坐标的核心元素

  2. version:项目版本,项目坐标的核心元素

  3. description:项目的描述信息

  4. organization:项目的组织信息

  5. inceptionYear:项目的创始年份

  6. url:项目的URL地址

  7. developers:项目的开发者信息

  8. contributors:项目的贡献者信息

  9. distributionManagement:项目的部署配置

  10. issueManagement:项目的缺陷跟踪系统信息

  11. ciManagement:项目的持续集成系统信息

  12. scm:项目的版本控制系统信息

  13. mailingLists:项目的邮件列表信息

  14. properties:自定义的Maven属性

  15. dependencies:项目的依赖配置

  16. dependencyManagement:项目的依赖管理配置

  17. repositories:项目的仓库配置

  18. build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

  19. reporting:包括项目的报告输出目录配置、报告插件配置等。

依赖管理

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.12</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>
    </dependencies>

maven的可继承元素列表包含了dependencies元素,这说明依赖是会被继承的,这时我们可以将一些共用依赖放到父模块中,子模块就可以移除这些依赖,简化配置。但同时也会产生其他问题,目前我们的子模块中都需要上述父模块中的依赖,假如将来项目中需要加入一个util模块,该模块只是需要提供一些工具,与springframework完全无关,难道也让它依赖sping相关依赖吗?这样显然是不合理的。为此 Maven 引入了 dependencyManagement 来对依赖进行管理。

dependencyManagement

    <!-- 该标签只用来控制版本,不能将依赖引入 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.3.2.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>2.3.2.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

Maven 可以通过 dependencyManagement 元素对依赖进行管理,它具有以下 2 大特性:

  • 在该元素下声明的依赖不会实际引入到模块中,只有在 dependencies 元素下同样声明了该依赖,才会引入到模块中。
  • 该元素能够约束 dependencies 下依赖的使用,即 dependencies 声明的依赖若未指定版本,则使用 dependencyManagement 中指定的版本,否则将覆盖 dependencyManagement 中的版本。
    在这里插入图片描述

更改pipeline 子模块对应的配置,我们在dependencies中只需要配置 groupId 和 artifactId,省去了 version 和 scope。之所以能够省略这些信息,是因为它们继承了父模块 Root 中 dependencyManagement 的配置,其完整的依赖声明已经包含在父模块的 POM 中,子模块只需要配置 groupId 和 artifactId 就能获得相应的依赖信息,从而引入正确的依赖。

优点:
  • 在父模块中使用dependencyManagement 声明依赖能够统一项目内依赖的版本,子模块无须声明版本,也就不会出现多个子模块使用同一依赖项版本不一致的情况,降低依赖冲突的几率。
  • dependencyManagement 声明的依赖不会被实际引入,子模块需要什么依赖就自己引入,增加了灵活性,避免引入一些不必要的依赖。

扩展

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

在这里插入图片描述

在这里插入图片描述

单继承问题

现在有个问题,我现在想使用spring-boot-starter-parent提供的依赖管理,但是我又不想继承他,因为我还要继承别的项目,这时候该怎么办呢?

maven和Java一样都是单继承机制,maven当中有pom和import ,通过这两个标签在dependencyManagement中声明依赖,可以替代继承(达到类似parent标签的作用,解决了单继承问题)。

官网讲解:https://docs.spring.io/spring-boot/maven-plugin/using.html

在这里插入图片描述

<dependencyManagement>
	 <dependencies>
		<dependency>
			 <groupId>org.springframework.boot</groupId>
			 <artifactId>spring-boot-dependencies</artifactId>
			 <version>2.3.2.RELEASE</version>
			 <type>pom</type>
			 <scope>import</scope>
		 </dependency>
	</dependencies>
</dependencyManagement>

类似于

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
    <relativePath/>
</parent>

注意:使用dependencyManagement来替代parent的时候,pluginManagement里面嵌套的plugins版本并没有继承过来。

总结

推荐自定义dependencies,不使用spring-boot-dependencies,版本控制更加灵活,spring-boot-dependencies中不存在的依赖也可以添加进去,版本依赖进行升级时,自主控制,不会出现多个子模块使用同一依赖项版本不一致的情况,降低依赖冲突的几率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio 最新版本保姆级安装使用教程

Android Studio 2024 最新版本保姆级安装使用教程 1、官网下载2、安装Standard默认配置Custom配置 3、视频教程 这里是Android Studio 2024最新版本保姆级安装教程&#xff0c;高级版本基本上通用~ Android 是为世界各地的所有用户打造的&#xff0c;无论从设计、功能还是整体价…

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

8、Django Admin后台中添加Logo

在项目settings.py文件 # 导入os&#xff0c;并且修改DIRS内容如下所示 import os TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates/)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.con…

Mudo03 vscode配置相应的文件的搜索路径,库文件的搜索路径以及想要的链接库

使用muduo库&#xff0c;需要链接libmuduo_base.so、libmuduo_net.so 、libpthread.so VScode上如何配置相应的头文件的搜索路径&#xff1f;库文件的搜索路径&#xff1f; 文件的搜索路径&#xff1a; -I&#xff1a;头文件搜索路径 -L&#xff1a;库文件搜索路径 -Imuduo_ne…

docker安装nginx1.27.0

关于拉取不到镜像问题可以到这篇文章进行镜像配置 一、docker拉取nginx1.27.0镜像 docker pull nginx:1.27.0二、创建映射容器的文件目录 mkdir -p -m 777 /mydata/nginx/conf/conf.d mkdir -p -m 777 /mydata/nginx/log mkdir -p -m 777 /mydata/nginx/html 三、创建文件de…

IDEA下载及安装教程(24年7月更新)

IDEA全称IntelliJ IDEA&#xff0c;是由JetBrains公司开发的用于Java编程设计的软件&#xff0c;是一款高效的IDE工具&#xff0c;也是许多Java开发者喜爱的开发工具&#xff0c;具有全行代码补全功能和兼容性与可拓展性&#xff0c;同时也具有较高的使用度与知名度。今天&…

物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)

物业管理系统 基于SprinBootvue的物业管理系统 一、前言 二、系统设计 三、系统功能设计 系统登录实现 后台模块实现 管理员模块实现 物业管理模块实现 业主模块实现 维修员模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

【数学建模国赛思路预约】2024高教社杯全国大学生数学建模竞赛助攻——思路、可运行代码、成品参考

2024年全国大学生数学建模大赛马上就要开始了&#xff0c;大家有没有准备好呢&#xff0c;今年将会和之前一样&#xff0c;将会在比赛赛中时期为大家提供比赛各题的相关解题思路、可运行代码参考以及成品论文。 一、分享计划 1、 赛中分享内容包括&#xff08;2023国赛为例&am…

Windows cmd 输入 Python 弹出应用商城

文章目录 1 使用场景1.1 打开 "运行" 窗口1.2 输入 Python&#xff0c;弹出 Windows 应用商城 2 解决办法2.1 打开 "管理应用执行别名"2.2 取消勾选2.3 验证 1 使用场景 1.1 打开 “运行” 窗口 快捷键&#xff1a;Win r&#xff0c;并输入 cmd 1.2 输入…

Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;并且拿了很多大厂offer。 其中 SpringCloud 工业级底座 &#xff0c;是大家的面试核心&…

Qt:玩转QPainter后转之时钟(步骤详细、包含源码)

前言 简单了解了QPainter之后当然是要找两个例子练练手啦。 正文 先看效果图 在绘制之前我们要先构思好自己要绘制的对象可以分成几部分&#xff0c;比如我要绘制时钟的话&#xff0c;我可以分成&#xff1a;外边框(圆环或者圆)&#xff0c;圆形背景&#xff0c;刻度&…

ES中对于时间聚合的一些总结

最近在通过es统计数据时&#xff0c;遇到了一个问题&#xff1a;在进行时间范围查询后&#xff0c;再对时间进行聚合&#xff0c;此时聚合的结果会受时区影响&#xff0c;也就是说结果的时间戳会被转换成对应时区的时间&#xff0c;并且时间戳也会变成这个时间的时间戳&#xf…

若楠带你初识OpenCV(1)-- 视频、图片基础处理,颜色获取

文章目录 OpenCV一、核心功能二、初识OpenCV1. 安装OpenCV2. 读取图片3. 读取灰度图4. 图片保存5. 视频文件读取6. 区域截取7. 提取RGB通道颜色8. 合并颜色通道 总结 OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学…

SQL【2】稍稍进阶

目录 首先&#xff0c;怎么安装&#xff0c;环境怎么调。 alter——改变&#xff08;此段Al&#xff09; 创建于删除数据库、表格 上一节进阶 预设值default​编辑 关于插入顺序 有条件的删除DELETE FROM 表 WHERE 条件 多种语句组合查看 查看排序​编辑 LIMIT 2只取前…

输煤皮带智能巡检机器人技术方案及应用分析

输煤皮带是电厂和工业企业物料输送系统的重要组成部分。由于皮带系统通常覆盖面积大、环境复杂&#xff0c;传统的人工巡检方式存在效率低、危险性高等问题。为此&#xff0c;智能巡检机器人被引入输煤皮带系统&#xff0c;旨在实现无人化、智能化的巡检作业&#xff0c;提升系…

如何禁用USB存储设备|禁用USB储存和连接手机的方法有哪些?深度解析,四招搞定!

在企业网络安全管理中&#xff0c;禁用USB存储设备和限制手机连接至关重要。这不仅可以防止数据泄露&#xff0c;还能阻止恶意软件通过外部设备入侵。 本文将为你推荐四种行之有效的方法&#xff0c;帮助你全面禁用USB存储设备和连接手机的功能&#xff0c;让企业数据安全更有…

google浏览器禁止http自动转https

在Chrome的地址栏中输入 chrome://flags&#xff0c;搜索“HTTPS Upgrades”并将其设置为“Disabled”。这将禁用Chrome自动将HTTP升级到HTTPS的功能。

分享5款在不同场景提供支持的软件

​ 本文将介绍几款实用的软件工具&#xff0c;涵盖了从文件管理到系统优化&#xff0c;以及跨平台操作等多个领域。 1. 静态分析工具——Cerbero Suite Advanced ​ Cerbero Suite Advanced是一款功能强大的静态分析工具&#xff0c;专为逆向工程和数字取证设计。它支持多种文…

迪杰斯特拉算法——求最短路径

朴素版本&#xff08;时间复杂度O&#xff08;n^2&#xff09;&#xff09;&#xff1a; 迪杰斯特拉算法采用的是一种贪心的策略。 用一个 dist 数组保存源点到其余各个节点的距离&#xff0c;dist[i] 表示源点到节点 i 的距离。初始时&#xff0c;dist 数组的各个元素为无…

Nginx 部署前端 Vue 项目实战指南

一、环境准备 1. 安装 Nginx 首先&#xff0c;需要在服务器上安装 Nginx。Nginx 是一款轻量级、高性能的 HTTP 和反向代理服务器。安装方式因操作系统而异。 Linux 系统&#xff08;以 Ubuntu 为例&#xff09;&#xff1a; sudo apt-get update sudo apt-get install nginxWi…