启动与运行方式
本教程共 48 篇 · 第 5 篇 · 更新于 2026-08-13 · 约 5 分钟阅读
本节目标:掌握 Spring Boot 的三种运行方式:IDE 运行、构建工具运行、打包 Jar 运行,外加 CLI 生成项目,学完你能在不同场景下自如启动和调试应用。
先看本质:它就是普通 Java 程序
Spring Boot 应用跑起来,靠的是主类里的 main 方法:
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
SpringApplication.run() 做三件事:创建并刷新 Spring 容器、根据依赖自动配置、启动内嵌 Tomcat。
关键点:它不依赖任何外部服务器。Tomcat 打包在应用里,这也是它能 java -jar 直接跑的根本原因。
方式一:IDE 里运行
IDEA 里打开主类,点 main 方法旁边的绿色三角,选 Run。STS 里右键主类,Run As → Java Application。
开发阶段最常用这种。日志直接打在 IDE 控制台,断点调试也方便。IDEA 里也可以直接开终端面板敲 mvn spring-boot:run,效果一致。
Note重复启动会报「Port 8080 was already in use」。STS 提供了 Relaunch 按钮,先关旧实例再启动,避开这个报错。IDEA 里也要先停掉旧进程。
方式二:Maven 插件运行
在项目根目录执行:
mvn spring-boot:run
这个命令由 spring-boot-maven-plugin 提供,效果和 IDE 运行一样:编译源码、启动应用。适合命令行环境或远程服务器上调试。mvn spring-boot:run 默认会先编译再启动,改完代码重跑即可。
Gradle 用户对应的命令:
gradle bootRun
内存不够用时,可以给 Maven 进程调 JVM 参数,比如:
MAVEN_OPTS=-Xmx1024m mvn spring-boot:run
Windows 下写成:
set MAVEN_OPTS=-Xmx1024m
mvn spring-boot:run
Gradle 的内存参数不在这里设,在项目根目录的 gradle.properties 里写 org.gradle.jvmargs=-Xmx1024m,它管的是 Gradle 守护进程。
方式三:打包成可执行 Jar
开发调试用前两种,交付部署用打包。Maven 执行:
mvn package
构建完成后,target 目录下多出两个文件:
target/
├── hello-world-0.0.1-SNAPSHOT.jar # 可执行 jar,约 18MB
└── hello-world-0.0.1-SNAPSHOT.jar.original # 原始 jar,很小
大的是 Spring Boot 重新打包过的可执行 jar(也叫 fat jar)。它把应用代码、依赖库、内嵌 Tomcat 全装进一个文件。小的 original 是打包前的原始 jar,一般不用管。
用 jar tvf 看一眼 jar 内部,结构是这样的:
BOOT-INF/
├── classes/ # 你的编译后代码和资源
└── lib/ # 所有依赖 jar
META-INF/
└── MANIFEST.MF # 启动信息,声明 Main-Class
org/springframework/boot/loader/launch/ # 启动器类(简化示意,详见 §42)
MANIFEST.MF 里记录了启动器类和应用主类。java -jar 执行时,启动器先解出 BOOT-INF/lib 里的依赖,再调用你的主类。这套机制叫 Boot-Jar 结构,第 42 章会深入拆解。
这个能力来自 pom.xml 里的插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
运行打包好的应用:
java -jar target/hello-world-0.0.1-SNAPSHOT.jar
只要有 JDK 17+ 的机器就能跑,不用装 Tomcat,不用配服务器。这就是「一次打包,到处运行」。
TipGradle 打包命令是
gradle bootJar,产物在build/libs目录。
jar 和 war 的区别
传统 Java Web 项目打包成 war,要部署进外部 Tomcat。Spring Boot 默认打 jar,内嵌 Tomcat 随包运行。两者都能跑 Web 应用,区别在于服务器在包里还是在包外。
jar 方式省事,推荐默认用;个别老环境必须部署到外部容器时,再改成 war。第 42 章专门讲打包细节。
方式四:Spring Boot CLI
CLI 是 Spring Boot 自带的命令行工具。早期版本能用 spring run 直接跑 Groovy 脚本,4.x 已移除这个能力,现在的主要用途是配合 Spring Initializr 生成项目:
spring init --build maven -a demo
这条命令用 Maven 在当前目录生成名为 demo 的项目骨架,相当于命令行版的 Initializr。适合不想开浏览器、习惯纯命令行的场景,正式项目还是走标准工程。
CLI 的安装方式,按系统选:
- SDKMAN(macOS/Linux):
sdk install springboot - Scoop(Windows):
scoop install springboot - Homebrew(macOS):
brew install spring-boot
装完验证版本:
spring --version
Spring CLI v4.1.0
运行时传参
打包后的应用支持命令行传参。临时改端口:
java -jar target/hello-world-0.0.1-SNAPSHOT.jar --server.port=8081
启动时加 --debug,输出详细日志,排查自动配置问题很方便(条件报告的读法如 §6 所述):
java -jar target/hello-world-0.0.1-SNAPSHOT.jar --debug
Tip命令行参数的优先级高于配置文件。想临时换个端口、换个环境跑一下,不用改文件,直接传参。
远程调试打包应用
生产上出问题,可以带调试参数启动 jar,再用 IDE 远程连上去:
java -agentlib:jdwp=server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/hello-world-0.0.1-SNAPSHOT.jar
然后在本机 IDE 里配置 Remote JVM Debug,连服务器 8000 端口。这是排查线上问题的常用手段,记个印象,用到时再查细节。
启动失败怎么办
启动失败时,Spring Boot 的 FailureAnalyzer 会给出可读的报错。比如端口被占用,会直接告诉你:
APPLICATION FAILED TO START
Description:
Embedded servlet container failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that is listening on port 8080 or configure
this application to listen on another port.
比裸堆栈异常友好得多。遇到启动失败,先读最上方的 Description 和 Action 两段,它通常直接给出解决方案。端口被占用的三步处理见 §15。
改代码想自动重启?
开发时每次改代码都要手动重启,很烦。加一个 spring-boot-devtools 依赖,改完代码应用会自动重启:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
devtools 只应在开发环境生效,打包部署时不会带进生产。它支持自动重启和热替换,改完代码不用手动重启,开发体验好一截。
进程后台运行
服务器上部署时,Ctrl+C 会把应用停掉。想让应用在后台跑,Linux 用 nohup:
nohup java -jar target/hello-world-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
日志写进 app.log,关掉终端应用也不停。停止时找到进程号再 kill。生产部署更规范的方式是 systemd 托管,第 45 章会讲。
优雅退出
按 Ctrl+C,Spring Boot 触发 JVM 关闭钩子,容器资源有序释放。日志里出现 graceful shutdown 相关输出,说明退出流程正常。生产环境升级时,这种优雅退出能保证正在处理的请求不被打断。Windows 上按 Ctrl+C 有时会弹「终止批处理操作吗」,选是即可。
常见问题
- java -jar 提示找不到主类:确认用的是 spring-boot-maven-plugin,且执行的是 repackage 后的那个 jar
- 端口换了访问还是 8080:检查命令行参数和配置文件是否冲突,命令行优先级更高
- 打包后运行报 NoClassDefFoundError:多半是手动改过 pom 排除了依赖,先还原排查
排查顺序也记一下:先看启动日志最后几行,再想配置,最后查环境。多数启动问题,日志第一屏就有答案。
小结
| 方式 | 命令 | 场景 |
|---|---|---|
| IDE 运行 | 点 Run | 日常开发调试 |
| Maven 插件 | mvn spring-boot:run | 命令行环境 |
| 可执行 Jar | java -jar xxx.jar | 部署上线 |
| CLI | spring init 生成项目 | 命令行建项目 |
启动日志、端口占用、优雅退出,都是面试高频考点。建议每种方式都亲手跑一遍,跑通一次,后面章节就顺了。
再记一个原则:开发用前两种,交付用第三种,CLI 用来快速生成项目骨架。