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

一、概述

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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Spring Boot应用程序打包Docker镜像,你可以按照以下步骤进行操作: 1. 创建一个Dockerfile:Dockerfile是一个文本文件,用于定义如何构建Docker镜像。在Dockerfile中,你需要指定基础镜像、复制应用程序文件、设置工作目录和运行应用程序的命令。你可以参考引用中提到的Dockerfile示例。 2. 构建Docker镜像:使用Docker命令来构建镜像。在命令行中,进入到Dockerfile所在的目录,并执行以下命令: ``` docker build -t <image-name> . ``` 其中,`<image-name>`是你要为镜像指定的名称。 3. 运行Docker容器:构建镜像后,你可以使用以下命令来运行Docker容器: ``` docker run -d -p <host-port>:<container-port> <image-name> ``` 其中,`<host-port>`是你要映射的主机端口,`<container-port>`是容器内部应用程序所监听的端口,`<image-name>`是之前构建镜像名称。 通过以上步骤,你就可以将Spring Boot应用程序成功打包Docker镜像,并在Docker容器中运行了。你可以参考引用和中提供的参考链接,了解更多关于将Spring Boot应用程序打包Docker镜像的详细步骤和配置信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Docker打包springboot工程镜像](https://blog.csdn.net/ITwangnengjie/article/details/109750524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [应用的容器化-docker打包spring boot镜像](https://blog.csdn.net/inthat/article/details/83049309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值