Spring Boot 项目打包成 JAR 并部署运行(实战完整版)

Spring Boot 项目打包成 JAR 并部署运行(实战完整版)

在Spring Boot项目开发完成后(如前文实现的用户管理CRUD项目),下一步就是「打包部署」——将项目打包成可执行JAR包,部署到服务器(或本地)运行,脱离开发工具(IDEA)的依赖,实现项目独立运行。

本文基于前文实战项目(Spring Boot 2.7.x + MyBatis-Plus + 统一返回 + 全局异常 + Swagger),手把手讲解「打包配置→打包操作→本地部署→服务器部署」全流程,重点说明打包注意事项、常见报错排查,以及部署后的验证方法,贴合新手实战,避免踩坑。

核心说明:Spring Boot 内置了 Tomcat 容器(spring-boot-starter-web 依赖已包含),因此打包成 JAR 包后,无需额外部署 Tomcat,可直接通过命令启动运行,简化部署流程(这也是Spring Boot 部署便捷性的核心优势)。

一、打包前准备(关键,避免打包失败)

打包前需完成3项准备工作,确保打包后能正常运行,尤其适配前文包含Swagger、数据库连接、全局异常的项目,避免因配置缺失导致部署失败。

1. 核对项目配置(核心避坑)

重点核对 application.yml(或 application.properties)配置,避免因开发环境配置导致部署后无法运行:

server:
  port: 8081  # 部署后项目端口,确保服务器该端口未被占用
  servlet:
    context-path: /crud-demo  # 项目上下文路径,部署后访问路径需包含(无则省略)

# 数据库配置(部署到服务器时,需改为服务器数据库地址,本地部署可保持不变)
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false
    username: root  # 数据库用户名(服务器部署需改为服务器数据库用户名)
    password: 123456  # 数据库密码(服务器部署需改为服务器数据库密码)
  # 404异常捕获配置(前文添加,保持不变)
  mvc:
    throw-exception-if-no-handler-found: true
  web:
    resources:
      add-mappings: false

# MyBatis-Plus 配置(保持不变)
mybatis-plus:
  mapper-locations: classpath:mapper/**/*.xml  # 若有XML映射文件,确保路径正确
  type-aliases-package: com.example.cruddemo.entity
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志配置,部署后可关闭(减少日志冗余)

# Swagger 配置(可选,生产环境建议关闭,避免暴露接口)
knife4j:
  production: false  # true=关闭Swagger,false=开启(开发/测试环境开启,生产环境关闭)

关键提醒:

  • 数据库配置:本地部署可保持 localhost,服务器部署需改为「服务器IP地址」(如 jdbc:mysql://192.168.1.100:3306/test_db),同时确保服务器数据库已创建对应数据库(test_db)、用户名密码正确,且数据库允许外部访问;

  • 端口配置:确保部署环境(本地/服务器)的 8081 端口未被其他程序占用,若占用可修改 port 配置(如 8080、8888);

  • Swagger 开关:生产环境部署时,将 knife4j.production 改为 true,关闭Swagger文档,提升系统安全性。

2. 核对 pom.xml 打包配置(必做)

Spring Boot 项目打包成 JAR 包,核心依赖是 spring-boot-maven-plugin,前文项目已引入(若未引入,需手动添加),确保配置正确,否则无法打包成可执行JAR。

<!-- pom.xml 核心配置,确保存在 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>  # 与前文项目版本一致,避免兼容性问题
    <relativePath/>
</parent>

<!-- 打包类型:JAR 包(默认就是jar,可省略,但建议显式指定) -->
<packaging>jar</packaging>

<!-- 可执行JAR打包插件(核心,必须添加) -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.7.10</version>  # 与Spring Boot版本一致
            <configuration>
                <mainClass>com.example.cruddemo.CrudDemoApplication</mainClass>  # 启动类全路径(关键!)
                <fork>true</fork>  # 允许独立运行,避免依赖开发环境
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>  # 重打包,生成可执行JAR
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

    <!-- 可选:指定打包后的JAR包名称(默认是 项目名-版本号.jar,如 crud-demo-0.0.1-SNAPSHOT.jar) -->
    <finalName>crud-demo</finalName>
</build>

关键提醒:

  • mainClass 配置:必须是项目启动类的全路径(如 com.example.cruddemo.CrudDemoApplication),否则打包后的JAR包无法启动(报错“找不到主类”);

  • 版本一致性:spring-boot-maven-plugin 的版本必须与 Spring Boot 父依赖版本一致,避免兼容性问题;

  • finalName 配置:可选,指定后打包后的JAR包名称为 crud-demo.jar(简洁易记),默认名称包含版本号,不影响使用。

3. 清理项目编译文件(可选,避免缓存影响)

若项目之前编译过,可能存在缓存文件,导致打包失败或打包后运行异常,可在IDEA中清理:

  1. 点击IDEA顶部「Build」→ 选择「Clean Project」,清理编译后的class文件;

  2. 点击「Build」→ 选择「Rebuild Project」,重新编译项目,确保无编译报错。

确认:项目无红色报错,启动类能正常启动(本地运行无问题),再进行打包操作。

二、两种打包方式(IDEA可视化 + Maven命令,任选其一)

Spring Boot 项目打包JAR有两种常用方式,适配不同场景:IDEA可视化操作适合新手(简单直观),Maven命令适合无IDEA环境(如服务器打包),两种方式最终效果一致。

方式1:IDEA可视化打包(新手首选)

步骤简单,无需记忆命令,全程鼠标操作,贴合前文项目的开发环境:

  1. 打开IDEA,找到右侧「Maven」工具栏(若未显示,点击顶部「View」→「Tool Windows」→「Maven」调出);

  2. 在Maven工具栏中,展开项目「crud-demo」→「Lifecycle」;

  3. 先点击「clean」:清理之前的打包文件(若有),控制台显示「BUILD SUCCESS」即为清理成功;

  4. 再点击「package」:开始打包,控制台会打印打包日志,等待1-3分钟(根据项目大小);

  5. 打包成功标志:控制台显示「BUILD SUCCESS」,同时项目根目录下会生成「target」文件夹;

  6. 找到JAR包:打开target文件夹,即可看到打包后的JAR包(如 crud-demo.jar,若未配置finalName,则为 crud-demo-0.0.1-SNAPSHOT.jar)。

补充:若点击package时报错,优先查看控制台报错信息(如“找不到主类”“依赖缺失”“编译报错”),对照前文准备工作排查(重点核对mainClass配置、项目无编译报错)。

方式2:Maven命令打包(通用,无IDEA也能使用)

适合无IDEA环境(如服务器部署时直接打包),或习惯使用命令行的开发者,步骤:

  1. 打开项目根目录(找到 pom.xml 文件所在的目录,前文项目根目录为 crud-demo);

  2. 打开命令行(Windows:CMD/PowerShell;Mac/Linux:终端),切换到项目根目录(命令:cd 项目路径,如 cd D:\idea-projects\crud-demo);

  3. 执行清理命令:mvn clean,等待执行完成(显示 BUILD SUCCESS);

  4. 执行打包命令:mvn package,命令执行过程中会自动下载缺失的依赖(确保网络通畅);

  5. 打包成功后,同样在 target 文件夹中找到JAR包,与方式1效果一致。

常用命令补充:

  • mvn clean package -DskipTests:打包时跳过单元测试(若项目有测试用例报错,可使用该命令,避免测试报错影响打包);

  • mvn clean install:打包并将JAR包安装到本地Maven仓库(用于多模块项目依赖),前文单模块项目无需使用。

打包后验证(可选,提前规避部署失败)

打包完成后,可先在本地验证JAR包是否能正常启动,避免部署到服务器后才发现问题:

  1. 复制 target 文件夹中的 JAR 包(如 crud-demo.jar),粘贴到任意目录(如桌面,便于操作);

  2. 打开命令行,切换到JAR包所在目录(如 cd C:\Users\XXX\Desktop);

  3. 执行启动命令:java -jar crud-demo.jar

  4. 验证启动成功:控制台打印Spring Boot启动日志,无报错,且显示「Started CrudDemoApplication in XX seconds」。

若本地启动成功,说明JAR包无问题,可放心部署到服务器;若启动失败,优先排查配置文件(如数据库连接、端口占用)。

三、部署运行(本地部署 + 服务器部署,实战落地)

部署分为「本地部署」(用于测试JAR包)和「服务器部署」(正式运行),两者核心命令一致,重点讲解服务器部署的细节和避坑点,适配前文实战项目的接口访问。

场景1:本地部署(测试用,简单)

本地部署即直接运行打包后的JAR包,脱离IDEA,步骤与「打包后验证」一致,补充两个实用操作:

1. 普通启动(控制台关闭则项目停止)

命令:java -jar crud-demo.jar

适用场景:临时测试,启动后控制台不能关闭,关闭控制台则项目停止运行。

2. 后台启动(Windows,控制台关闭不影响)

Windows环境下,可通过命令让项目在后台运行,关闭控制台后项目继续运行:

:: 方式1:生成日志文件(推荐,便于排查问题)
java -jar crud-demo.jar > crud-demo.log 2>&1 &

:: 方式2:不生成日志文件
start javaw -jar crud-demo.jar

说明:

  • 方式1:会在JAR包所在目录生成 crud-demo.log 文件,项目运行日志、报错信息都会写入该文件,便于排查问题;

  • 停止项目:打开任务管理器,找到「javaw.exe」进程,结束进程即可。

3. 本地部署验证接口

项目启动成功后,通过浏览器/Swagger/Postman验证接口(与IDEA中一致):

  • Swagger文档(开启状态):http://localhost:8081/crud-demo/doc.html;

  • 查询所有用户接口:http://localhost:8081/crud-demo/api/user/list;

  • 若能正常访问接口、返回统一格式结果,说明本地部署成功。

场景2:服务器部署(正式运行,重点)

服务器部署是项目上线的核心操作,本文以「Linux服务器」为例(最常用),步骤清晰,贴合新手,同时适配前文项目的数据库、接口配置。

前置条件(服务器需准备)
  1. 服务器环境:Linux(CentOS 7/8 或 Ubuntu,本文以CentOS 7为例);

  2. 安装JDK:Spring Boot 2.7.x 需 JDK 8 及以上版本(与开发环境JDK版本一致,避免兼容性问题);

  3. 安装MySQL:服务器需安装MySQL(与前文项目数据库版本一致,如MySQL 8.0),并创建对应数据库(test_db)、导入表结构(前文user表);

  4. 开放端口:服务器防火墙开放项目端口(8081)和数据库端口(3306),避免端口被拦截。

补充:JDK、MySQL安装步骤(简化):

  • JDK安装:yum install java-1.8.0-openjdk-devel,安装完成后执行 java -version 验证;

  • MySQL安装:参考MySQL官方文档,安装后启动MySQL服务,创建test_db数据库,授权用户(允许外部访问);

  • 开放端口(CentOS 7):
    `# 开放8081端口
    firewall-cmd --zone=public --add-port=8081/tcp --permanent

开放3306端口(数据库)

firewall-cmd --zone=public --add-port=3306/tcp --permanent

重新加载防火墙配置

firewall-cmd --reload`

服务器部署步骤(全程命令行)
  1. 上传JAR包到服务器:

    • 方式1:使用Xshell + Xftp(推荐),连接服务器后,通过Xftp将本地的 crud-demo.jar 上传到服务器指定目录(如 /usr/local/springboot ,需提前创建目录:mkdir -p /usr/local/springboot);

    • 方式2:使用scp命令上传(Windows/Mac终端):scp 本地JAR路径 root@服务器IP:/usr/local/springboot(如 scp C:\Users\XXX\Desktop\crud-demo.jar root@192.168.1.100:/usr/local/springboot)。

  2. 连接服务器,切换到JAR包所在目录:
    ssh root@服务器IP # 连接服务器(输入密码) cd /usr/local/springboot # 切换到JAR包所在目录

  3. 修改JAR包权限(避免无法执行):
    chmod 755 crud-demo.jar # 赋予执行权限(755为通用权限,可执行、可读)

  4. 启动项目(Linux后台启动,推荐两种方式):
    方式1:简单后台启动(适合临时测试)nohup java -jar crud-demo.jar > crud-demo.log 2>&1 &
    说明:方式2:编写启动脚本(适合正式部署,便于管理)创建启动脚本(start.sh),可快速启动、停止项目,步骤:`# 1. 创建启动脚本
    vi start.sh

2. 写入以下内容(复制粘贴,修改JAR包名称和日志路径)

#!/bin/bash

项目JAR包名称

JAR_NAME=crud-demo.jar

日志文件名称

LOG_NAME=crud-demo.log

停止之前运行的项目(避免端口占用)

pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') if [ -n "pid" ]; then
kill -9 pidecho"已停止之前运行的项目,PID:pid echo "已停止之前运行的项目,PID:pidecho"已停止之前运行的项目,PIDpid"
fi

后台启动项目,输出日志到指定文件

nohup java -jar $JAR_NAME > $LOG_NAME 2>&1 &

输出启动信息

echo “项目启动中…”
sleep 3
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') if [ -n "pid" ]; then
echo “项目启动成功,PID:pid,日志路径:pid,日志路径:pid,日志路径:(pwd)/LOGNAME"elseecho"项目启动失败,请查看日志:LOG_NAME" else echo "项目启动失败,请查看日志:LOGNAME"elseecho"项目启动失败,请查看日志:(pwd)/$LOG_NAME”
fi

3. 保存并退出vi编辑器(按Esc,输入:wq,回车)

4. 赋予脚本执行权限

chmod 755 start.sh

5. 启动项目

./start.sh`

- nohup:表示后台启动,关闭终端(Xshell)后项目继续运行;

- crud-demo.log:日志文件,项目运行日志、报错信息都会写入,便于排查问题;

- 执行命令后,会返回一个进程ID(PID),如 [1] 12345,记录PID便于后续停止项目。
  1. 验证项目启动成功:
    `# 方式1:查看进程(确认项目是否在运行)
    ps -ef | grep crud-demo.jar

方式2:查看日志(确认无报错)

tail -f crud-demo.log # 实时查看日志,按Ctrl+C退出

方式3:访问接口(验证功能)

curl http://localhost:8081/crud-demo/api/user/list # 访问查询所有用户接口`启动成功标志:进程存在、日志无报错、curl命令能返回统一格式的JSON结果(即使无数据,返回{“code”:200,“msg”:“操作成功”,“data”:[]}也属于正常)。

  1. 外部访问验证(关键):
    在本地浏览器/Postman中,通过「服务器IP+端口+上下文路径」访问接口,如:http://192.168.1.100:8081/crud-demo/api/user/list若能正常访问,说明服务器部署成功;若无法访问,优先排查服务器防火墙端口是否开放、项目端口是否被占用、数据库连接是否正确。
服务器部署常用操作(必记)
  • 停止项目:
    `# 方式1:通过PID停止(已知PID)
    kill -9 12345(12345为项目PID)

方式2:通过JAR包名称停止(通用)

pid=$(ps -ef | grep crud-demo.jar | grep -v grep | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') if [ -n "pid" ]; then
kill -9 $pid
echo “项目已停止”
else
echo “项目未在运行”
fi`

  • 重启项目:
    `# 方式1:停止后重新启动
    kill -9 12345
    nohup java -jar crud-demo.jar > crud-demo.log 2>&1 &

方式2:使用启动脚本(推荐)

./start.sh # 脚本会自动停止之前的进程,再重启`

  • 查看日志(排查问题):
    tail -f crud-demo.log # 实时查看日志(最新10行) cat crud-demo.log # 查看全部日志 grep "ERROR" crud-demo.log # 筛选报错信息(快速排查问题)

四、常见报错排查(新手必看,规避90%部署问题)

打包/部署过程中,新手容易遇到各种报错,以下整理高频报错及解决方案,结合前文项目场景,快速排查:

报错1:打包时报错「Could not find or load main class XXX」(找不到主类)

✅ 报错原因:pom.xml 中 spring-boot-maven-plugin 的 mainClass 配置错误(路径写错、启动类名称错误),或未配置mainClass。

✅ 解决方案:核对 mainClass 配置,确保是启动类的全路径(如 com.example.cruddemo.CrudDemoApplication),与项目启动类路径完全一致。

报错2:启动JAR包时报错「Port 8081 was already in use」(端口被占用)

✅ 报错原因:部署环境(本地/服务器)的 8081 端口已被其他程序占用。

✅ 解决方案:
方案1:关闭占用端口的程序(Linux:netstat -tulnp | grep 8081 查看占用进程,再 kill -9 PID 停止);方案2:修改项目端口(修改 application.yml 的 server.port 配置,如改为 8080,重新打包部署)。

报错3:启动后访问接口,报错「数据库连接失败」(Access denied for user ‘root’@‘localhost’)

✅ 报错原因:application.yml 中数据库配置错误(用户名/密码错误、数据库地址错误、数据库未创建),或服务器数据库不允许外部访问。

✅ 解决方案:
核对数据库用户名、密码,确保正确;服务器部署:将数据库 url 改为服务器IP(如 jdbc:mysql://192.168.1.100:3306/test_db);确认服务器数据库已创建 test_db 数据库,且 user 表已导入;授权数据库用户:grant all privileges on test_db.* to 'root'@'%' identified by '123456';(允许root用户从任意IP访问test_db数据库)。

报错4:服务器部署后,本地无法访问接口(curl服务器本地能访问,外部不行)

✅ 报错原因:服务器防火墙未开放项目端口(8081),或服务器开启了安全组(如阿里云、腾讯云服务器),未开放对应端口。

✅ 解决方案:
CentOS 7 开放端口:firewall-cmd --zone=public --add-port=8081/tcp --permanent,再 firewall-cmd --reload;云服务器(阿里云/腾讯云):登录控制台,找到「安全组」,添加 inbound 规则,开放 8081 端口(允许所有IP访问,或指定本地IP)。

报错5:启动JAR包时报错「No qualifying bean of type ‘XXXMapper’ available」(Mapper注入失败)

✅ 报错原因:打包时未将 Mapper 接口扫描到,或启动类未添加 @MapperScan 注解(前文项目已添加,可能打包时缓存导致)。

✅ 解决方案:
确认启动类添加了 @MapperScan(“com.example.cruddemo.mapper”) 注解;重新执行 mvn clean package 打包(清理缓存),再重新部署。

报错6:启动后访问Swagger文档,报404(本地能访问,服务器不能访问)

✅ 报错原因:1. 服务器部署时,Swagger 被关闭(knife4j.production=true);2. 上下文路径配置错误,访问路径写错。

✅ 解决方案:
测试环境:将 knife4j.production 改为 false,重新打包部署;确认访问路径:http://服务器IP:8081/crud-demo/doc.html(包含上下文路径 /crud-demo)。

五、部署优化建议(贴合企业实战)

  1. 日志管理:正式部署时,不要将日志写入JAR包所在目录,建议配置日志输出到专门的日志目录(如 /var/log/springboot),并定期清理日志(避免日志文件过大);

  2. 配置文件分离:将 application.yml 配置文件从JAR包中分离出来,单独放在服务器目录(如 /usr/local/springboot/config),修改配置时无需重新打包,直接修改配置文件并重启项目即可(需修改启动命令:java -jar crud-demo.jar --spring.config.location=/usr/local/springboot/config/application.yml);

  3. 开机自启:正式部署时,配置项目开机自启(避免服务器重启后项目停止),可通过编写systemd服务实现;

  4. 生产环境优化:关闭Swagger、关闭SQL日志(log-impl配置注释),减少系统资源占用;使用JDK优化参数启动(如 nohup java -Xms512m -Xmx1024m -jar crud-demo.jar > crud-demo.log 2>&1 &,设置JVM内存);

  5. 备份策略:定期备份JAR包、配置文件和数据库,避免项目故障导致数据丢失。

六、总结

本文基于前文实战项目(Spring Boot + MyBatis-Plus + 统一返回 + 全局异常 + Swagger),完整实现了「打包配置→打包操作→本地部署→服务器部署」全流程,核心要点总结:

  • 打包核心:确保 pom.xml 中 spring-boot-maven-plugin 配置正确(重点是 mainClass),项目无编译报错,配置文件(数据库、端口)适配部署环境;

  • 打包方式:IDEA可视化操作适合新手,Maven命令适合无IDEA环境,两种方式均可,打包后优先本地验证JAR包;

  • 部署核心:本地部署适合测试,服务器部署重点关注JDK、MySQL、防火墙配置,后台启动项目并验证外部访问;

  • 避坑关键:遇到报错优先查看日志,重点排查主类配置、端口占用、数据库连接、防火墙端口开放,结合前文项目场景快速定位问题。

通过本文的步骤,你可以将前文开发的用户管理CRUD项目,成功打包成JAR包并部署到服务器独立运行,完成从「开发」到「部署」的全流程落地。后续可根据项目需求,扩展部署优化(如配置分离、开机自启、集群部署),贴合企业实际开发规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值