Springboot工程依赖包与执行包分离打包与构建docker 镜像

news2024/12/26 21:15:47

文章目录

  • 一、概述
  • 二、工程概况
    • 1. 代码原始结构
    • 2. 运行界面
  • 三、常规打包
    • 1. 打包命令
    • 2. jar包结构
  • 四、分离依赖包、执行包步骤
    • 1. 引入依赖包管理插件
    • 2. 打包验证

一、概述

某大数据项目,使用springboot常规打包方式,打出来的一体化执行包达几百兆, 分析jar 结构,其中的依赖包达几百个,占据99%以上的体积。
考虑到在迭代开发小版本升级发布期间,依赖包几乎不会发生变化。迫切需要将依赖包和执行包分离,部署时在依赖包不变的情况下只更新执行包,可提升发布效率。

下面我们以 springboot-hello 工程为例来说明操作过程。

二、工程概况

1. 代码原始结构

此工程为普通的springboot工程,大家可以 下载源码 运行 HelloApplication
在这里插入图片描述

2. 运行界面

在这里插入图片描述
点击doc.html为在线接口文档
在这里插入图片描述
点击h2-console打开内存数据库登录页面在这里插入图片描述
JDBC URL 填入 jdbc:h2:mem:hello;database_to_upper=false,User Name 填入sa,点击Connect
在这里插入图片描述

三、常规打包

1. 打包命令

进入项目目录执行打包

mvn clean package

执行结果如下:
在这里插入图片描述
可以看到除了生成jar外,还生成了docker镜像。
注意:生成镜像需要本地docker环境,本人使用了Windows系统下的Docker Desktop

如果推送到镜像仓库的话,需打开<goal>push</goal>并配置镜像仓库账号、密码,有2种方式:
1.在maven配置文件中配置,可参考:容器镜像生成记

2.项目pom.xml文件中配置
在这里插入图片描述
将上图${docker.username}、${docker.password} 替换为实际的值。

2. jar包结构

进入target目录查看,有下图2个文件
在这里插入图片描述

springboot-hello-1.0.0.jar为包含依赖包的可执行包,大小50MB
springboot-hello-1.0.0.jar.original为不包含依赖包的原始包,大小1.5MB
通过对比,我们看到依赖包百分比为97%,也就是一次部署升级绝大部分的内容是不变的,变动的只是class文件、配置文件

依赖包位置如下:
在这里插入图片描述

四、分离依赖包、执行包步骤

1. 引入依赖包管理插件

拷贝pom.xml重命名为pom-with-libs.xml 移除spring-boot-maven-plugin、docker-maven-plugin添加maven-dependency-plugin、maven-jar-plugin
注意需要移除 lombok,spring-boot-devtools 依赖,实现拷贝依赖包到libs目录,并在jar指定依赖包位置和主函数。

核心配置如下:

			<!-- 将项目依赖包复制到<outputDirectory>指定的目录下 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
							<outputDirectory>${project.build.directory}/libs</outputDirectory>
							<excludeArtifactIds>lombok,spring-boot-devtools</excludeArtifactIds>
							<includeScope>runtime</includeScope><!-- 默认为test,包含所有依赖 -->
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- 将项目依赖包的路径(与上一项中的<outputDirectory>对应)添加到classPath中 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>libs</classpathPrefix>
							<mainClass>com.fly.HelloApplication</mainClass>
						</manifest>
						<manifestEntries>
							<Class-Path>./</Class-Path>
						</manifestEntries>
					</archive>
				</configuration>
			</plugin>

2. 打包验证

执行打包

mvn clean package -f pom-with-libs.xml

执行结果:
在这里插入图片描述
我们看到,已经生成了依赖包和执行包,并且执行包指定了依赖包位置‘
在这里插入图片描述
进入target 目录,运行命令 java -jar springboot-hello-libs-1.0.0.jar ,启动正常


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

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

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

相关文章

第三十二天-Django模板-DTL模板引擎

目录 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 3.与jinja2区别 4.模板标签使用 1.循环 2.条件控制 3.注释 4.url解析 5.显示时间 5.模板的基础与包含 6.过滤器 内置过滤器 自定义过滤器 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 与jinja2语法相似…

ssm 科研奖励申报管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 科研奖励申报管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

激发数据潜力:企业数据中台的策略性构建与优化_光点科技

在信息时代&#xff0c;数据是企业价值链中不可或缺的一环。构建一个策略性的企业数据中台不仅能够整合分散的数据资源&#xff0c;还能提高决策效率和业务敏捷性。本文聚焦于如何策略性地构建和优化数据中台&#xff0c;以便企业能够最大化地利用数据资源&#xff0c;推动企业…

【测试篇】测试眼里的 BUG

文章目录 如何描述一个bug如何定义 bug 的级别BUG 的生命周期跟开发起争执怎么办&#xff08;高频面试题&#xff09; 如何描述一个bug 一个合格的bug描述应该包含以下几个部分&#xff1a; 发现问题的版本问题出现的环境错误重现的步骤预期行为的描述错误行为的描述其他&…

零基础入门转录组数据分析——绘制差异火山图

零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…

google浏览器网站不安全与网站的连接不安全怎么办?

使用google谷歌浏览器访问某些网站打开时google谷歌浏览器提示网站不安全,与网站的连接不安全,您之所以会看到此警告,是因为该网站不支持https造成的怎么办? 目录 1、打开谷歌google浏览器点击右上角【┇】找到设置

深入并广泛了解Redis常见的缓存使用问题

Redis 作为一门主流技术&#xff0c;缓存应用场景非常多&#xff0c;很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存&#xff0c;也会面临各种使用问题&#xff0c;比如数据一致性&#xff0c;缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩&#…

产品推荐 | 基于华为海思ARM+Xilinx FPGA双核的8路SDI高清视频图像处理平台

一、板卡概述 PCIE703 是我司自主研制的一款基于 PCIE 总线架构的高性能综 合视频图像处理平台&#xff0c;该平台采用 Xilinx 的高性能 Kintex UltraScale 系列 FPGA 加上华为海思的高性能视频处理器来实现。 华为海思的 HI3531DV200 是一款集成了 ARM A53 四核处理 器性能强…

HarmonyOS实战开发-Stage模型下Ability的创建和使用

介绍 本篇Codelab基于Stage模型&#xff0c;对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability&#xff0c;并使用UIAbilityContext启动另一个Ability&#xff0c;然后借助Want&#xff0c;在Ability之间传递参数&#xf…

科技下乡:数字乡村改变乡村生活方式

在科技飞速发展的时代&#xff0c;数字化、信息化浪潮正以前所未有的速度席卷全球。在这场科技革命中&#xff0c;乡村不再是滞后的代名词&#xff0c;而是成为了数字乡村建设的热土。科技下乡&#xff0c;让数字乡村成为了改变乡村生活方式的重要力量。 一、科技下乡&#xf…

第三篇:3.2 广告可见性 - IAB与MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇 概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇 广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇 广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xf…

Spring 源码调试错误修复

Spring 源码调试错误修复 文章目录 Spring 源码调试错误修复1. fatal: not a git repository (or any of the parent directories): .git问题描述解决方案 2. fatal: Needed a single revision问题描述解决方案 1. fatal: not a git repository (or any of the parent director…

[实验报告]--基于端口安全

[实验报告] 目录 [实验报告] 一、项目背景 二、实验环境 三、项目规划设计 四、项目实施 五、验证项目成果 基于端口安全的 Jan16 公司网络组建 一、项目背景 Jan16 公司开发部为重要部门&#xff0c;所有员工使用指定的计算机工作&#xff0c;为防止员工或访客使 用个…

电源电路-变压器电路分析

从电路结构看这是电源模块&#xff0c;主页面是变压器一次侧电路。 电路简单分析如下&#xff1a; 1.变压器T2的1-3是一次侧输入引脚&#xff0c;5-6是一次侧输出引脚&#xff0c;看电路结构是悬空的未使用&#xff1b; 2.T2的1-3之间的器件&#xff08;D116,C605,D114,C573…

基于springboot的家庭理财管理系统的开发与实现

摘 要 在这科技不断的进步&#xff0c;让我们的生活改变了很多&#xff0c;信息技术的迅速发展&#xff0c;使各种行业在信息技术应用方面变得非常普遍。信息时代的到来&#xff0c;已成为一种必然趋势。本系统的标题是基于B/S模式的家庭理财系统的设计开发&#xff0c;其目的…

东特科技现已加入2024第13届国际生物发酵产品与技术装备展

参展企业介绍 温州东特科技有限公司是一家集设计、生产、销售及服务为一体的卫生级流体设备企业。专业从事各种乳食品、制药、化工、啤酒设备、不锈钢卫生级阀门&#xff0c;管件&#xff0c;视镜&#xff0c;及非标配件定制等产品的销售与服务。先进的设计理念专业的技术优势一…

LLM推理入门指南②:深入解析KV缓存

在本系列文章《LLM推理入门指南①&#xff1a;文本生成的初始化与解码阶段》中&#xff0c;作者对Transformer解码器的文本生成算法进行了高层次概述&#xff0c;着重介绍了两个阶段&#xff1a;单步初始化阶段&#xff0c;即提示的处理阶段&#xff0c;和逐个生成补全词元的多…

vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)

图示&#xff1a; 核心代码&#xff1a; //将0x格式的颜色转换为Hex格式&#xff0c;并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串&#xff0c;并检查是否以0x开头let newCode1 let newCode2 if (t…

python统计分析——假设概念、错误、p值和样本量

参考资料&#xff1a;python统计分析【托马斯】 1、例子 假设你在经营一家私立教育机构&#xff0c;你的合同显示&#xff1a;如果全国平均水平时100分时&#xff0c;你的学生在期末考试中得了110分&#xff0c;你就能获得奖金&#xff1b;若结果明显降低&#xff0c;你就会失…

听了中国电信关闭Wi-Fi双频合一功能之后,到底该连接2.4GHz还是5GHz频段?

前言 前段时间沸沸扬扬的关闭双频合一建议&#xff0c;小白也尝试关闭了一下&#xff0c;网络确实是好了不少。 有小伙伴还是有点疑虑&#xff0c;中国电信说的关闭Wi-Fi双频合一功能真的有用吗&#xff1f;点击下方蓝字一探究竟&#xff01; 中国电信建议关闭路由器的双频合一…