【问题标题】:Set Linux environment variable programmatically in Java在 Java 中以编程方式设置 Linux 环境变量
【发布时间】:2012-12-24 14:19:33
【问题描述】:

我可以通过RunTime 类运行 Linux 命令。 有没有办法以编程方式从 Java 设置 Linux 全局环境?

我想通过 Java 模拟以下 Linux 命令语句

root@machine:/tmp# export TEST=v2

我使用了如下的 ProcessBuilder,但 TEST 变量没有改变。

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

更新: 实际上,我的最终目标是使用 EMAIL_NAME 环境作为电子邮件地址,当我的应用程序和机器都启动并停止时,这些操作将发送到 EMAIL_NAME。 在那种情况下,我知道不可能在纯 Java 代码上设置 linux 全局环境。所以我有一个变通的解决方案是 EMAIL_NAME 将保存在一个文件中,它将被 linux 脚本或 java 代码更新或读取。

【问题讨论】:

  • 这里的Linux 命令是什么意思?
  • 如果您使用ProcessBuilder,您可以使用.environment() 获得一个可变的环境映射并修改该映射——当然,在执行命令之前。
  • 类似的答案:stackoverflow.com/questions/580085/… - 虽然使用 ProcessBuilder 只会为所有分叉进程设置环境(进程由于从 Java 进程调用而运行)。
  • 这里有一个关于这个主题的长时间讨论:stackoverflow.com/questions/318239/…

标签: java linux


【解决方案1】:

环境变量在设置时仅可用于由设置变量的进程生成的进程,因此,如果您真的要求设置一个会影响整个系统的变量,那么不。在 Linux 中,您根本无法以交互方式真正做到这一点。您可以做的最好的事情是更改其中一个系统启动文件以包含所述变量,以便您在未来中所做的任何事情都会包含该变量。

如果您只是想通过设置一些变量来运行多个进程,那么ProcessBuilder 允许您使用set an environment 来获取由它生成的进程。为多个进程重用一个环境是非常简单的。

【讨论】:

    【解决方案2】:

    当您说“Linux 全局环境”时,您是指 Linux 环境变量吗?如果是这样,我认为答案是否定的。因为这不是java问题。当进程设置环境变量时,它只会影响自己及其子进程。

    【讨论】:

    • 这不是Java问题,是吗?如果我启动一个新的终端窗口,执行“export TEST=v2”然后退出,它不会存在于父进程的环境中。如果我用 C、C++、pascal、汇编程序、Java、Python 或我们能想到的任何其他语言编写,同样适用。
    • @MatsPetersson 我的错字。我只是发现我没有错过。我的意思是“这不是 java 问题”。
    • 啊,是的,这让整个句子变得更好!
    【解决方案3】:

    你可以通过java将变量更新到/etc/profile

    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") ;
    }
    

    这将从下次登录或您明确来源时生效。

    【讨论】:

    • 每次都会有新的 TEST 变量插入 /etc/profile。
    • 仅当您每次都运行 java 程序时。但我假设你只想运行一次。另一方面,/etc/profile 将在您每次用户登录时执行。
    • 此外,如果您计划每次都运行 Java 程序 .. 那么您可能应该首先检查变量是否存在.. System.getProperty("TEST") .. 如果它不存在然后设置它在当前进程环境和 /etc/profile
    • Plus One 实际回答了 OP 提出的问题。
    【解决方案4】:

    我在 bash 中使用这行代码

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

    with 连接本地用户的路径

    【讨论】:

    • 这应该是个评论;不是答案。问题是,在 Java 中以编程方式设置 Linux 环境变量。当 OP 特别要求 “以 Java 编程方式” 时,您为什么要提供 Bash 配方?
    猜你喜欢
    • 2012-09-14
    • 2011-02-22
    • 2012-10-16
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多