当前位置: 首页 > news >正文

深入理解 spring-boot-starter-parent

目录

    • 一、前言
    • 二、Maven继承
    • 三、分析spring-boot-starter-parent
    • 四、Maven单继承问题
    • 五、不继承spring-boot-starter-parent需要注意的

一、前言

在idea当中创建springboot项目的时候都会继承一个spring-boot-starter-parent作为父类,假如不继承我们的项目就不能使用了吗?他的作用是什么呢?报着这些疑问我们进行深度解析。

二、Maven继承

Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模块的 POM 来获得对相关依赖的声明。对于父模块而言,其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom

通过mvn help:effective-pom 命令就可以查看项目的最终生成的pom(有效的pom)。mvn help:effective-pom命令详解:https://blog.csdn.net/weixin_43888891/article/details/130483451

三、分析spring-boot-starter-parent

不继承我们的项目就不能使用了吗?

答:当然不是,我们选择该依赖,然后按住ctrl就可以点进去,可以看一下他都做了些什么,实际上就是给我们提供了一个管理的依赖pom,而并没有真实的去引用任何依赖!

(1)了解spring-boot-starter-parent

spring-boot-starter-parent下大部门都是pluginManagement插件管理。

pluginManagement 元素与 dependencyManagement 元素的原理十分相似,在 pluginManagement 元素中可以声明插件及插件配置,但不会发生实际的插件调用行为,只有在 POM 中配置了真正的 plugin 元素,且其 groupId 和 artifactId 与 pluginManagement 元素中配置的插件匹配时,pluginManagement 元素的配置才会影响到实际的插件行为。

(2)了解spring-boot-dependencies

接下来我们再点进去spring-boot-dependencies看看,spring-boot-dependencies给我们提供了大量的dependencyManagement依赖版本管理。

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

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

(3)不引用spring-boot-starter-parent项目如何正常使用

新建一个空项目,只引入web(注意没有引入boot版本管理,那就需要手动添加版本号),springboot照样可以启动的哟

四、Maven单继承问题

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

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

官网讲解:https://docs.spring.io/spring-boot/docs/3.1.0-SNAPSHOT/maven-plugin/reference/htmlsingle/#using.import

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.10</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>类似于<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/>
</parent>

只是类似,并不完全替代继承。为什么这么说?请看如下示例:spring-boot-starter-parent的pluginManagement是有对spring-boot-maven-plugin版本进行管理的:

找不到说明一个原因,导入的配置没有生效!

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

注:import 依赖范围只能与 dependencyManagement 元素配合使用才会有效,其功能是将目标 pom.xml 中的 dependencyManagement 配置导入合并到当前 pom.xml 的 dependencyManagement 中。

因此便可以明白,解决单继承的时候为什么官网让我们导入spring-boot-dependencies,而不是spring-boot-starter-parent,因为spring-boot-starter-parent当中继承了spring-boot-dependencies,但是parent实际上就是提供了一些pluginManagement,而使用import 导入的形式根本无法将这些导入。

五、不继承spring-boot-starter-parent需要注意的

假如不继承spring-boot-starter-parent,我们还需要自己声明打包插件。spring-boot-starter-parent配置的插件就是打出来一个可直接运行的jar。

在这里插入图片描述

假如我们只声明如下,打出来的jar包是启动不起来的,打出来的jar包并不会将依赖的jar打进去。

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.10</version></plugin></plugins>
</build>

相关文章:

深入理解 spring-boot-starter-parent

目录 一、前言二、Maven继承三、分析spring-boot-starter-parent四、Maven单继承问题五、不继承spring-boot-starter-parent需要注意的 一、前言 在idea当中创建springboot项目的时候都会继承一个spring-boot-starter-parent作为父类&#xff0c;假如不继承我们的项目就不能使…...

基于SpringBoot的线上日志阅读器

软件特点 部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式&#xff0c;支持大文件的读取。支持实时打印新增的日志&#xff08;类终端&#xff09;。支持日志搜索。 使用手册 基本页面 配置路径 配置日志所在的目录&#xff0c;配置后按回车…...

【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】

Leetcode Leetcode -405.数字转换为十六进制数Leetcode - 409.最长回文串 Leetcode -405.数字转换为十六进制数 题目&#xff1a;给定一个整数&#xff0c;编写一个算法将这个数转换为十六进制数。对于负整数&#xff0c;我们通常使用 补码运算 方法。 注意 : 十六进制中所有…...

剑指 Offer:003 前 n 个数字二进制中 1 的个数

题目&#xff1a; 给定一个非负整数 n&#xff0c;请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数&#xff0c;并输出一个数组 示例&#xff1a; 1、 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 2、 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 …...

DDD系列:二、应用架构设计演变

作用: ​ 通过规定一个固定的架构设计&#xff0c;可以让团队内有一个统一的开发规范&#xff0c;降低沟通成本&#xff0c;提升效率和代码质量。 目标&#xff1a; ​ 在做架构设计时&#xff0c;一个好的架构应该需要实现以下几个目标&#xff1a; 独立于UI&#xff1a;前…...

Spring-IOC

IOC概念和原理 什么是IOC 控制反转&#xff0c;为了将系统的耦合度降低&#xff0c;把对象的创建和对象直接的调用过程权限交给Spring进行管理。 IOC底层原理 XML解析 ​ 通过Java代码解析XML配置文件或者注解得到对应的类的全路径&#xff0c;获取对应的Class类 Class clazz …...

基于Java语言开发B/S架构实现的云HIS

一、云HIS系统框架简介 1、技术框架 &#xff08;1&#xff09;总体框架&#xff1a; SaaS应用&#xff0c;全浏览器访问 前后端分离&#xff0c;多服务协同 服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; 前端&#xff1a;AngularNg…...

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…...

代码随想录训练营Day6| 242、349、202、1

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 class Solution {public boolean isAnagram(String s, String t)…...

IP-GUARD如何通过网络控制策略禁止应用程序联网?

如何通过网络控制策略禁止应用程序联网? 可以在控制台-高级-网络控制中,添加以下策略: 动作:“禁止” 应用程序:填写要禁止的程序(以QQ示例) 如何禁止没有安装客户端的电脑访问客户端电脑? 可以给所有客户端设置只允许客户端电脑访问的网络控制策略; 在控制台左边的…...

Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

概述&#xff1a; 在Java编程中&#xff0c;我们经常用到如下一段代码来生成RSA公私钥&#xff0c;分别拿到公私钥然后加解密计算&#xff1a; KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…...

Android 12.0 Launcher3仿ios长按app图标实现抖动动画开始拖拽停止动画

1.概述 在12.0的系统rom定制化开发中,在对系统原生Launcher3的定制需求中,也有好多功能定制的,在ios等电子产品中 的一些好用的功能,也是可以被拿来借用的,所以在最近的产品开发需求中,需求要求模仿ios的 功能实现长按app图标实现抖动动画,接下来看如何分析该功能的实现…...

【五一创作】50道Java面试题

Java中的四种访问权限控制符分别是什么&#xff1f; 答&#xff1a;Java中的四种访问权限控制符分别是public、protected、default和private。 Java中的反射是什么&#xff1f;有什么作用&#xff1f; 答&#xff1a;Java中的反射是指在程序运行时动态获取类的信息和调用对象…...

4。计算机组成原理(3)指令系统

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 指令系统&#xff08;Instruction Set&#xff09;是计算机体系结构的关键组成部分之一&#xff0c;它定义了处…...

【Elasticsearch】NLP简单应用

文章目录 NLP简介ES中的自然语言处理(NLP)NLP演示将opennlp插件放在ESplugins路径中下载NER模型配置opennlp重启ES、验证 NLP简介 NLP代表自然语言处理&#xff0c;是计算机科学和人工智能领域的一个分支。它涉及使用计算机来处理、分析和生成自然语言&#xff0c;例如英语、中…...

3. 云计算的落地实践(下)

本章讲解知识点 云计算如何落地实践ISO镜像文件创建虚拟机入门创建数据节点配置VMWare创建虚拟机三种网络模式1. 云计算的落地实践 上一章我们讲了云计算的业界实践,即:搭建IaaS后,用于创建虚拟机,在虚拟机上部署PaaS,用于管理同时部署在虚拟机上的容器,这就是业界普遍的…...

javaEE+mysql学生竞赛管理系统

本系统是基于JAVA平台开发的一套学生竞赛信息管理的系统。系统采用JSP为编程语言。数据库采用Mysql建立数据之间的转换。论文主要介绍了本课题的开发背景&#xff0c;所要完成的功能和开发的过程。重点的说明了系统设计的重点、设计思想、难点技术和解决方案。 本课题的目的是使…...

车辆出险记录查询API接口

车辆出险记录接口可以帮助车主、保险公司、交通管理部门等各方快速查询车辆的出险记录&#xff0c;了解车辆风险情况、核算保险费用等。这篇文章将探讨车辆出险记录接口的作用、应用场景、使用方式以及一些注意事项。 作用&#xff1a; 车辆出险记录接口主要解决了快速获取车…...

MySQL的概念,编译及安装

一.数据库的基本概念 1、数据&#xff08;Data&#xff09; • 描述事物的符号记录 • 包括数字&#xff0c;文字&#xff0c;图形&#xff0c;图像&#xff0c;声音&#xff0c;档案记录等 • 以“记录”形式按统一的格式进行存储 2、表 • 将不同的记录组织在一起 • …...

系统性能压力测试

系统性能压力测试 一、压力测试 压力测试是给软件不断加压&#xff0c;强制其在极限的情况下运行&#xff0c;观察它可以运行到何种程度&#xff0c;从而发现性能缺陷&#xff0c;是通过搭建与实际环境相似的测试环境&#xff0c;通过测试程序在同一时间内或某一段时间内&…...

ngx_create_pidfile

1 定义 ngx_create_pidfile 函数 定义在 ./nginx-1.24.0/src/core/ngx_cycle.cngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log) {size_t len;ngx_int_t rc;ngx_uint_t create;ngx_file_t file;u_char pid[NGX_INT64_LEN 2];if (ngx_process >…...

【内存心法】别用玄学猜栈大小了!撕碎 RTOS 堆栈溢出的遮羞布,用 ARM MPU 构筑硬件级“死亡红区”与绝对沙箱

摘要&#xff1a;在错综复杂的多任务 RTOS 环境中&#xff0c;一个微小的局部数组越界&#xff0c;就能像癌细胞一样悄无声息地摧毁整个系统的内存空间。无数开发者迷信 FreeRTOS 的 vApplicationStackOverflowHook&#xff0c;却不知道它在真正的“跳跃式内存踩踏”面前形同虚…...

nRF24L01无线通讯模块发送失败排查指南:从引脚冲突到ACK配置

1. 引脚冲突&#xff1a;最容易被忽略的硬件陷阱 第一次用nRF24L01模块时&#xff0c;我踩过一个大坑&#xff1a;明明发送端显示数据发送成功&#xff0c;接收端却毫无反应。换了三套硬件还是同样的问题&#xff0c;直到发现接收板的CSN引脚竟然和复位电路共用了同一个GPIO。这…...

HunyuanImage-3.0-Instruct:8步玩转AI创意绘图

HunyuanImage-3.0-Instruct&#xff1a;8步玩转AI创意绘图 【免费下载链接】HunyuanImage-3.0-Instruct-Distil 项目地址: https://ai.gitcode.com/tencent_hunyuan/HunyuanImage-3.0-Instruct-Distil 导语 腾讯混元最新发布的HunyuanImage-3.0-Instruct-Distil模型&a…...

2026最权威一键生成论文工具榜单:这些被高校和导师悄悄推荐的软件你还没用?

一键生成论文工具已成为提升学术效率的重要助力。依托权威检测平台数据、高校师生实测反馈及用户真实评价&#xff0c;这些工具在合规性、专业性与实用性上不断突破。本文基于多维度测评&#xff0c;为您盘点2026年最受认可的AI论文写作软件&#xff0c;助你轻松应对各类论文需…...

VCR监控与告警:快速检测Cassette过期和配置问题的完整指南

VCR监控与告警&#xff1a;快速检测Cassette过期和配置问题的完整指南 【免费下载链接】vcr Record your test suites HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests. 项目地址: https://gitcode.com/gh_mirrors/vc/v…...

Java初级项目如何实现图书管理系统

Java的核心目标是掌握基本语法、面向对象编程和简单的控制台交互。该系统不需要数据库或图形界面&#xff0c;可以通过集合存储数据来满足学习需求。以下是如何从功能设计到代码结构逐步实现的。1. 明确基本功能基本的图书管理系统通常包括以下操作&#xff1a;添加图书&#x…...

仅限内部技术团队流通的Dify异步接入SOP(含安全审计清单+可观测性埋点规范)

第一章&#xff1a;Dify 自定义节点异步处理如何实现快速接入在 Dify v1.0 版本中&#xff0c;自定义节点&#xff08;Custom Node&#xff09;支持通过 Webhook 或本地 Python 函数方式扩展业务逻辑。当节点需执行耗时操作&#xff08;如大模型微调、外部 API 调用、文件批量处…...

RVC开源镜像实测:CSDN GPU平台3分钟完成端到端部署

RVC开源镜像实测&#xff1a;CSDN GPU平台3分钟完成端到端部署 想用自己的声音唱出周杰伦的歌&#xff0c;或者让AI模仿你喜欢的歌手声线吗&#xff1f;过去这需要复杂的本地环境搭建、漫长的模型训练&#xff0c;对新手来说门槛极高。但现在&#xff0c;借助CSDN GPU平台上的…...

Face Analysis WebUI在AR眼镜中的应用:实时身份识别

Face Analysis WebUI在AR眼镜中的应用&#xff1a;实时身份识别 1. 引言 想象一下&#xff0c;当你戴着AR眼镜走在街上&#xff0c;迎面走来一位同事&#xff0c;眼镜瞬间识别出他的身份并在视野角落显示姓名和职位信息。或者进入会议室&#xff0c;AR眼镜自动识别所有参会人…...