2012-12-24 65 views
9

我能够通过RunTime类运行Linux命令。 有没有一种从编程的方式从Java设置Linux全局环境的方法?用Java以编程方式设置Linux环境变量

我想对Java

[email protected]:/tmp# export TEST=v2 

我已经使用的ProcessBuilder如下效仿以下Linux命令语句,但测试变量不发生变化。

ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","export TEST=v3" + "&& exec"); 

UPDATE: 其实我的最终目标是使用EMAIL_NAME环境作为一个电子邮件地址,当我的两个应用程序和机器被启动,stopeed这些行为将被发送到EMAIL_NAME。 在这种情况下,我明白,不可能通过纯Java代码设置linux全局环境。所以我有一个解决方法是EMAIL_NAME将被保存在一个文件中,并且它将被更新或通过linux脚本或java代码读取。

+0

这里用'Linux'命令表示什么意思? –

+0

如果您使用'ProcessBuilder',当然可以在执行命令之前使用'.environment()'修改该映射的环境变量映射。 – fge

+0

相似的答案:http://stackoverflow.com/questions/580085/is-it-possible-to-set-an-environment-variable-at-runtime-from-java - 虽然使用“ProcessBuilder”只会设置环境对于所有分叉的进程(进程由于从Java进程中调用而运行)。 – birryree

回答

9

环境变量在设置时只能用于设置变量的进程产生的进程,所以如果你真的要设置一个影响整个系统的变量,那么不会。交互式地在Linux中完全不能这样做。你可以做的最好的办法是修改其中一个系统启动文件以包含所述变量,这样你在未来的任何事情都会包含该变量。

如果您只是想用某些变量集运行几个进程,那么ProcessBuilder允许您为其产生的进程set an environment。对于几个进程重用一个环境是非常微不足道的。

-1

我使用这行代码在bash

echo -e PATH=\"/usr/lib/jvm/java-7-openjdk-i386/bin:\$PATH\" >> $HOME/.profile 

与地连接了本地用户

+0

这应该可能是一个评论;不是答案。问题是,*在Java *中以编程方式设置Linux环境变量。当OP特意要求*“以编程方式使用Java”*时,为什么要提供Bash配方? – jww

2

当你说“全球Linux环境”的路径,你的意思是Linux环境变量?如果是这样,我认为答案是否定的。因为这不是一个java问题。当一个进程设置环境变量var时,它只能影响自身及其子进程。

+1

这不是Java问题,是吗?如果我启动一个新的终端窗口,执行“export TEST = v2”然后退出,它不会存在于父进程的环境中。如果我用C,C++,pascal,汇编程序,Java,Python或任何其他我们能想到的语言编写,那也是一样。 –

+0

@MatsPetersson我的排字错误。我刚刚发现我错过了不是。我的意思是“这不是一个Java问题”。 – TieDad

+0

啊,是的,这让整个句子变得更好! –

1

您可以通过Java

if(System.getProperty("TEST", "").equalsIgnoreCase("")) 
{ 
    Runtime.getRuntime().exec(new String[]{"bash","-c" ,"echo 'export TEST=v2' >> /etc/profile"}) ; 

    /// Also update the System Variable for current process 
    System.setProperty("TEST","v2") ; 
} 

更新变量在/ etc/profile文件,这将得到有效的从下次登录或者如果你明确地获取它。

+0

每次都会有新的TEST变量插入到/ etc/profile中。 –

+0

只有当你每次运行java程序。但我认为你只想运行一次。另一方面/ etc/profile会在用户每次登录时执行。 –

+0

此外,如果您计划每次运行Java程序..那么可能您应该首先检查变量是否存在.. System.getProperty(“TEST “)..如果它不存在,则将其设置在当前进程环境和/ etc/profile中 –