
本文介绍在终端中通过 java -jar 启动应用时,无需修改代码或构建流程,即可将环境变量注入 JVM 进程的几种简洁、可靠方法,特别适用于依赖 System.getenv() 读取配置的第三方库。
本文介绍在终端中通过 `java -jar` 启动应用时,无需修改代码或构建流程,即可将环境变量注入 jvm 进程的几种简洁、可靠方法,特别适用于依赖 `system.getenv()` 读取配置的第三方库。
在 macOS(或 Linux)终端中直接运行 java -jar app.jar 时,若应用内部通过 System.getenv("KEY") 读取环境变量(而非 System.getProperty("key")),则必须确保这些变量在 Java 进程启动前已存在于其继承的环境表中。关键在于:子进程仅继承父进程(如 shell)的环境变量副本,且仅继承被 export 标记的变量。
✅ 推荐方式:行内环境变量赋值(最简洁、无副作用)
在命令行中直接前置变量定义,Shell 会自动将其注入后续命令的环境:
MY_API_KEY=abc123 DB_URL=jdbc:postgresql://localhost:5432/mydb java -jar app.jar
✅ 优点:
- 作用域严格限定于本次 java 进程,不影响当前 Shell 会话或其他命令;
- 无需创建脚本或额外文件,适合 CI/CD 或临时调试;
- 支持任意数量变量,空格分隔即可(注意避免引号包裹导致 Shell 解析异常)。
⚠️ 注意:不要写成 MY_API_KEY="abc123" java -jar ... —— 双引号在部分 Shell 中可能导致值未正确展开(建议先测试 echo $MY_API_KEY 验证);更安全的写法是 MY_API_KEY=abc123 java -jar ...(无引号,值不含空格/特殊字符时推荐)。
✅ 备选方式:显式导出 + 命令执行(适合多命令或复杂场景)
若需复用变量、或后续还需执行其他命令,可先 export 再运行:
export MY_API_KEY=abc123 export DB_URL=jdbc:postgresql://localhost:5432/mydb java -jar app.jar
✅ 优点:变量在当前 Shell 会话中持久可用;
❌ 缺点:变量会“污染”当前终端环境,可能影响后续命令(例如误触发其他工具);退出终端后自动清除,但非原子操作。
❌ 不推荐方式:.env 文件 + source(易出错)
虽然可创建 .env 文件并 source .env && java -jar ...,但存在风险:
- 若 .env 中含 export 语句,可能意外覆盖系统级变量(如 PATH);
- Shell 兼容性差(source 在 sh 下不可用,需 .);
- 无变量作用域隔离,违背最小权限原则。
? 进阶建议:封装为可复用脚本(生产就绪)
对于团队协作或部署场景,推荐创建轻量启动脚本 run.sh:
#!/bin/bash # run.sh —— 安全加载环境变量并启动应用 set -a # 自动导出后续所有变量 source ./config.env # 内容示例:MY_API_KEY=xxx\nDB_URL=yyy set +a java -jar app.jar "$@"
赋予执行权限后运行:chmod +x run.sh && ./run.sh。set -a 确保 source 的变量自动导出,set +a 及时关闭,兼顾安全性与便利性。
✅ 验证是否生效
在 Java 应用中添加临时日志验证:
System.out.println("API_KEY loaded: " + System.getenv("MY_API_KEY")); // 应输出 abc123
或在终端快速检查(启动前):
MY_API_KEY=test java -c 'System.out.println(System.getenv("MY_API_KEY"));' -cp .
? 总结:优先使用 KEY=VALUE java -jar ... 行内赋值——它符合 POSIX 标准、零依赖、原子性强,是 Shell 环境下加载环境变量启动 Java 应用的最佳实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











