构建与部署
Laravel 部署通常需要 PHP-FPM + Nginx + Composer install;Spring Boot 把「Web 服务器(Tomcat)打包进 jar」了,一条
java -jar就是全部。没有 Nginx、没有 php-fpm、没有vendor目录要拷贝。
构建:打成可执行 jar
# 在项目根目录
./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 + 打包,一步到位。
运行
java -jar target/demo-0.0.1-SNAPSHOT.jar指定端口 / Profile / 外部配置:
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 端口):
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:
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"]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 包:
pom.xml把打包方式改成 war,并把内嵌 Tomcat 改为 provided:
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>- 入口类继承
SpringBootServletInitializer:
@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);
}
}./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(见 配置中心) |