Environment Variables

许多 os 使用环境变量将配置信息传递给应用程序。像 Java 平台中的属性一样,环境变量是键/值对,其中键和值都是字符串。设置和使用环境变量的约定在 os 之间以及命令行解释器之间都不同。要了解如何将环境变量传递给系统上的应用程序,请参阅系统文档。

查询环境变量

在 Java 平台上,应用程序使用System.getenv来检索环境变量值。 getenv不带参数,返回java.util.Map的只读实例,其中 Map 键是环境变量名称,Map 值是环境变量值。 EnvMap示例中对此进行了演示:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n",
                              envName,
                              env.get(envName));
        }
    }
}

通过String参数,getenv返回指定变量的值。如果未定义变量,则getenv返回nullEnv示例使用getenv这种方式查询在命令行上指定的特定环境变量:

public class Env {
    public static void main (String[] args) {
        for (String env: args) {
            String value = System.getenv(env);
            if (value != null) {
                System.out.format("%s=%s%n",
                                  env, value);
            } else {
                System.out.format("%s is"
                    + " not assigned.%n", env);
            }
        }
    }
}

将环境变量传递给新进程

当 Java 应用程序使用ProcessBuilder对象创建新进程时,传递给新进程的默认环境变量集与提供给应用程序的虚拟机进程的环境变量集相同。应用程序可以使用ProcessBuilder.environment更改此设置。

平台依赖性问题

在不同系统上实现环境变量的方式之间有许多细微的差异。例如,Windows 会忽略环境变量名称中的大小写,而 UNIX 则不会。使用环境变量的方式也有所不同。例如,Windows 在名为USERNAME的环境变量中提供用户名,而 UNIX 实现可能在USERLOGNAME或两者中提供用户名。

为了最大程度地提高可移植性,当系统属性中具有相同值时,切勿引用环境变量。例如,如果 os 提供了用户名,则该用户名将始终在系统属性user.name中可用。