system.getproperty获取的是jvm系统属性而非操作系统环境变量,如os.name、java.home等;环境变量(如path、home)必须用system.getenv()获取。

System.getProperty 不能获取操作系统的“环境变量”,它获取的是 Java 虚拟机启动时读取的 系统属性(System Properties),和操作系统层面的环境变量(如 PATH、HOME)是两个不同概念。容易混淆,但必须分清。
什么是 System.getProperty 获取的内容?
这是 JVM 启动时从 OS 环境中提取并标准化的一组键值对,例如:
-
os.name→ "Windows 10"、"Linux"、"Mac OS X" -
os.version→ "10.0", "5.15.0-105-generic" -
os.arch→ "amd64", "aarch64", "x86" -
java.home→ JDK 安装路径 -
user.dir→ 当前工作目录(不是 home 目录) -
user.home→ 当前用户主目录(对应 OS 的HOME或USERPROFILE)
如何安全获取常用系统信息?
直接调用 System.getProperty(key) 即可,建议加上非空判断:
String osName = System.getProperty("os.name", "unknown");
String arch = System.getProperty("os.arch", "unknown");
boolean isWindows = osName.toLowerCase().contains("win");
boolean isMac = osName.toLowerCase().contains("mac");
boolean isLinux = osName.toLowerCase().contains("linux");
注意:os.name 值不固定(如 macOS 返回 "Mac OS X" 或 "MacOS"),推荐用 contains 而非精确匹配。
想读真正的操作系统环境变量怎么办?
用 System.getenv(),不是 getProperty:
-
System.getenv("PATH")→ 获取 PATH 环境变量 -
System.getenv("HOME")(Linux/macOS)或System.getenv("USERPROFILE")(Windows)→ 用户主目录 -
System.getenv()(无参)→ 返回只读的Map<string></string>,包含全部环境变量
⚠️ 注意:某些容器或受限运行环境(如部分 IDE 沙箱、JNLP 应用)可能屏蔽环境变量访问,此时 getenv 可能返回空或不完整。
常见误用与避坑提醒
- ❌
System.getProperty("PATH")→ 总是返回null,因为 PATH 不是 JVM 系统属性 - ❌ 把
user.dir当作用户家目录 → 它是程序启动目录,不是user.home - ✅ 需要跨平台判断系统类型?优先查
os.name,再结合业务逻辑分支 - ✅ 敏感信息(如密钥)不应通过环境变量传入生产 JVM,应使用配置中心或加密文件











