Java中读取系统属性用System.getProperty()(JVM启动时加载,如os.name、-D参数),环境变量用System.getenv()(操作系统级,如JAVA_HOME),二者来源不同、用途各异,需注意跨平台大小写、安全限制及配置优先级。

Java 中读取系统属性和环境变量是基础但易混淆的操作,关键在于分清 System.getProperty()(系统属性)和 System.getenv()(环境变量)的用途与来源。
系统属性:JVM 启动时加载的配置
系统属性由 JVM 自动设置(如 os.name、java.version),也可通过 -Dkey=value 参数手动传入。它们属于 JVM 运行时上下文,不依赖操作系统。
- 获取内置属性:
System.getProperty("os.name")→ 返回 "Windows 11" 或 "Linux" - 获取自定义启动参数:
java -Dapp.env=prod MyApp,代码中用System.getProperty("app.env")得到 "prod" - 注意:未设置的属性返回
null,建议判空或提供默认值,例如:String env = System.getProperty("app.env", "dev");
环境变量:操作系统层面的全局配置
环境变量由操作系统维护(如 PWD、PATH、HOME),Java 通过 System.getenv() 访问,它返回的是不可修改的 Map<String, String>。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 获取单个变量:
System.getenv("JAVA_HOME") - 获取全部变量:
System.getenv()返回完整映射,可遍历查看 - ⚠️ Windows 下变量名不区分大小写,Linux/macOS 区分——代码中建议统一用大写或按实际名称写,避免跨平台问题
配置优先级与常见实践
实际项目中常需组合使用两者,比如“开发环境用系统属性覆盖,生产环境读环境变量”。推荐统一入口封装逻辑:
立即学习“Java免费学习笔记(深入)”;
- 先查系统属性(便于测试时快速覆盖)
- 未命中再查环境变量(适合部署时注入)
- 最后 fallback 到硬编码默认值(如
"localhost:8080") - 示例逻辑:
String url = System.getProperty("api.url", System.getenv("API_URL"));<br> if (url == null) url = "https://default.example.com";
注意事项与避坑点
这两类配置看似简单,但容易在部署和调试中出错:
-
System.getenv()在某些受限环境(如部分容器、安全策略下)可能被禁用,抛出SecurityException - IDE 运行时的环境变量 ≠ 终端启动的环境变量,IntelliJ/Eclipse 需在运行配置中单独设置 Environment variables
- 系统属性不能在运行时动态“写入”,
System.setProperty()只对当前 JVM 有效,且不推荐用于配置中心场景 - 敏感信息(如密码)不要硬编码在
-D参数里,应通过环境变量 + 权限管控方式管理

















