1. 方法定义
System.getenv()
提供了两个重载方法访问环境变量:
// 获取指定环境变量的值(String)
public static String getenv(String name)
// 获取所有环境变量的不可变Map(Map<String, String>)
public static Map<String, String> getenv()
2. 功能说明
- 环境变量来源:
- 操作系统级别(PATH、JAVA_HOME等)
- 进程级别(启动程序时设置)
- 特性:
- 只读:无法通过此API修改环境变量
- 平台相关:
- Windows:变量名不区分大小写(但Java返回大写形式)
- Linux/macOS:严格区分大小写
- 启动时确定:程序运行期间环境变量通常不变
3. 示例代码
(1) 获取单个环境变量
String javaHome = System.getenv("JAVA_HOME");
System.out.println("Java安装路径: " + javaHome);
// 安全获取(避免NPE)
String dbHost = System.getenv().getOrDefault("DB_HOST", "localhost");
(2) 获取所有环境变量
Map<String, String> envMap = System.getenv();
envMap.forEach((key, value) ->
System.out.println(key + " = " + value)
);
(3) 跨平台示例
// 处理不同系统的路径变量
String pathVar = System.getProperty("os.name").startsWith("Windows")
? "Path" : "PATH";
System.out.println("系统路径: " + System.getenv(pathVar));
4. 使用技巧
- 配置管理:将敏感信息(API密钥)存储在环境变量中
// 从环境变量获取API密钥
String apiKey = System.getenv("API_KEY");
- 开发/生产环境切换:
# 启动时设置环境变量
java -DMODE=prod -jar app.jar
String mode = System.getenv().getOrDefault("MODE", "dev");
- 与系统属性配合:
// 环境变量 vs 系统属性
String envPath = System.getenv("PATH"); // 操作系统级
String jvmPath = System.getProperty("java.library.path"); // JVM级
5. 常见错误
错误 | 原因 | 解决方案 |
---|---|---|
NullPointerException |
未检查变量是否存在 | 使用getOrDefault() 或空检查 |
跨平台兼容问题 | Windows/Linux变量名大小写差异 | 统一使用大写或平台检测 |
安全配置泄露 | 意外打印敏感环境变量 | 日志过滤敏感字段 |
错误示例:
// 未处理变量不存在的情况
String secret = System.getenv("SECRET_KEY"); // 可能返回null
secret.toUpperCase(); // NullPointerException
修复方案:
String secret = System.getenv().getOrDefault("SECRET_KEY", "");
if(!secret.isEmpty()) {
// 安全操作
}
6. 注意事项
不可变性:
Map<String, String> env = System.getenv(); env.put("NEW_VAR", "value"); // 抛出UnsupportedOperationException
容器环境:Docker/K8s中需显式传递变量
# Dockerfile示例 ENV APP_VERSION=1.0 CMD java -jar app.jar
IDE配置:在开发环境中设置变量
- Eclipse:Run Configurations → Environment
- IntelliJ:Run/Debug Configurations → Environment variables
7. 最佳实践与性能
缓存机制:环境变量不变,适合初始化时缓存
public class AppConfig { private static final String ENV = System.getenv("APP_ENV"); public static String getEnvironment() { return ENV; // 避免重复调用 } }
安全建议:
- 敏感变量设置文件权限(如
.env
) - 使用专用密钥管理服务(如AWS Secrets Manager)
- 敏感变量设置文件权限(如
性能对比: | 操作 | 耗时 (纳秒) | 说明 | |------------------------|-------------|--------------------------| |
System.getenv("VAR")
| ~200-500 | 涉及系统调用 | | 缓存的环境变量 | < 10 | 内存访问速度 |
8. 总结
关键点 | 实践建议 |
---|---|
变量获取 | 优先使用getenv().getOrDefault() 安全访问 |
跨平台开发 | 统一使用大写变量名或实现平台适配层 |
敏感数据处理 | 环境变量 + 访问控制 + 日志过滤 |
性能优化 | 初始化阶段缓存常用变量 |
容器部署 | 通过编排工具(Docker/K8s)注入变量 |