【问题标题】:Java processbuilder and using environment variablesJava processbuilder和使用环境变量
【发布时间】:2015-08-14 23:59:25
【问题描述】:

我想要做的是我想运行一个进程,但是因为这个进程本身依赖于环境变量,直接调用它会导致进程内的错误。对于那些想知道这是什么的人,它是rake 工具。出于这个原因,我认为最好使用bash 并通过bash 使用它可以消除这个问题。然而,情况似乎并非如此。

这是我的代码:

public static void runPB(String directory) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder(
                "/bin/bash");
        processBuilder.directory(new File(directory));
        Process process = processBuilder.start();
        OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
        osw.write("rake routes");
        osw.close();
        printStream(process.getErrorStream());
        printStream(process.getInputStream());
    }

    public static void printStream(InputStream is) throws IOException {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }

我知道这是与环境相关的问题,因为这里描述了我遇到的错误cannot load such file -- bundler/setup (LoadError)

我进一步检查了processBuilder.environment() 返回的环境变量少于输入env。我继续并更改了osw.write() 行并在那里尝试了echo $GEM_HOME,它不会打印任何内容,如果我在我的操作系统bash 上执行此操作,那么我得到了路径,我还尝试了其他常见的东西,例如echo $SHELL 和它在 Java 代码和 bash 中打印 shell 位置。

所以我的问题是:

1) 为什么我的操作系统的环境变量与ProcessBuilder.environment()方法不同?

2) Process 类是否考虑使用ProcessBuilder.environment() 给出的环境变量?如果是这样,我们如何从操作系统级别添加缺少的?

【问题讨论】:

  • 你在启动java进程之前是否已经设置了这些环境?如果不是,那么显然 ProcessBuilder 可能会返回不同的值。环境变量是特定于进程的,并从父(执行)进程继承。见man 2 execve

标签: java linux process environment-variables processbuilder


【解决方案1】:

1) 您在 java 进程中看到的变量是从您启动 java 进程的进程继承的变量。 IE。如果从 shell 启动它,它应该具有与 shell 相同的变量。您需要在启动 Java 应用程序之前调查实际设置了哪些变量,以及为什么未在该上下文中设置您期望的变量。

回答第 2 部分,是的,该过程将在 ProcessBuilder.environment() 的环境中启动。您可以简单地向ProcessBuilder.environment() 返回的地图添加东西,这将扩展运行时环境:

ProcessBuilder pb = new ProcessBuilder("foo");
pb.environment().put("MY_VAR", "foobar");

【讨论】:

  • 非常感谢!当我构建 JAR 时,它就像一个魅力。然后我使用 bash 来使用我的 IDE,它也可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2011-11-13
  • 2014-10-24
相关资源
最近更新 更多