Skip to content

运行你的 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 导入项目步骤

  1. Eclipse: 选择 FileImport…​Existing Maven Projects
  2. IntelliJ IDEA: 直接打开 pom.xml 或项目文件夹
  3. 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 服务器端口

热交换最佳实践

> **开发效率提升技巧**

  1. 使用 DevTools 进行快速重启
  2. 配置 IDE 的自动编译功能
  3. 使用 LiveReload 浏览器扩展
  4. 合理配置排除路径,避免不必要的重启

WARNING

DevTools 仅应在开发环境中使用。在生产环境中,确保排除 spring-boot-devtools 依赖。

运行方式对比

运行方式适用场景优点缺点
IDE 运行日常开发调试支持断点调试、便于开发依赖 IDE 环境
可执行 JAR生产部署、测试独立运行、易于分发需要先打包
Maven 插件快速开发测试无需打包、快速启动依赖 Maven 环境
Gradle 插件Gradle 项目开发支持增量编译、速度快依赖 Gradle 环境
热交换开发阶段提高开发效率有一定限制

总结

Spring Boot 提供了多种灵活的运行方式,每种方式都有其特定的使用场景:

  • 开发阶段:推荐使用 IDE 运行 + DevTools 热交换
  • 测试阶段:使用构建插件快速运行
  • 生产部署:使用可执行 JAR 文件
  • 调试需求:启用远程调试模式

IMPORTANT

选择合适的运行方式可以显著提高开发效率和部署便利性。在不同的开发阶段采用相应的运行策略,能够最大化 Spring Boot 的优势。