springboot多种生产打包方式教程
在 Spring Boot 项目中,打包是一个非常重要的环节,因为它决定了应用程序如何部署到生产环境中。Spring Boot 提供了多种打包方式,以满足不同的需求和环境。以下是详细的教程,介绍 Spring Boot 的多种生产打包方式以及它们的适用场景。
1. 使用 Maven/Gradle 打包为可执行 JAR 文件
这是 Spring Boot 最常用的打包方式,适用于大多数场景。通过这种方式,可以生成一个包含所有依赖的“fat jar”文件。
步骤:
-
Maven 配置:
在pom.xml中确保使用了spring-boot-maven-plugin插件:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build> -
Gradle 配置:
在build.gradle中确保使用了bootJar插件:plugins {id 'org.springframework.boot' version '3.1.0'id 'io.spring.dependency-management' version '1.1.0'id 'java' } -
打包命令:
- Maven:
mvn clean package - Gradle:
gradle clean bootJar
- Maven:
-
运行方式:
打包完成后会生成一个.jar文件(如target/myapp.jar或build/libs/myapp.jar),可以通过以下命令运行:java -jar myapp.jar
优点:
- 简单易用,适合大多数微服务架构。
- 包含所有依赖,无需额外配置外部类路径。
缺点:
- 如果依赖较多,JAR 文件可能会较大。
2. 打包为 WAR 文件
如果需要将 Spring Boot 应用部署到传统的 Java EE 容器(如 Tomcat、Jetty 等),可以选择打包为 WAR 文件。
步骤:
-
修改启动类:
将主类继承SpringBootServletInitializer并重写configure方法:@SpringBootApplication public class MyApplication extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(MyApplication.class);}public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);} } -
Maven 配置:
修改pom.xml,设置打包类型为war:<packaging>war</packaging><dependencies><!-- 排除嵌入式 Tomcat --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency> </dependencies> -
Gradle 配置:
在build.gradle中设置打包类型为war:plugins {id 'war' }dependencies {providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } -
打包命令:
- Maven:
mvn clean package - Gradle:
gradle clean war
- Maven:
-
部署方式:
将生成的.war文件(如target/myapp.war或build/libs/myapp.war)复制到目标容器的webapps目录下,并启动容器。
优点:
- 适合传统企业级应用部署。
- 可以与现有 Java EE 基础设施集成。
缺点:
- 需要额外配置外部容器。
- 不如 JAR 方便,灵活性较低。
3. 使用 Docker 容器化打包
现代微服务架构中,Docker 是一种常见的部署方式。Spring Boot 应用可以通过 Docker 容器化,实现跨平台部署。
步骤:
-
创建 Dockerfile:
在项目根目录下创建Dockerfile:# 使用官方 JDK 镜像作为基础镜像 FROM openjdk:17-jdk-slim# 设置工作目录 WORKDIR /app# 复制 JAR 文件到容器 COPY target/myapp.jar app.jar# 暴露端口 EXPOSE 8080# 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] -
构建 Docker 镜像:
先打包 JAR 文件,然后执行以下命令:docker build -t myapp:1.0 . -
运行容器:
启动容器并映射端口:docker run -d -p 8080:8080 --name myapp-container myapp:1.0
优点:
- 轻量级、跨平台。
- 易于扩展和管理,适合云原生应用。
缺点:
- 需要熟悉 Docker 技术。
- 对资源消耗有一定要求。
4. 使用 Spring Boot Native Image 打包
Spring Boot 支持通过 GraalVM 将应用编译为本地镜像(Native Image)。这种方式可以显著提升启动速度和性能。
步骤:
-
添加依赖:
在pom.xml中添加spring-boot-starter-native依赖:<dependency><groupId>org.springframework.experimental</groupId><artifactId>spring-boot-starter-native</artifactId><version>0.12.1</version> </dependency> -
安装 GraalVM:
下载并安装 GraalVM,确保环境变量配置正确。 -
打包命令:
使用 Maven 或 Gradle 打包:- Maven:
mvn -Pnative clean package - Gradle:
gradle nativeCompile
- Maven:
-
运行方式:
打包完成后会生成一个本地可执行文件(如target/myapp),直接运行即可:./myapp
优点:
- 极快的启动速度。
- 更低的内存占用。
缺点:
- 配置复杂,对兼容性有一定限制。
- 需要额外学习 GraalVM。
5. 使用 Spring Boot Layered JAR
Spring Boot 支持分层 JAR 打包,便于优化 Docker 镜像构建过程。
步骤:
-
启用分层支持:
在pom.xml中配置spring-boot-maven-plugin:<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layers><enabled>true</enabled></layers></configuration> </plugin> -
打包命令:
执行mvn clean package。 -
查看分层结构:
使用以下命令查看分层内容:java -Djarmode=layertools -jar myapp.jar list -
Dockerfile 示例:
利用分层构建更高效的镜像:FROM openjdk:17-jdk-slim as builder COPY target/myapp.jar app.jar RUN java -Djarmode=layertools -jar app.jar extractFROM openjdk:17-jdk-slim COPY --from=builder /app/dependencies/ ./ COPY --from=builder /app/spring-boot-loader/ ./ COPY --from=builder /app/snapshot-dependencies/ ./ COPY --from=builder /app/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
优点:
- 优化 Docker 镜像构建,减少重复层。
- 提高镜像构建效率。
缺点:
- 配置稍复杂。
总结
根据实际需求选择合适的打包方式:
- JAR 文件:简单高效,适合大多数微服务场景。
- WAR 文件:适合传统 Java EE 容器部署。
- Docker 容器:适合云原生和微服务架构。
- Native Image:适合高性能和快速启动需求。
- Layered JAR:优化 Docker 镜像构建。
相关文章:
springboot多种生产打包方式教程
在 Spring Boot 项目中,打包是一个非常重要的环节,因为它决定了应用程序如何部署到生产环境中。Spring Boot 提供了多种打包方式,以满足不同的需求和环境。以下是详细的教程,介绍 Spring Boot 的多种生产打包方式以及它们的适用场…...
Linux系统移植篇(十)根文件系统构建 V3 - Yocto
可以简单的将 Ubuntu 理解为一个根文件系统,和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上,但是因为 I.MX6ULL 孱弱的性能,本章我们就只移植 Ubuntu 的最小根文件系统&…...
pnpm创建vite
pnpm创建vite 在创建一个使用 Vite 的项目时,你可以通过 PNPM(一个快速、节省磁盘空间的包管理器)来简化依赖管理。以下是如何使用 PNPM 创建一个 Vite 项目的步骤: 安装 PNPM 如果你还没有安装 PNPM,可以通过 npm&…...
NAT技术-初级总结
NAT–网络地址转换 NAT基本逻辑是实现公网IP地址和私网IP地址的转换 华为设备所有NAT相关的配置都是在边界路由器的出接口上配置 1.静态NAT–一对一 就是在我们私网边界路由器上建立维护一张静态地址映射表,这张表 反映的是公网IP地址和私网IP地址之间一一对应的关系 只能一个…...
E902基于bash与VCS的仿真环境建立
网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…...
LuaJIT 学习(4)—— FFI 语义
文章目录 C Language SupportC Type Conversion RulesConversions from C types to Lua objects例子:访问结构体成员 Conversions from Lua objects to C typesConversions between C types例子:修改结构体成员 Conversions for vararg C function argum…...
Pycharm接入DeepSeek,提升自动化脚本的写作效率
一.效果展示: 二.实施步骤: 1.DeepSeek官网创建API key: 创建成功后,会生成一个API key: 2. PyCharm工具,打开文件->设置->插件,搜索“Continue”,点击安装 3.安装完成后&…...
Windows安装Apache Maven 3.9.9
第一步下载资源 官网:下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 ,需要注意MAVEN顺序应当在java之前 验证是否安装成功,在cmd中以管理员方式打开,…...
jmeter将返回的数据写入csv文件
举例说明,我需要接口返回体中的exampleid与todoid的数据信息(使用边界提取器先将其提取),并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…...
设计一个高性能的分布式限流系统
设计一个高性能的分布式限流系统 在现代分布式系统中,流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化,系统往往需要面对突发流量或恶意攻击等场景,这就对限流机制提出了更高的要求。一套高性能的…...
[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信
基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯(飞控部分)六.移植2.4g通讯(遥控部分)七.通讯模块的完成(遥控部分) 一.Si24Ri原理图 S…...
【Android】RuntimeShader 应用
1 简介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...
Skia 图形引擎介绍
文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...
jQuery从入门到应用:选择器、DOM与Ajax综合指南
文章目录 前言jQuery对象1、jQuery的使用在需要使用jQuery的页面引入Js文件使用jQuery选择页面元素并获取其文本内容 2、jQuery包装集与Dom对象DOM对象和jQuery对象的选择及互相转换 jQuery对象关键点说明: jQuery选择器1、基础选择器关键点说明 2、层次选择器关键点…...
10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)
1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…...
手搓智能音箱——语音识别及调用大模型回应
一、代码概述 此 Python 代码实现了一个语音交互系统,主要功能为监听唤醒词,在唤醒后接收用户语音问题,利用百度语音识别将语音转换为文本,再调用 DeepSeek API 获取智能回复,最后使用文本转语音功能将回复朗读出来。 …...
Modbus通信协议基础知识总结
1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区,通过存储区代号区分: 输出线圈(0x):可读写,对应二进制开关量(如继电器状态),地址范围000001-065536ÿ…...
vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动
1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...
使用 CryptoJS 实现 AES 解密:动态数据解密示例
在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...
Go语言对于MySQL的基本操作
一.下载依赖 终端中输入: go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…...
AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)
AndroidStudio下载安装,环境部署以及常见问题解决!!! 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …...
开源免费一句话生成儿童故事视频核心思想解析
再看一个演示视频,学会核心思想后,可以打造自己的内容生成工具,后文有基于飞书多维表格的实现效果: 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具,可根据用户输入的主题,快速…...
数据结构——最短路(BFS,Dijkstra,Floyd)
完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型: 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…...
Kali Linux汉化教程:轻松设置中文界面
1.打开终端 2.输入sudo dpkg-reconfigure locales,回车,输入密码,回车 sudo dpkg-reconfigure locales 3.往下滑,滑到底,找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…...
分布式锁: 并发时,redis如何避免删别人的锁
在使用Redis实现分布式锁的时候,如何避免在并发情况下误删别人的锁。首先,分布式锁的基本概念:是多个客户端在访问共享资源时,通过某种机制来确保同一时间只有一个客户端能持有锁。 Redis通常用SET命令加上NX选项来创建锁…...
Leetcode 160 Intersection of Two Linked Lists
题意 给定两个链表,找这两个链表第一个公共节点,如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表(记录为表A,表B)的表…...
【八股文】从浏览器输入一个url到服务器的流程
1.url解析与DNS解析 浏览器解析用户输入的URL,提取协议(HTTP\HTTPS)、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存,若未命中,查询本地hosts文件 最后递归查询向本地DNS服务器发起请求ÿ…...
C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval
目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议) 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...
超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction
1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术,广泛应用于医学影像领域。通过重建和可视化三维结构,3D超声能够显著提高诊断精度和效率,同时减少医生的脑力负担。本技术文档将详细阐述…...
[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议
由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…...
