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. 使用技巧

  1. 配置管理:将敏感信息(API密钥)存储在环境变量中
// 从环境变量获取API密钥
String apiKey = System.getenv("API_KEY");
  1. 开发/生产环境切换
# 启动时设置环境变量
java -DMODE=prod -jar app.jar
String mode = System.getenv().getOrDefault("MODE", "dev");
  1. 与系统属性配合
// 环境变量 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. 注意事项

  1. 不可变性

    Map<String, String> env = System.getenv();
    env.put("NEW_VAR", "value");  // 抛出UnsupportedOperationException
    
  2. 容器环境:Docker/K8s中需显式传递变量

    # Dockerfile示例
    ENV APP_VERSION=1.0
    CMD java -jar app.jar
    
  3. IDE配置:在开发环境中设置变量

    • Eclipse:Run Configurations → Environment
    • IntelliJ:Run/Debug Configurations → Environment variables

7. 最佳实践与性能

  1. 缓存机制:环境变量不变,适合初始化时缓存

    public class AppConfig {
        private static final String ENV = System.getenv("APP_ENV");
    
        public static String getEnvironment() {
            return ENV;  // 避免重复调用
        }
    }
    
  2. 安全建议

    • 敏感变量设置文件权限(如.env
    • 使用专用密钥管理服务(如AWS Secrets Manager)
  3. 性能对比: | 操作 | 耗时 (纳秒) | 说明 | |------------------------|-------------|--------------------------| | System.getenv("VAR") | ~200-500 | 涉及系统调用 | | 缓存的环境变量 | < 10 | 内存访问速度 |


8. 总结

关键点 实践建议
变量获取 优先使用getenv().getOrDefault()安全访问
跨平台开发 统一使用大写变量名或实现平台适配层
敏感数据处理 环境变量 + 访问控制 + 日志过滤
性能优化 初始化阶段缓存常用变量
容器部署 通过编排工具(Docker/K8s)注入变量