2015-05-03 51 views
1

有没有办法使用Java更改Windows环境变量?我试图与CMD功能set如何在Windows上持久定义Java环境变量?

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代理后面的软件可以使用它。

+0

嗨Ramesh能否详细介绍一下您尝试实现的功能? – jirungaray

+0

你并没有做出持久的改变。您仅更新您创建的流程中的值。 –

+0

我想更改HTTP_PROXY env var,以便我可以在代理之后运行诸如php composer之类的软件。有没有办法做到这一点,而无需更改系统变量..? –

回答

4

过程是在由名称 - 值对的环境推出了说明。当一个程序写入一个env变量时,它可以选择使这个写入对子进程可见,但是当你检查这个值时,你很可能使用了另一个无法访问Java环境的进程(可能通过cmd.exe运行)程序。

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

环境变量默认值必须由系统工具保存在相同的系统工具读取的地方。在Linux上,在用户家中有.profile.bashrc这样的文件,而在Windows上有注册表。例如在我的Windows 7,我有:存储在\HKEY_CURRENT_USER\EnvironmentPATH默认值 - 所以你必须找到一种方式来写入系统注册表,例如命令reg

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

要在远程计算机PC2,类型添加密钥HKLM\Software\MyNewApp

REG ADD \\PC2\HKLM\Software\MyNewApp 

要添加注册表项,以HKLM\Software\MyNewApp与名为 DataREG_BINARY类型和fe340ead数据的类型的值,:

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

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

0

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

编辑:

一个复杂的解释是由拉菲尔

+0

不,这不是我想要的东西。我想更改一个系统变量,以便其他软件可以使用它。 (这些软件不执行我的Java软件).. 我认为我的任务是不可能的,然后.. –

+0

多数民众赞成在我的意思。通过手动更改路径给予一般权限(为什么不呢,如果这是所需的效果)。你为什么要从Java永久设置它,如果你的ENV应该永久保留下来? – phiology