11
打包与部署:Jar、Docker、War
Packaging & Deployment
Spring Boot 推荐打可执行 Jar——内嵌 Tomcat,java -jar 直接跑。云原生时代,再把 Jar 包进 Docker 镜像。War 包部署到外部 Tomcat 的老做法,新项目基本不用了。
Dockerfile:多阶段构建
# 第一阶段:Maven 构建
FROM maven:3.9-eclipse-temurin-21 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 第二阶段:运行时,只留 JRE 和 jar
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
上线前检查清单
| 检查项 | 怎么查 |
|---|---|
| profile 激活 | 生产用 prod,别留 dev。 |
| show-sql 关掉 | 生产环境 show-sql=false,不然日志爆。 |
| ddl-auto=none | 生产别让 Hibernate 自动改表,用 Flyway/Liquibase。 |
| Actuator 端点收紧 | 只暴露 health/metrics,别把 env/beans 暴露公网。 |
| DevTools 排除 | pom 里确保 devtools 是 optional。 |
| 日志文件输出 | 生产必须写文件,不能只打控制台。 |
| 数据库连接池 | maximum-pool-size 按数据库能力调,别默认值上线。 |
构建并运行:
docker build -t myapp:1.0 .
docker run -p 8080:8080 myapp:1.0
本章面试题 · 第 11 章(打包与部署)
1.(概念题)Spring Boot 为什么能 java -jar 直接跑?内嵌 Tomcat 是怎么回事?
查看答案
答案:spring-boot-maven-plugin 把应用打成一个"可执行 fat jar"——应用类、依赖、内嵌 Tomcat 全塞进去。main 方法启动时在 JVM 里 new 一个 Tomcat 实例,把 DispatcherServlet 注册进去。解析:不再需要外部 Tomcat,一个 jar 就是一个独立进程。
2.(对比题)打 jar 跑和打 war 部署外部 Tomcat,怎么选?
查看答案
答案:Cloud 时代一律打 jar 内嵌容器(配合 Docker),启动快、易横向扩展。war 只在公司强制要求用外部 Tomcat 的老环境才用。解析:Spring Boot 默认推荐 jar。