Appearance
运行你的 Spring Boot 应用程序
概述
将应用程序打包为 jar 文件并使用嵌入式 HTTP 服务器的最大优势之一是,你可以像运行任何其他应用程序一样运行你的应用程序。这同样适用于调试 Spring Boot 应用程序。你不需要任何特殊的 IDE 插件或扩展。
NOTE
以下选项最适合在本地开发环境中运行应用程序。对于生产部署,请参阅"为生产环境打包应用程序"部分。
NOTE
本节仅涵盖基于 jar 的打包。如果你选择将应用程序打包为 war 文件,请参阅你的服务器和 IDE 文档。
运行方式概览
1. 从 IDE 运行
业务场景
在日常开发过程中,开发者需要频繁地启动和测试应用程序。使用 IDE 直接运行是最便捷的方式,支持断点调试、实时查看日志等功能。
实现方式
你可以从 IDE 中将 Spring Boot 应用程序作为 Java 应用程序运行。但是,你首先需要导入你的项目。导入步骤因 IDE 和构建系统而异。大多数 IDE 可以直接导入 Maven 项目。
常见 IDE 导入方式
kotlin
package com.example.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
/**
* Spring Boot 应用程序主类
* @SpringBootApplication 注解包含了以下功能:
* - @Configuration: 标识这是一个配置类
* - @EnableAutoConfiguration: 启用自动配置
* - @ComponentScan: 启动组件扫描
*/
@SpringBootApplication
class DemoApplication
/**
* 应用程序入口点
* 使用 Kotlin 的 runApplication 扩展函数启动 Spring Boot 应用
*/
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
IDE 导入项目步骤
- Eclipse: 选择
File
→Import…
→Existing Maven Projects
- IntelliJ IDEA: 直接打开
pom.xml
或项目文件夹 - VS Code: 安装 Java 扩展包后直接打开项目
TIP
如果你意外地运行了两次 Web 应用程序,你会看到"端口已在使用中"的错误。Spring Tools 用户可以使用 Relaunch
按钮而不是 Run
按钮来确保关闭任何现有实例。
2. 作为打包应用程序运行
业务场景
当需要在生产环境或测试环境中运行应用程序时,通常会将应用程序打包成可执行的 jar 文件。这种方式便于部署和分发。
基本运行方式
如果你使用 Spring Boot Maven 或 Gradle 插件创建可执行 jar,你可以使用 java -jar
运行应用程序:
bash
# 运行打包后的应用程序
java -jar target/myapplication-0.0.1-SNAPSHOT.jar
远程调试模式
也可以在启用远程调试支持的情况下运行打包应用程序。这样你可以将调试器附加到打包应用程序:
bash
# 启用远程调试的运行方式
java -agentlib:jdwp=server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
远程调试参数说明
server=y
: 作为调试服务器运行transport=dt_socket
: 使用套接字传输address=8000
: 调试端口号suspend=n
: 启动时不暂停,直接运行
IMPORTANT
在生产环境中运行时,请确保移除调试参数,因为它们可能会带来安全风险和性能影响。
3. 使用 Maven 插件
业务场景
在开发阶段,使用 Maven 插件可以快速编译和运行应用程序,无需手动打包。特别适合需要快速迭代开发的场景。
基本使用
Spring Boot Maven 插件包含一个 run
目标,可用于快速编译和运行你的应用程序:
bash
# 使用 Maven 插件运行应用程序
mvn spring-boot:run
配置 JVM 参数
你可能还想使用 MAVEN_OPTS
操作系统环境变量来配置 JVM 参数:
bash
# 设置 JVM 最大堆内存
export MAVEN_OPTS=-Xmx1024m
mvn spring-boot:run
Maven 插件配置示例
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 配置 JVM 参数 -->
<jvmArguments>
-Xmx1024m
-Dspring.profiles.active=dev
</jvmArguments>
<!-- 配置应用程序参数 -->
<arguments>
<argument>--server.port=8081</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
kotlin
# 开发环境配置
spring:
profiles:
active: dev
application:
name: my-spring-boot-app
server:
port: 8080
# 开发环境特定配置
---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:h2:mem:devdb
driver-class-name: org.h2.Driver
username: sa
password:
logging:
level:
com.example: DEBUG
4. 使用 Gradle 插件
业务场景
对于使用 Gradle 作为构建工具的项目,Gradle 插件提供了类似的快速运行功能,支持增量编译和缓存,通常比 Maven 更快。
基本使用
Spring Boot Gradle 插件也包含一个 bootRun
任务,可用于以分解形式运行你的应用程序:
bash
# 使用 Gradle 插件运行应用程序
gradle bootRun
配置 JVM 参数
你可能还想使用 JAVA_OPTS
操作系统环境变量:
bash
# 设置 JVM 参数
export JAVA_OPTS=-Xmx1024m
gradle bootRun
Gradle 配置示例
kotlin
import org.springframework.boot.gradle.tasks.run.BootRun
plugins {
id("org.springframework.boot") version "3.2.0"
id("io.spring.dependency-management") version "1.1.4"
kotlin("jvm") version "1.9.20"
kotlin("plugin.spring") version "1.9.20"
}
// 配置 bootRun 任务
tasks.withType<BootRun> {
// 配置 JVM 参数
jvmArgs = listOf(
"-Xmx1024m",
"-Dspring.profiles.active=dev"
)
// 配置应用程序参数
args("--server.port=8081")
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
developmentOnly("org.springframework.boot:spring-boot-devtools")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
groovy
plugins {
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
id 'java'
}
bootRun {
jvmArgs = [
'-Xmx1024m',
'-Dspring.profiles.active=dev'
]
args '--server.port=8081'
}
5. 热交换(Hot Swapping)
业务场景
在开发过程中,频繁地重启应用程序会降低开发效率。热交换技术允许在不重启应用程序的情况下更新代码,大大提高开发效率。
JVM 热交换
由于 Spring Boot 应用程序是普通的 Java 应用程序,JVM 热交换应该开箱即可工作。但 JVM 热交换在可替换的字节码方面有一定限制。
更完整的解决方案
1. JRebel
对于更完整的解决方案,可以使用 JRebel。
2. Spring Boot DevTools
spring-boot-devtools
模块还包含对快速应用程序重启的支持:
kotlin
// build.gradle.kts 中添加依赖
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
Spring DevTools 功能特性
DevTools 配置示例
kotlin
package com.example.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
/**
* 测试控制器 - 用于验证热重载功能
*/
@RestController
class HelloController {
@GetMapping("/hello")
fun hello(): String {
return "Hello, Spring Boot with DevTools!"
// 修改这行代码后,DevTools 会自动重启应用程序
}
}
yaml
# DevTools 相关配置
spring:
devtools:
restart:
enabled: true # 启用自动重启
additional-paths: src/main/resources # 额外监控路径
exclude: static/**,public/** # 排除不需要重启的路径
livereload:
enabled: true # 启用 LiveReload
port: 35729 # LiveReload 服务器端口
热交换最佳实践
> **开发效率提升技巧**
- 使用 DevTools 进行快速重启
- 配置 IDE 的自动编译功能
- 使用 LiveReload 浏览器扩展
- 合理配置排除路径,避免不必要的重启
WARNING
DevTools 仅应在开发环境中使用。在生产环境中,确保排除 spring-boot-devtools
依赖。
运行方式对比
运行方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
IDE 运行 | 日常开发调试 | 支持断点调试、便于开发 | 依赖 IDE 环境 |
可执行 JAR | 生产部署、测试 | 独立运行、易于分发 | 需要先打包 |
Maven 插件 | 快速开发测试 | 无需打包、快速启动 | 依赖 Maven 环境 |
Gradle 插件 | Gradle 项目开发 | 支持增量编译、速度快 | 依赖 Gradle 环境 |
热交换 | 开发阶段 | 提高开发效率 | 有一定限制 |
总结
Spring Boot 提供了多种灵活的运行方式,每种方式都有其特定的使用场景:
- 开发阶段:推荐使用 IDE 运行 + DevTools 热交换
- 测试阶段:使用构建插件快速运行
- 生产部署:使用可执行 JAR 文件
- 调试需求:启用远程调试模式
IMPORTANT
选择合适的运行方式可以显著提高开发效率和部署便利性。在不同的开发阶段采用相应的运行策略,能够最大化 Spring Boot 的优势。