如何在Windows上用Java持久定义环境变量?

时间:2015-05-03 15:38:45

标签: java environment-variables

有没有办法使用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代理后面运行的其他软件可以使用它。

2 个答案:

答案 0 :(得分:4)

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

我不知道你的代码的目的是以持久的方式定义环境变量,但如果是这种情况,如果没有特定的OS工具并且不依赖于平台的方式,则无法在Java中完成。< / p>

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

  

REG ADD命令允许用户向注册表添加新的键和值。要显示可以使用的所有参数,请在命令行中键入以下内容:reg add /?

     

要在远程计算机PC2上添加密钥HKLM\Software\MyNewApp,请键入:

REG ADD \\PC2\HKLM\Software\MyNewApp
     

使用名为的值向HKLM\Software\MyNewApp添加注册表项   类型为Data的{​​{1}}和REG_BINARY的数据,请输入:

fe340ead

您可以编写REG ADD HKLM\Software\MyNewApp /v Data /t REG_BINARY /d fe340ead 脚本或从Java程序中调用.bat。您可能需要管理员权限并重新启动某些程序(最终是整个计算机)才能使更新生效(例如,重新启动explorer.exe)

答案 1 :(得分:0)

这是不可能的(至少是永远的)。这有很好的理由(隔离,java工具在不知不觉中改变你的环境)。寻找黑客here

编辑:

raffaele给出了一个复杂的解释