如何在 Windows 上持续定义 Java 中的环境变量?

How do I persistently define environment variables in Java on Windows?

有没有办法使用 Java 更改 Windows 环境变量?我尝试使用 cmd 函数 set:

Process exec = Runtime.getRuntime().exec(new String[] {
      "cmd", "/c", "set", "HTTP_PROXY=" + PROXY_URL
});

if (exec.waitFor() != 0) {
    throw new IllegalStateException("Output: "
        + getText(exec.getInputStream())
        + "Error: " + getText(exec.getErrorStream()
        + "\n"
        + "Exit value: " + exec.exitValue());
}

这段代码运行没有任何错误,但是当我稍后检查系统变量时,没有任何改变。

我正在尝试更新 HTTP_PROXY,以便 HTTP 代理后面的其他软件 运行 可以使用它。

这是不可能的(至少永远不可能)。这有充分的理由(隔离,java 工具在不知不觉中改变了你的环境)。寻找 hack here :

编辑:

raffaele 给出了复杂的解释

进程在由名称-值对组成的环境中启动。当程序写入 env 变量时,它可以选择使该写入对子进程可见,但是当您检查该值时,您可能正在使用另一个无法访问的进程(可能 运行 通过 cmd.exe)到你的 Java 程序的环境。

我不知道你的代码的目的是否是以持久的方式定义环境变量,但如果是这样的话,如果没有特定的 OS 就无法在 Java 中完成工具并以独立于平台的方式。

环境变量默认值必须由系统工具存储在随后由相同系统工具从中读取的位置。在 Linux 上,用户主目录中有 .profile.bashrc 等文件,而在 Windows 上,您有注册表。例如在我的 Windows 7 我有: 我的 PATH 默认值存储在 \HKEY_CURRENT_USER\Environment - 所以你必须找到一种方法来写入系统注册表,例如命令 reg

The REG ADD command allows the user to add new keys and values to the Registry. To display the full range of parameters that can be used, type the following into the command line: reg add /?

To add the key HKLM\Software\MyNewApp on remote computer PC2, type:

REG ADD \PC2\HKLM\Software\MyNewApp

To add a registry entry to HKLM\Software\MyNewApp with a value named Data of type REG_BINARY and data of fe340ead, type:

REG ADD HKLM\Software\MyNewApp /v Data /t REG_BINARY /d fe340ead

您可以编写 .bat 脚本或从 Java 程序中调用 reg。您可能需要管理员权限并重新启动一些程序(最终是整个机器)以使更新生效(例如重新启动explorer.exe)