Skip to content

部署与运行基础

1. 这是什么

部署与运行基础描述了应用从本地开发到构建、发布、启动和运行维护的整个过程。
它是工程闭环的重要组成部分。

一句话理解:

  • 代码写完并不算结束
  • 只有它能被稳定构建、正确启动、按预期运行,工程才算闭环

2. 为什么重要

高级开发者不能只会写代码,还要知道代码最后怎样进入生产环境。
很多问题都发生在“运行环境”而不是“业务逻辑”里,例如:

  • 本地能跑,线上不能跑
  • 配置错环境
  • 启动参数不一致
  • 容器资源限制不合理

部署与运行能力本质上是在解决:

  • 如何让程序可重复交付、可稳定运行

3. 先建立直觉:构建、部署、运行是三件不同的事

这三件事很容易被混成一件:

阶段核心问题
构建代码如何变成可交付产物
部署产物如何进入目标环境
运行应用如何带着正确配置和资源约束工作

你只有把这三步分清楚,排查“为什么线上不对”时才不容易乱。

4. 核心内容

4.1 Maven / Gradle 构建

在 Java 项目里,最常见的构建目标是:

  • 生成可运行 jar
  • 生成 war
  • 产出测试报告和依赖信息

学习阶段最重要的不是区分每个插件细节,而是理解:

  • 构建是把源码和依赖打成可交付产物

4.2 环境配置管理

配置管理的目标不是“把配置放进文件”这么简单,而是:

  • 分环境
  • 可追踪
  • 可切换
  • 不写死在代码里

所以要尽量避免:

  • 直接把生产地址、密码、开关硬编码进代码

4.3 启动参数

运行一个 Java 应用时,启动参数通常会影响:

  • 内存大小
  • GC 策略
  • 系统属性
  • 配置文件位置
  • 端口和环境标识

所以启动命令本身就是运行配置的一部分。

4.4 资源限制与运行约束

应用能不能稳定运行,不只看代码,还看:

  • CPU 限额
  • 内存限额
  • 容器限制
  • 线程数
  • 数据库连接数

如果这些约束没有设计好,系统很容易出现:

  • 本地正常、线上雪崩

4.5 Docker 基础部署

Docker 的价值在于:

  • 把运行环境和应用一起打包
  • 让部署行为更一致

学习阶段先抓住主线即可:

  • 用 Dockerfile 描述镜像构建
  • 用容器承载应用运行

5. 学习重点

这一章最重要的是掌握:

  • 部署和运行能力是工程闭环的一部分
  • 配置必须分环境管理
  • 启动参数本身就是运行配置
  • 构建、部署、运行不能混为一谈
  • 资源限制会直接影响系统稳定性

6. 常见问题

6.1 本地能跑,线上不能跑

这通常不是“玄学”,而是:

  • 环境差异
  • 配置差异
  • 依赖差异
  • 启动参数差异

6.2 配置和代码强耦合

一旦环境变化,就需要改代码重新发版,代价非常高。

6.3 启动参数和资源限制缺乏统一规范

这会让系统行为不可预测,也不利于排障。

7. 动手验证

这一节我优先用本机可直接验证的最小实验来讲“构建 -> 打包 -> 运行”。

7.1 准备一个最小应用

新建文件 RunApp.java,内容如下:

java
public class RunApp {
    public static void main(String[] args) {
        String profile = System.getProperty("app.profile", "default");
        long maxHeapMb = Runtime.getRuntime().maxMemory() / 1024 / 1024;
        System.out.println("appStarted=true");
        System.out.println("profile=" + profile);
        System.out.println("maxHeapMb=" + maxHeapMb);
    }
}

7.2 编译、打包并运行 jar

先编译:

bash
javac RunApp.java

再打包成可执行 jar:

bash
jar --create --file app.jar --main-class RunApp RunApp.class

然后运行:

bash
java -Dapp.profile=prod -Xms64m -Xmx64m -jar app.jar

如果你在 PowerShell 中直接执行,建议把系统属性参数整体加引号,避免参数被误拆:

powershell
java "-Dapp.profile=prod" -Xms64m -Xmx64m -jar app.jar

7.3 你应该观察到什么

输出应包含这些关键信息:

text
appStarted=true
profile=prod
maxHeapMb=64

7.4 每一行在验证什么

  • appStarted=true:说明应用已作为可交付产物成功运行
  • profile=prod:说明系统属性可以作为运行配置输入
  • maxHeapMb=64:说明启动参数会直接影响运行时资源边界

7.5 Docker 的最小示意

如果你本地有 Docker,可以继续准备一个最小 Dockerfile:

dockerfile
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY app.jar app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]

当前环境里我实际确认了 docker --version 可用,所以你可以继续在本机按下面命令实验:

bash
docker build -t demo-app:1.0 .
docker run --rm demo-app:1.0

是否真的执行这一步,还取决于本地是否已有基础镜像或网络能否拉镜像。

8. 练习建议

下面这些练习做完,这一章会更扎实:

  • 将一个简单项目打包并运行
  • 用 Docker 部署一个基础服务
  • 总结一份项目启动与配置说明
  • 对比“系统属性、环境变量、配置文件”三种配置输入方式

9. 自测问题

  • 为什么部署和运行能力是高级开发者的基础项?
  • 配置分环境管理解决了什么问题?
  • 代码上线前最值得检查哪些运行项?
  • 为什么说启动参数本身就是运行配置的一部分?

10. 自测核对要点

如果你的回答能覆盖下面这些点,说明这一章基本掌握到位了:

  • 构建、部署、运行是三件不同但关联紧密的事
  • 配置必须与代码解耦并分环境管理
  • 启动参数会直接影响运行行为和资源边界
  • 资源限制设计会直接影响系统稳定性
  • Docker 的价值在于提升环境一致性和交付稳定性