SpringBoot 项目启动和部署总结

本文详细介绍SpringBoot项目的多种部署方法,包括使用内置Tomcat容器、外部Tomcat容器、替换为Jetty容器及通过Profile区分不同环境等。此外还介绍了如何实现热部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下,SpringBoot 内置 Tomcat,可以直接在 Java IDE 中启动,也可以打成 jar 包,用 java -jar 命令启动。但是,如果要用外部 Tomcat 管理多个项目,就要打成 war 包。本文以 Maven 项目为例,总结了 SpringBoot 各种部署方法和相关事项。为便于演示,我使用的环境是 Windows,而 Linux 下方法大同小异。

作者:王克锋
出处:https://kefeng.wang/2017/12/18/spring-boot-deploy/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 新建项目 spring-boot

SpringBoot 项目创建方法参考文章 Spring Boot 开发概要

1.1 pom.xml

<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

1.2 application.properties

spring.main.banner-mode=off
logging.level.org.springframework=INFO
logging.pattern.console=%d{HH:mm:ss.SSS}  %p  [%F:%L] - %m%n

server.port=8080

1.3 HelloController.java

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello! " + System.currentTimeMillis();
    }
}

1.4 HelloApplication.java

@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

2 使用内置容器启动

默认为自带 Tomcat 容器(spring-boot-starter-web 中依赖了 spring-boot-starter-tomcat);
默认打包为 jar 格式,可以像普通应用程序一样启动。

1.1 Java IDE 中启动

IntelliJ IDEA 中,打开应用类文件(HelloApplication.java)直接运行其中的 main() 即可;
浏览器访问: http://localhost:8080/hello

1.2 操作系统命令行中启动

call mvn.cmd -Dmaven.test.skip=true package
java -jar target\spring-boot-0.0.1-SNAPSHOT.jar

浏览器访问: http://localhost:8080/hello

1.3 部署为服务(CentOS 环境)

参考文章 Tomcat 安装及其单机多实例部署
官方资料: Installing Spring Boot applications
借助于服务管理器 systemd,可以部署为单实例或多实例。
之后可以优雅地启动和停止服务,避免暴力 kill。

3 部署于外部 Tomcat 容器

官方参考资料:
Spring Boot Reference Guide
Traditional deployment

3.1 修改 pom.xml

打包方式由 jar 调整为 war;
注意:默认依赖的 spring-boot-starter-tomcat 无需排除,生成的 war 包不但可以部署到外部 Tomcat,还可以像之前一样使用 java -jar 启动。

<packaging>war</packaging>

3.2 调整 HelloApplication.java

应用类继承 SpringBootServletInitializer 并重写 configure() 方法。

@SpringBootApplication
public class HelloApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(HelloApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

3.3 修改 Tomcat 配置 server.xml

修改为自动解压(unpackWARs=”true”),自动部署(autoDeploy=”true”)。

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- ...... -->
</Host>

3.4 部署脚本 mk.cmd

改用侯捷老师的名言,脚本面前无秘密。脚本简单解释如下:
打为 war 包,删除 Tomcat 目录下的项目原目录,复制 war 包,启动 Tomcat。

call mvn.cmd -Dmaven.test.skip=true package

rd /s/q "%CATALINA_HOME%\webapps\spring-boot"
copy /y "target\spring-boot-0.0.1-SNAPSHOT.war" "%CATALINA_HOME%\webapps\spring-boot.war"
call "%CATALINA_HOME%\bin\startup.bat"

3.5 查看效果

浏览器访问: http://localhost:8080/spring-boot/hello
注意 URL 多了个项目名(spring-boot),原因是 Tomcat 需要管理多个项目,解压出的项目多了一层目录名。

4 更多改进

4.1 替换 Tomcat 为 Jetty

只需把 pom.xml 中的 spring-boot-starter-tomcat 排除掉,并增加 spring-boot-starter-jetty。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
<dependencies>

4.2 使用 Profile 区分环境

可用来区分开发环境、测试环境、生产环境等。

4.2.1 各 Bean 声明 @Profile(“xxx”)

当当前激活的 profile 与 xxx 一致时,相应的 bean 才会实例化。

@Service
@Profile("dev")
class MyServiceDev implements MyService {
}

@Service
@Profile("test")
class MyServiceTest implements MyService {
}

@Service
@Profile("prod")
class MyServiceProd implements MyService {
}
4.2.2 指定当前激活的 profile
  • 方法一: application.properties 中指定 spring.profiles.active=xxx
  • 方法二: 命令行参数中指定 java -jar spring-boot.jar --spring.profiles.active=xxx

5 热部署

参考文档:Developer tools
所谓热部署,是指每次修改代码后,无需手动重启,修改即可生效。其原理为:
(1) Java 文件修改后,IDEA 自动编译为新的 class 文件;
(2) DevTools 监视到 class 文件有更新,就新建 ClassLoader 加载新的 class,然后把 ClassLoader 由旧切换至新。

5.1 添加依赖包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

5.2 相关配置

修改文件 application.properties:

## 如果使用了 Thymeleaf 模板
## 缓存机制,在开发调试阶段禁用(false),上线后要启用(true)
spring.thymeleaf.cache=false

## 为避免服务反复频繁重启,禁用
## 效果:静态资源文件会实时更新,但 class 文件需要手工重启服务
spring.devtools.restart.enabled=false

5.3 启用自动构建

注意:DEBUG/RUN 状态下不会自动构建,空闲时才自动构建。

  • 进入菜单:File / Settings
  • 展开分支:Build, Execution, Deployment / Compiler
  • 勾上选项:Build project automatically

5.4 启用自动编译

注意:无论是否 DEBUG/RUN 状态,都会触发自动构建。

  • 按快捷键 Ctrl + Shift + Alt + /,弹出菜单中选择 Registry
  • 找到并勾选 compiler.automake.allow.when.app.running
<think>嗯,用户问Spring Boot项目是不是一定要部署。首先,我需要明确部署的定义。部署通常指的是将应用放到服务器上运行,让外部可以访问。那Spring Boot项目如果不部署的话,是否还有其他使用方式呢? 首先,开发阶段,开发者确实可以在本地运行Spring Boot应用,用内嵌的Tomcat或者Jetty服务器,这样不需要传统意义上的部署。这时候应用只是在本地环境运行,用于测试调试。 然后,用户可能想知道如果不部署到生产环境,是否有其他用途。比如,Spring Boot可以打包成可执行的JAR,直接通过命令行运行,这也算是一种轻量级的部署方式,不需要外部的应用服务器。这种情况下,用户可能认为这不是传统部署,但其实已经是在运行应用了。 另外,有些情况下,项目可能作为库或组件被其他应用引用,这时候可能不需要独立部署。但这种情况相对少见,因为Spring Boot通常用于构建独立的服务。 还需要考虑微服务架构,每个服务都是一个Spring Boot应用,这时候当然需要部署每个服务实例。但如果是单体应用,同样需要部署到服务器。 可能用户有误解,认为部署必须是复杂的流程,比如使用Docker、Kubernetes或者云平台。但实际上,简单的运行JAR文件也是一种部署形式。需要解释部署的不同层次方式。 另外,测试环境中的部署是否算数?比如持续集成中的自动化部署,可能用户没有意识到这也是部署的一部分。 总结来说,Spring Boot应用最终需要运行在某个环境中,无论是本地还是服务器,这都可以视为部署。因此,回答需要明确部署的不同场景必要性,说明即使简单的运行也是部署的一种形式,但根据使用场景,部署的方式复杂度会有所不同。</think>Spring Boot项目是否需要部署,取决于具体的使用场景目标。以下是逐步分析: --- ### **1. 开发阶段:无需传统部署** - **本地运行** 开发过程中,可直接在IDE(如IntelliJ IDEA、Eclipse)中启动Spring Boot应用。 内嵌服务器(Tomcat/Jetty)会自动运行,无需手动部署到外部服务器。 ```bash # 通过Maven启动 mvn spring-boot:run ``` --- ### **2. 测试与验证:轻量级运行** - **打包为可执行JAR** Spring Boot默认打包为包含依赖的JAR文件,可直接通过Java命令运行: ```bash java -jar your-application.jar ``` 这本质上是一种**轻量级部署**,但无需依赖外部应用服务器。 --- ### **3. 生产环境:必须部署** - **传统服务器部署** 若需对外提供服务(如API、网页),需将应用部署到服务器或云平台(AWS、阿里云等)。 常见方式: 1. 将JAR/WAR文件放到服务器,通过`java -jar`启动。 2. 使用Docker容器化部署。 3. 集成到Kubernetes等容器编排系统。 - **云原生部署** 云平台(如Heroku、Azure)提供一键部署功能,直接关联Git仓库或上传JAR文件。 --- ### **4. 特殊情况:作为组件使用** - **库或模块集成** 若Spring Boot项目被设计为工具库或组件(如提供公共工具类),可打包为JAR供其他项目依赖,此时无需独立部署。 --- ### **关键结论** - **必须部署的场景**:对外提供网络服务、生产环境运行、微服务架构中的独立服务。 - **无需部署的场景**:本地开发测试、作为工具库被其他项目引用。 --- ### **部署的必要性对比表** | 场景 | 是否需要部署 | 说明 | |--------------------|---------------------|-----------------------------| | 本地开发调试 | 否 | 内嵌服务器直接运行 | | 内部工具或脚本 | 可选 | 可作为命令行工具运行 | | 对外提供API/页面 | 是 | 需部署到服务器或云平台 | | 微服务架构中的服务 | 是 | 每个服务需独立部署 | --- ### **总结** Spring Boot项目**不一定要以传统方式部署**,但若需在生产环境提供对外服务,则必须通过某种形式部署(如运行JAR、容器化等)。核心在于区分项目的用途运行环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值