System.getProperty不能获取操作系统环境变量,只能读取JVM系统属性(如os.name、java.home);PATH、HOME等环境变量必须用System.getenv()获取,二者来源不同、用途分离,误用会导致返回null。

System.getProperty 不能获取操作系统环境变量,它只能读取 JVM 的系统属性;真正读取 PATH、HOME、JAVA_HOME 这类环境变量,必须用 System.getenv()。
System.getProperty 是什么
它返回的是 Java 虚拟机启动时加载的内部属性,比如:
- os.name → “Linux” 或 “Windows 10”
- java.home → JDK 安装路径
- user.home → 当前用户主目录(跨平台可靠)
- file.separator → “/” 或 “\”
这些值由 JVM 自动设置,或通过 -Dkey=value 启动参数注入。运行时调用 System.setProperty() 可修改,但多数框架(如 Spring)只认启动时传入的 -D 参数。
System.getenv 是什么
它直接读取操作系统进程启动时继承的环境变量快照,例如:
- System.getenv("PATH") → 系统可执行路径列表
- System.getenv("JAVA_HOME") → JDK 根目录(不是 java.home)
- System.getenv("HOME")(Linux/macOS)或 System.getenv("USERPROFILE")(Windows)→ 用户目录(但推荐用 user.home 替代)
返回的是只读 Map
常见误用与避坑
- System.getProperty("PATH") 总是 null —— 因为 PATH 不是 JVM 属性,除非你手动加了 -DPATH=xxx
- user.dir ≠ user.home —— 前者是程序启动目录,后者才是用户家目录
- IDE 或 Docker 中 getenv 返回空 —— 需在运行配置里显式透传环境变量,终端 export 对它们无效
- 判空必须做 —— System.getenv("KEY") 可能为 null,直接 .trim() 会抛 NullPointerException
怎么选:getProperties 还是 getenv
看这个值是谁控制的、在哪生效:
- 用 System.getProperties():判断 os.arch、设置日志编码(-Dfile.encoding=UTF-8)、读取自定义启动参数(-Dapp.mode=dev)
- 用 System.getenv():读取数据库密码、云服务地址、CI/CD 标识(GITHUB_ACTION)、部署环境标识(ENV=prod)

















