编程语言
首页 > 编程语言> > Java processbuilder和使用环境变量

Java processbuilder和使用环境变量

作者:互联网

我想做的是我想运行一个流程,但是因为该流程本身依赖于环境变量,所以直接调用它会导致流程内的错误.对于那些想知道这是什么的人,它是耙工具.因此,我认为使用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()行,并尝试在其中回显$GEM_HOME,它不打印任何内容,如果我在操作系统bash上执行此操作,那么我会得到路径,我还尝试了其他常见的操作,例如echo $SHELL并以Java代码和bash格式打印外壳位置.

所以我的问题是:

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

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

解决方法:

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

要回答第2部分,是的,该过程将与ProcessBuilder.environment()中的环境一起启动.您可以简单地将内容添加到由ProcessBuilder.environment()返回的地图中,这将扩展运行时环境:

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

标签:processbuilder,environment-variables,linux,java,process
来源: https://codeday.me/bug/20191120/2042356.html