Spring Boot打包Jar文件的运行方法与实战指导
一、引言
Spring Boot作为Java生态中最流行的微服务开发框架之一,其核心优势之一就是**"一键打包,独立运行"**的特性。通过Spring Boot的spring-boot-maven-plugin或spring-boot-gradle-plugin,开发者可以将整个应用(包括依赖、配置文件和资源)打包成一个可执行的Jar文件,极大简化了应用的部署和运行流程。
本文将详细介绍Spring Boot应用的Jar打包配置、运行方法、实战案例以及常见问题排查,帮助开发者掌握Spring Boot应用的完整生命周期管理。
二、Spring Boot Jar打包的核心原理
Spring Boot打包的Jar文件与普通Java Jar文件有所不同,它包含了:
- 应用的编译class文件
- 所有依赖的第三方库(嵌套Jar)
- Spring Boot启动器(Spring Boot Loader)
- 配置文件和静态资源
Spring Boot通过Spring Boot Loader实现了嵌套Jar的加载机制,允许主Jar直接运行,无需解压或单独管理依赖。
三、Maven项目的打包配置
3.1 基本配置(默认方式)
对于Maven项目,Spring Boot提供了spring-boot-maven-plugin插件,在pom.xml中添加以下配置即可:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 可选:指定插件版本 -->
<version>3.3.5</version>
</plugin>
</plugins>
</build>3.2 执行打包命令
在项目根目录下执行以下Maven命令:
# 清理并打包(跳过测试)
mvn clean package -DskipTests
# 或只执行打包
mvn package -DskipTests打包成功后,会在target目录下生成两个Jar文件:
myapp-0.0.1-SNAPSHOT.jar:可执行Jar(包含所有依赖)myapp-0.0.1-SNAPSHOT-plain.jar:普通Jar(仅包含应用class文件)
3.3 自定义配置
3.3.1 自定义Jar文件名
<build>
<finalName>my-springboot-app</finalName>
<plugins>
<!-- spring-boot-maven-plugin -->
</plugins>
</build>3.3.2 排除特定依赖
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>四、Gradle项目的打包配置
4.1 基本配置
对于Gradle项目,Spring Boot提供了spring-boot-gradle-plugin插件,在build.gradle或build.gradle.kts中配置:
Groovy语法(build.gradle):
plugins {
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
springBoot {
mainClass = 'com.example.demo.DemoApplication'
}Kotlin语法(build.gradle.kts):
plugins {
id("org.springframework.boot") version "3.3.5"
id("io.spring.dependency-management") version "1.1.6"
java
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
springBoot {
mainClass.set("com.example.demo.DemoApplication")
}4.2 执行打包命令
# 清理并打包(跳过测试)
./gradlew clean bootJar -x test
# 或只执行打包
./gradlew bootJar -x test打包成功后,会在build/libs目录下生成可执行Jar文件。
五、Spring Boot Jar的运行方法
5.1 基本运行命令
Spring Boot Jar文件可以直接通过java -jar命令运行:
java -jar myapp-0.0.1-SNAPSHOT.jar5.2 常见运行参数
5.2.1 指定配置文件
# 使用特定的application.yml
java -jar myapp.jar --spring.config.location=classpath:/custom.yml
# 使用外部配置文件
java -jar myapp.jar --spring.config.location=/opt/config/application.yml
# 同时使用多个配置文件
java -jar myapp.jar --spring.config.location=classpath:/default.yml,/opt/config/custom.yml5.2.2 指定Spring Profile
# 激活dev环境
java -jar myapp.jar --spring.profiles.active=dev
# 激活多个环境
java -jar myapp.jar --spring.profiles.active=dev,test5.2.3 配置JVM参数
# 配置堆内存大小
java -Xms512m -Xmx1024m -jar myapp.jar
# 配置GC日志
java -Xlog:gc*:file=/opt/logs/gc.log -jar myapp.jar
# 组合JVM参数和应用参数
java -Xms512m -Xmx1024m -jar myapp.jar --spring.profiles.active=prod5.2.4 后台运行(Linux)
# 使用nohup后台运行
nohup java -jar myapp.jar > app.log 2>&1 &
# 使用systemd管理(推荐)
# 创建/etc/systemd/system/myapp.service文件六、实战案例:从打包到部署的完整流程
6.1 案例背景
假设有一个Spring Boot Web应用demo-app,需要打包并部署到Linux服务器。
6.2 打包步骤
- 配置pom.xml:添加
spring-boot-maven-plugin - 执行打包命令:
mvn clean package -DskipTests - 验证Jar文件:
ls -lh target/demo-app-0.0.1-SNAPSHOT.jar
6.3 部署运行
-
上传Jar文件:使用scp或rsync上传到服务器
scp target/demo-app-0.0.1-SNAPSHOT.jar user@server:/opt/apps/ -
创建配置文件:在服务器上创建
application-prod.ymlserver: port: 8081 spring: datasource: url: jdbc:mysql://localhost:3306/demo_db username: root password: password -
运行应用:
cd /opt/apps/ nohup java -Xms512m -Xmx1024m -jar demo-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod --spring.config.location=classpath:/application.yml,/opt/apps/application-prod.yml > app.log 2>&1 & -
验证运行状态:
# 查看日志 tail -f app.log # 检查端口 netstat -tuln | grep 8081 # 测试接口 curl http://localhost:8081/health
七、常见问题排查
7.1 Jar文件无法运行:"no main manifest attribute"
问题原因:未正确配置Spring Boot打包插件,导致Jar文件缺少Main-Class属性。
解决方案:
- 检查
pom.xml中是否正确添加了spring-boot-maven-plugin - 确保执行的是Spring Boot打包插件生成的Jar文件(而非普通Jar)
7.2 配置文件不生效
问题原因:
- 配置文件路径错误
- Profile激活不正确
- 配置项名称错误
解决方案:
- 使用
--spring.config.location明确指定配置文件路径 - 使用
--spring.profiles.active激活正确的Profile - 检查配置项是否符合Spring Boot的配置规范
7.3 内存不足导致运行失败
问题原因:JVM堆内存设置过小。
解决方案:
- 增加堆内存大小:
-Xms512m -Xmx1024m - 优化应用的内存使用(如减少缓存大小、优化数据结构)
7.4 端口被占用
问题原因:应用要绑定的端口已被其他进程占用。
解决方案:
- 查看占用端口的进程:
lsof -i :8080 - 杀死占用端口的进程:
kill -9 <PID> - 或修改应用端口:
--server.port=8081