当前位置: 首页 > 面试题库 >

Java中的ProcessBuilder环境变量

慕容雅珺
2023-03-14
问题内容

我正在尝试为ProcessBuilder对象添加环境变量,但是当我在ProcessBuilder中调用该新变量时,出现错误。这就是我建立流程的方式

public class OTU
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder();
        Map<String, String> env = pb.environment();
        //set environment variable u
        env.put("u", "util/");

        pb.command("echo $u");
        Process p = pb.start();
        String output = loadStream(p.getInputStream());
        String error  = loadStream(p.getErrorStream());
        int rc = p.waitFor();
        System.out.println("Process ended with rc=" + rc);
        System.out.println("\nStandard Output:\n");
        System.out.println(output);
        System.out.println("\nStandard Error:\n");
        System.out.println(error);
    }

    private static String loadStream(InputStream s) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(s));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line=br.readLine()) != null)
            sb.append(line).append("\n");
        return sb.toString();
    }
}

我得到了错误

Exception in thread "main" java.io.IOException: Cannot run program "$u": java.io.IOException: error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:475)
    at ca.utoronto.siseq_1_2.OTU.main(OTU.java:22)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
    at java.lang.ProcessImpl.start(ProcessImpl.java:81)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:468)
    ... 1 more

我不明白,如果我只是为此过程设置变量,为什么会出现错误。请帮助我如何设置env变量,以便可以在ProcessBuilder中使用它。


问题答案:

Alfredo O的示例为您提供了正确的想法。您需要告诉ProcessBuilder使用哪个程序来执行命令。在这种情况下,bash带有“
-c”开关
,它告诉bash将下一个命令(即“ echo $ u”)解释为命令。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;

public class OTU {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "echo $u");
        Map<String, String> env = pb.environment();
        // set environment variable u
        env.put("u", "util/");

        Process p = pb.start();
        String output = loadStream(p.getInputStream());
        String error = loadStream(p.getErrorStream());
        int rc = p.waitFor();
        System.out.println("Process ended with rc=" + rc);
        System.out.println("\nStandard Output:\n");
        System.out.println(output);
        System.out.println("\nStandard Error:\n");
        System.out.println(error);
    }

    private static String loadStream(InputStream s) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(s));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null)
            sb.append(line).append("\n");
        return sb.toString();
    }
}

这将产生以下输出:

Process ended with rc=0

Standard Output:

util/


Standard Error:


 类似资料:
  • 问题内容: 我正在尝试为Java中的流程构建器设置PATH环境变量,我尝试了以下操作: 但是以下操作无效,流程构建器选择了默认系统路径。 问题答案: 在新过程中使用路径。它不用于查找命令。 您可以尝试下一个解决方案。运行cmd.exe(bash等),然后运行命令。 例:

  • 问题内容: 如何在Windows中为Java(类路径)设置环境变量? 问题答案: 64位Windows 7或Windows 8上的Java SE Development Kit 8u112 设置以下用户环境变量(== 用户变量类型的环境变量) JAVA_HOME : C:\Program Files\Java\jdk1.8.0_112 JDK_HOME : %JAVA_HOME% JRE_HOME

  • 问题内容: Jenkins(管理jenkins->系统信息)下的环境变量从何而来? 我检查了/etc/init.d/tomcat5,/ usr / bin / dtomcat5,/ usr / bin / tomcat5,/ etc / sysconfig / tomcat5和/ etc / profile,但在那里没有看到任何此类变量,特别是与Oracle相关的变量(Base,Home,Ld_l

  • 问题内容: 对于Windows 7,我已经安装了32位和64位版本的JDK。所有四个安装的版本均为8,更新为20。 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 当我下载并解压缩elasticsearch并运行/bin/service.bat或/bin/elasticsearc

  • 问题内容: Java是否具有默认的“系统环境变量”,当我们设置它时将始终读取/附加它?/ etc似乎仅适用于TOMCAT / JBOSS等。 我不想通过Java系统属性(通过-Dprop1 = value1 -Dprop2 = value2传递)来设置它,因为它涉及shell / batch脚本。 它应可跨操作系统使用,例如Windows中的双击jar文件。 它应该可以在不同的JRE(Sun,IB

  • 问题内容: 已在Windows机器(Windows 7)中设置了环境变量,并尝试从以下Java代码获取变量的值。但是,它返回一个空值。 现在,如果我执行以下代码,它将引发安全异常,这意味着用户没有该变量。 后来,我在JRE安全策略文件中添加了权限,并添加了以下条目,但仍返回空值。 问题答案: 此代码段不应返回null以便解决您的问题。