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 容器部署。每种方式都有其适用场景,选择合适的部署方式可以提高应用的部署效率和运行稳定性。