Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows上用Java持久定义环境变量?_Java_Environment Variables - Fatal编程技术网

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

如何在Windows上用Java持久定义环境变量?,java,environment-variables,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.

有没有办法使用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工具在不知不觉中改变了您的环境)。寻找黑客:

编辑:


拉斐尔给出了一个复杂的解释,这是不可能的(至少永远如此)。这有很好的理由(隔离、java工具在不知不觉中改变了您的环境)。寻找黑客:

编辑:


raffaele给出了一个复杂的解释

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

我不知道您的代码的目的是否是以持久的方式定义环境变量,但如果是这样的话,那么在没有特定操作系统工具的情况下,在Java中无法以独立于平台的方式完成

环境变量默认值必须由系统工具存储在同一系统工具从中读取的位置。在Linux上,用户主页中有像
.profile
.bashrc
这样的文件,而在Windows上则有注册表。例如,在我的Windows 7上,我的
路径
默认值存储在
\HKEY\u CURRENT\u USER\Environment
中,因此您必须找到写入系统注册表的方法,例如命令

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

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

REG ADD \\PC2\HKLM\Software\MyNewApp
使用名为的值将注册表项添加到
HKLM\Software\MyNewApp
REG_BINARY类型的
数据
fe340ead类型的数据
,类型:

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

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

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

我不知道您的代码的目的是否是以持久的方式定义环境变量,但如果是这样的话,那么在没有特定操作系统工具的情况下,在Java中无法以独立于平台的方式完成

环境变量默认值必须由系统工具存储在同一系统工具从中读取的位置。在Linux上,用户主页中有像
.profile
.bashrc
这样的文件,而在Windows上则有注册表。例如,在我的Windows 7上,我的
路径
默认值存储在
\HKEY\u CURRENT\u USER\Environment
中,因此您必须找到写入系统注册表的方法,例如命令

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

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

REG ADD \\PC2\HKLM\Software\MyNewApp
使用名为的值将注册表项添加到
HKLM\Software\MyNewApp
REG_BINARY类型的
数据
fe340ead类型的数据
,类型:

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

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

Hi Ramesh您能详细说明一下您要实现的目标吗?您没有进行持续的更改。您只更新您创建的进程内的值。我想更改HTTP_PROXY env var,这样我就可以在PROXY后面运行php composer之类的软件。在不改变系统变量的情况下,有什么方法可以做到这一点吗?我喜欢2008年的提问方式,以及它的回答——不是一个愚蠢的想法——Hi Ramesh,你能详细说明一下你试图实现的目标吗?你没有做出持续的改变。您只更新您创建的进程内的值。我想更改HTTP_PROXY env var,这样我就可以在PROXY后面运行php composer之类的软件。在不改变系统变量的情况下,有什么方法可以做到这一点吗?我喜欢2008年被问到这一问题的方式,以及它的回答——不是重复的想法不,这不是我想要的。我想更改一个系统变量,以便其他软件可以使用它。(这些软件不是由我的java软件执行的)。。我认为我的任务是不可能的那就是我的意思。通过手动更改路径来授予一般权限(如果这是所需的效果,为什么不这样做)。如果你的环境应该永远保持不变,你为什么要从java永久设置它呢?不,这不是我想要的。我想更改一个系统变量,以便其他软件可以使用它。(这些软件不是由我的java软件执行的)。。我认为我的任务是不可能的那就是我的意思。通过手动更改路径来授予一般权限(如果这是所需的ef,为什么不呢