Skip to content

Spring Boot 部署

Spring Boot 应用有多种部署方式,包括 JAR 包部署、WAR 包部署和 Docker 部署。本文将详细介绍这些部署方式。

JAR 包部署

Spring Boot 应用部署采用打包成 JAR 文件的方式,旨在利用其内置的嵌入式 Tomcat 或其他 Servlet 容器,简化传统 Web 应用部署流程。

1. 使用 Maven 进行打包

在 Spring Boot 项目中,确保 pom.xml 文件已经包含了 Spring Boot Maven 插件。如果未添加,需添加如下配置:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

然后在命令行或 IDE 中执行打包命令:

bash
mvn clean package

这将清理旧的构建产物,编译项目,执行测试(如果有),并最终打包成一个可执行的 JAR 文件。生成的 JAR 通常位于 target 目录下,文件名格式为 your-project-name-<version>.jar

2. 打包类型

Spring Boot 应用默认被打包为"fat JAR"或"über JAR",这种类型的 JAR 不仅包含了项目的字节码,还包含了所有依赖库以及嵌入式 Servlet 容器(如 Tomcat)。这意味着一个单一的 JAR 文件就包含了应用运行所需的所有组件,无需在目标环境中预先安装或配置 Servlet 容器。

3. 部署 JAR 文件

本地部署

要运行打包好的 JAR 文件,只需在命令行中使用 java -jar 命令:

bash
java -jar target/your-project-name-<version>.jar

根据需要,可以指定各种运行参数、环境变量或配置文件位置。例如:

bash
java -Dserver.port=8081 -jar your-project-name.jar --spring.config.location=file:/path/to/application.properties

远程服务器部署

将生成的 JAR 文件上传到目标服务器,通常放置在合适的应用部署目录下。然后通过 SSH 登录服务器,执行与本地相同的方式启动应用:

bash
ssh user@remote-server
cd /path/to/deployment/directory
java -jar your-project-name.jar

确保服务器上已安装了兼容的 Java 运行环境(JRE 或 JDK),且版本与项目构建时使用的 Java 版本相符。

JAR 包 Docker 部署

要使用 Docker 部署 Spring Boot 应用,您需要创建一个 Dockerfile 来定义如何构建 Docker 镜像。

1. 创建 Dockerfile

在 Spring Boot 项目的根目录下创建一个名为 Dockerfile 的文件,内容如下:

dockerfile
# 使用官方的Java基础镜像作为基础环境
FROM adoptopenjdk:11-jre-hotspot

# 设置环境变量(可根据实际需求调整)
ENV SPRING_PROFILES_ACTIVE=prod
ENV SERVER_PORT=8080

# 设置工作目录
WORKDIR /app

# 复制应用所需的文件到容器中
COPY target/my-spring-boot-app.jar app.jar

# 声明应用运行时需要暴露的端口
EXPOSE 8080

# 定义容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

2. 构建 Docker 镜像

在项目根目录下(含有 Dockerfile)执行以下命令构建 Docker 镜像:

bash
docker build -t my-spring-boot-app:latest .

3. 运行 Docker 容器

使用以下命令启动 Docker 容器:

bash
docker run -d --name my-running-app -p 8080:8080 my-spring-boot-app:latest

参数解释:

  • -d:在后台运行容器。
  • --name my-running-app:为容器指定一个名称。
  • -p 8080:8080:将主机的 8080 端口映射到容器的 8080 端口,使得外部可以通过主机 IP 和端口访问应用。

WAR 包部署

将 Spring Boot 应用部署为 WAR 包并部署到外部 Tomcat 服务器上,需要进行一些特定的配置和步骤。

1. 修改打包方式

在项目的构建工具配置文件中(通常是 pom.xml for Maven 或 build.gradle for Gradle),将打包方式改为 war

Maven

pom.xml 中的 <packaging> 标签设置为 war

xml
<project>
    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->
</project>

2. 排除内置 Tomcat

为了防止与外部 Tomcat 服务器产生冲突,需要在构建配置中排除 Spring Boot 的内嵌 Tomcat 依赖。在 Maven 的 pom.xml 中添加以下依赖排除:

xml
<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>
    <!-- ... -->
</dependencies>

3. 配置 SpringBootServletInitializer

为了让 Spring Boot 应用能够由外部 Servlet 容器如 Tomcat 加载,需要创建一个继承自 SpringBootServletInitializer 的类,并重写 configure 方法:

java
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

这里 Application.class 是您的主应用程序类,包含 @SpringBootApplication 注解。

4. 构建 WAR 文件

使用对应的构建工具命令生成 WAR 包:

bash
mvn clean package

生成的 WAR 文件通常位于 target 目录下,文件名为 your-project-name-<version>.war

5. 部署到 Tomcat

将生成的 WAR 文件复制到 Tomcat 的 webapps 目录下。如果您正在运行 Tomcat 服务,它会自动检测到新部署的 WAR 文件并进行解压及部署。

6. 访问应用

部署完成后,您可以使用以下 URL 访问您的 Spring Boot 应用:

http
http://localhost:8080/your-project-name

总结

Spring Boot 提供了灵活的部署选项,可以根据实际需求选择 JAR 包部署、WAR 包部署或 Docker 容器部署。每种方式都有其适用场景,选择合适的部署方式可以提高应用的部署效率和运行稳定性。