idea中Program Arguments (程序参数)和Environment Variables (环境变量)区别
Program Arguments = 启动时传给 main(String[] args) 的参数
Environment Variables = 操作系统层面的环境变量,程序全局可见
1️⃣ Program Arguments(程序参数)
✅ 本质
-
启动 JVM 时传入
-
只对当前程序有效
-
进入
main(String[] args)
📍 IDEA 里填什么?
--spring.profiles.active=dev --port=8081
📥 Java 如何获取?
public static void main(String[] args) {
System.out.println(args[0]); // --spring.profiles.active=dev
}
📥 Spring Boot 获取方式
@Value("${spring.profiles.active}")
private String profile;
或:
java -jar app.jar --server.port=8081
🧠 典型用途
| 场景 | 是否推荐 |
|---|---|
| Spring Boot profiles | ✅ 强烈推荐 |
| 临时启动参数 | ✅ |
| 调试不同端口 | ✅ |
| 敏感信息 | ❌ 不推荐 |
2️⃣ Environment Variables(环境变量)


✅ 本质
-
操作系统级变量
-
JVM 启动前就存在
-
对子进程、服务、容器有效
📍 IDEA 里怎么写?
SPRING_PROFILES_ACTIVE=prod;DB_PASSWORD=123456
(Windows 用 ;,Mac/Linux 用 :)
📥 Java 如何获取?
String env = System.getenv("SPRING_PROFILES_ACTIVE");
📥 Spring Boot 自动支持
spring:
profiles:
active: ${SPRING_PROFILES_ACTIVE}
🧠 典型用途
| 场景 | 是否推荐 |
|---|---|
| 数据库密码 | ✅ |
| Docker / K8s | ✅ |
| CI/CD | ✅ |
| 多服务共享配置 | ✅ |
3️⃣ 核心区别对照表(重点)
| 对比项 | Program Arguments | Environment Variables |
|---|---|---|
| 设置位置 | JVM 启动参数 | 操作系统 |
| 作用范围 | 当前程序 | 当前进程及子进程 |
| Java 获取方式 | args[] |
System.getenv() |
| Spring Boot 优先级 | ⭐⭐⭐⭐ 高 | ⭐⭐⭐ 中 |
| 适合敏感信息 | ❌ | ✅ |
| 是否随系统存在 | ❌ | ✅ |
4️⃣ Spring Boot 中的优先级(你一定会踩坑)
Spring Boot 优先级从高到低:
-
Program Arguments(最高)
-
JVM 参数
-D -
Environment Variables
-
application.yml -
默认配置
👉 结论:
同一个配置,Program Arguments 会覆盖 Environment Variables
5️⃣ 举个你一定遇到过的坑
你在 IDEA 里:
-
Program Arguments:
--spring.profiles.active=dev
-
Environment Variables:
SPRING_PROFILES_ACTIVE=prod
❓ 实际生效的是?
👉 dev(程序参数优先)
6️⃣ 实战建议(很重要)
✅ 我的强烈推荐用法
| 场景 | 推荐方式 |
|---|---|
| 本地调试 | Program Arguments |
| 线上部署 | Environment Variables |
| 灰度 / 多环境 | Environment Variables |
| Spring profiles | Program Arguments(本地) |
Program Arguments 是“我这次怎么启动程序”
Environment Variables 是“这个运行环境本身是什么样”
浙公网安备 33010602011771号