springboot多种生产打包方式教程

news2025/3/20 0:36:30

在 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
  • 运行方式:
    打包完成后会生成一个 .jar 文件(如 target/myapp.jarbuild/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 {
        @Override
        protected 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
  • 部署方式:
    将生成的 .war 文件(如 target/myapp.warbuild/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
  • 运行方式:
    打包完成后会生成一个本地可执行文件(如 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 extract
    
    FROM 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 镜像构建,减少重复层。
  • 提高镜像构建效率。
缺点:
  • 配置稍复杂。

总结

根据实际需求选择合适的打包方式:

  1. JAR 文件:简单高效,适合大多数微服务场景。
  2. WAR 文件:适合传统 Java EE 容器部署。
  3. Docker 容器:适合云原生和微服务架构。
  4. Native Image:适合高性能和快速启动需求。
  5. Layered JAR:优化 Docker 镜像构建。

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

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

相关文章

Linux系统移植篇(十)根文件系统构建 V3 - Yocto

可以简单的将 Ubuntu 理解为一个根文件系统&#xff0c;和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上&#xff0c;但是因为 I.MX6ULL 孱弱的性能&#xff0c;本章我们就只移植 Ubuntu 的最小根文件系统&…

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章&#xff0c;但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120&#xff0c;而我按照相应的步骤与对应的编译器&#xff0c;仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512&#xff0c;反而成功了。现在开…

Pycharm接入DeepSeek,提升自动化脚本的写作效率

一.效果展示&#xff1a; 二.实施步骤&#xff1a; 1.DeepSeek官网创建API key&#xff1a; 创建成功后&#xff0c;会生成一个API key&#xff1a; 2. PyCharm工具&#xff0c;打开文件->设置->插件&#xff0c;搜索“Continue”&#xff0c;点击安装 3.安装完成后&…

Windows安装Apache Maven 3.9.9

第一步下载资源 官网&#xff1a;下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 &#xff0c;需要注意MAVEN顺序应当在java之前 验证是否安装成功&#xff0c;在cmd中以管理员方式打开&#xff0c…

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…

设计一个高性能的分布式限流系统

设计一个高性能的分布式限流系统 在现代分布式系统中&#xff0c;流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化&#xff0c;系统往往需要面对突发流量或恶意攻击等场景&#xff0c;这就对限流机制提出了更高的要求。一套高性能的…

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09;七.通讯模块的完成&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 S…

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13&#xff08;T&#xff09;中新增的特性&#xff0c;用于逐像素渲染界面&#xff0c;它使用 AGSL&#xff08;Android Graphics Shading Language&#xff09;编写着色器代码&#xff0c;底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…

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…

Modbus通信协议基础知识总结

1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区&#xff0c;通过存储区代号区分&#xff1a; 输出线圈&#xff08;0x&#xff09;&#xff1a;可读写&#xff0c;对应二进制开关量&#xff08;如继电器状态&#xff09;&#xff0c;地址范围000001-065536&#xff…

AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)

AndroidStudio下载安装&#xff0c;环境部署以及常见问题解决&#xff01;&#xff01;&#xff01; 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…

Kali Linux汉化教程:轻松设置中文界面

1.打开终端 2.输入sudo dpkg-reconfigure locales&#xff0c;回车&#xff0c;输入密码&#xff0c;回车 sudo dpkg-reconfigure locales 3.往下滑&#xff0c;滑到底&#xff0c;找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…

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方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…

[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…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…