文档站点
Skip to content

构建与部署 ​

Laravel 部署通常需要 PHP-FPM + Nginx + Composer install;Spring Boot 把「Web 服务器(Tomcat)打包进 jar」了,一条 java -jar 就是全部。没有 Nginx、没有 php-fpm、没有 vendor 目录要拷贝。

构建:打成可执行 jar ​

bash
# 在项目根目录
./mvnw clean package

会在 target/ 下生成:

  • demo-0.0.1-SNAPSHOT.jar —— 可执行 jar(Spring Boot 的 fat jar,内含 Tomcat 和所有依赖)
  • demo-0.0.1-SNAPSHOT.jar.original —— 仅项目自身类的 jar,一般用不上

类比

mvn package ≈ composer install --no-dev + php artisan config:cache + 打包,一步到位。

运行 ​

bash
java -jar target/demo-0.0.1-SNAPSHOT.jar

指定端口 / Profile / 外部配置:

bash
java -jar target/demo-0.0.1-SNAPSHOT.jar \
  --spring.profiles.active=prod \
  --server.port=9000

内嵌 Tomcat,没有 Nginx 怎么办? ​

Spring Boot 默认内置 Tomcat,独立跑即可。但生产环境往往还有 Nginx 做反向代理、静态资源缓存、SSL 终结:

Nginx (80/443) ──反向代理──▶ Spring Boot (8080)

Nginx 配置示例(和代理 PHP-FPM 思路一样,只是 upstream 换成 8080 端口):

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

TIP

如果你追求「一个命令搞定部署」,也可以让 Nginx 同时托管 Spring Boot 的静态资源,但通常没必要 —— 静态资源放在 src/main/resources/static/ 由 Tomcat 直接提供即可。

Docker 部署 ​

Spring Boot 官方镜像 eclipse-temurin 或直接用多阶段构建。这里用一个极简 Dockerfile:

dockerfile
FROM maven:3.9-eclipse-temurin-17 AS builder
COPY . /app
WORKDIR /app
RUN mvn -DskipTests clean package

FROM eclipse-temurin:17-jre
COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar /app.jar
ENV SPRING_PROFILES_ACTIVE=prod
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
bash
docker build -t demo .
docker run -d -p 8080:8080 -e DB_PASSWORD=secret demo

环境变量注入

上面的 ENV SPRING_PROFILES_ACTIVE=prod 和 -e DB_PASSWORD=secret,正好对应 配置中心 里讲的「环境变量优先级高于配置文件」。部署时改配置不需要重新打包。

打成 war 部署到外置 Tomcat ​

Laravel 部署在共享主机的 PHP-FPM;Java 世界里若公司用外置 Tomcat,需要打 war 包:

  1. pom.xml 把打包方式改成 war,并把内嵌 Tomcat 改为 provided:
xml
<packaging>war</packaging>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
  1. 入口类继承 SpringBootServletInitializer:
java
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  1. ./mvnw package 生成 target/demo.war,扔进 Tomcat 的 webapps/ 即可。

推荐哪个?

新项目一律用可执行 jar + 内嵌 Tomcat,理由和「用 Composer 管理依赖而不是手动拷贝」一样 —— 少一个组件少一份运维心智。war 部署是存量公司的历史包袱,知道有这么回事即可。

生产建议清单 ​

事项做法
JVM 内存部署前先测峰值,-Xmx 设置合理上限,别让 JVM 吃光宿主机内存
Profile强制用 prod profile,关闭开发调试输出
健康检查引入 spring-boot-starter-actuator,暴露 /actuator/health 给负载均衡器探测
日志持久化别只打 stdout,配合 Docker/云平台日志采集,或配置日志文件滚动(见 日志)
配置密钥全部走环境变量 / 密钥管理服务,绝不写进 jar 里的 yml(见 配置中心)

面向 PHP / Laravel 开发者的 Spring Boot 中文文档