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

文章目录

  • 一、概述
  • 二、工程概况
    • 1. 代码原始结构
    • 2. 运行界面
  • 三、常规打包
    • 1. 打包命令
    • 2. jar包结构
  • 四、分离依赖包、执行包步骤
    • 1. 引入依赖包管理插件
    • 2. 打包验证
  • 五、分离后构建docker 镜像
    • 1. 借助Dockerfile
    • 2. docker-maven-plugin实现
  • 六、版本升级

一、概述

某大数据项目,使用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 ,启动正常

五、分离后构建docker 镜像

具体分2种方式,简单说明如下

1. 借助Dockerfile

具体见
在这里插入图片描述
测试时,将Dockerfile pom.xml移动上一层目录,运行mvn clean package即可。

2. docker-maven-plugin实现

具体参见: pom-with-libs-docker.xml
核心配置为:在这里插入图片描述

测试时,运行mvn clean package -f pom-with-libs-docker.xml即可

六、版本升级

依赖包未变化的情况下,只需修改Dockerfile文件类似下面内容即可

FROM registry.cn-shanghai.aliyuncs.com/00fly/springboot-hello-libs:1.0.0
COPY target/*.jar  /app.jar

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

-over-

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡通纸箱空空如也404源码

源码介绍 卡通纸箱空空如也404源码&#xff0c;喜欢的小伙伴可以下方预览看看&#xff0c;满意之后下载放到任何目录都可以使用&#xff01; 源码下载 卡通纸箱空空如也404源码

Android获取本地文件目录

一、实现效果 一个简单的demo。点击按钮&#xff0c;获取本地文件目录&#xff0c;可以选择图片&#xff0c;展示选取的对应图片和展示存储路径。如图所示&#xff1a; 二、实现方式 1. 权限 AndroidManifest.xml文件里面添加权限 <uses-permission android:name"a…

Free RTOS day2

1.思维导图 2.使用PWMADC光敏电阻完成光控灯的实验 int adc_val0;//用于保存ADC采样得到的数值 float volt0;//用于保存电压值 int main(void) {MX_GPIO_Init();MX_DMA_Init();MX_TIM1_Init();MX_USART1_UART_Init();MX_ADC_Init();MX_TIM3_Init();HAL_TIM_PWM_Start(&hti…

ES学习日记(七)-------Kibana安装和简易使用

前言 首先明确一点&#xff0c;Kibana是一个软件&#xff0c;不是插件。 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic stack 成员之一&#xff0c;设计用于和Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索&#xff0c;…

【Go】十五、接口、多态、断言

文章目录 1、接口的引入2、接口3、接口的注意点4、多态5、断言6、Type Switch 1、接口的引入 以日常生活中打招呼为例&#xff0c;定义接口规范&#xff0c;各国人为打招呼为具体的实现 package main import "fmt"//接口的定义&#xff1a;定义规则、定义规范&…

【Ubuntu】用 VMware 安装 macOS

本教程使用 Ubuntu 20.04.6 LTS&#xff0c;VMware Workstation Pro 17.5.1&#xff0c;macOS Sonoma 14.4。文中所有需要的下载链接均以 Markdown 的形式体现在文字上。 下载 VMware Workstation Pro&#xff0c;目前最新版本是 17.5.1。 使用密钥&#xff0c;进行破解。 VM…

4.1作业

对菱形继承给出的代码中每一个类&#xff0c;写一个有参构造函数写出下列类的&#xff0c;构造函数(有参、无参)&#xff0c;析构函数&#xff0c;拷贝构造函数和拷贝赋值函数 class Father { int *p; const string name; } class Son:public Father { int *age; 3整理思维导图…

51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线&#xff1a;电源线&#xff1a;备用电池连接&#xff1a; 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …

linux时间同步工具chrony的配置和时间设置的相关说明

目录 目录 介绍 1.搭建ntp服务器 2.配置ntp客户端 3.其他设置 4.客户端无法进行时间同步 介绍 目前比较流行的时间同步工具有ntpd和chrony&#xff0c;ntpd采用123/UDP端口通信&#xff0c;chrony采用323/UDP端口通信。Centos7以上版本默认安装chrony服务来同步时间&#x…

《系统架构设计师教程(第2版)》第8章-系统质量属性与架构评估-02-系统架构评估

文章目录 1. 一些重要概念1.1 敏感点 (Sensitivity Point)1.2 权衡点 (Tradeoff Point)1.3 风险承担者 (Stakeholders)1.3.1 系统生产者1.3.2 系统消费者1.3.3 系统服务人员1.3.4 其它人员 1.4 场景 (scenarios) 2. 系统架构评估方法2.1 基于场景的架构分析方法&#xff08;SAA…

【漏洞复现】Wordpress saveconfiguration接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

怎么在UE游戏中加入原生振动效果

我是做振动触感的。人类的五感“视听嗅味触”&#xff0c;其中的“触”就是触觉&#xff0c;是指皮肤、毛发与物体接触时的感觉。触感可以带来更加逼真的沉浸式体验。但也许过于司空见惯&#xff0c;也是习以为常&#xff0c;很多人漠视了触感的价值。大家对触感的认知还远远不…