【问题标题】:ProcessBuilder won't fireProcessBuilder 不会触发
【发布时间】:2012-11-02 10:33:58
【问题描述】:

我有一个流程构建器,但由于某种原因它无法工作。我有一个名为“test.jar”的 jar 文件,它有一个类,带有此代码。

package me.thefiscster510.debugger;

public class Main {
    public static void main(String[] args){
        System.out.print(System.getenv("APPDATA"));
        System.exit(0);
    }
}

然后我有另一个 jar 有一个按钮,这是按钮事件处理程序..

public class buttonhandler implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent arg0){
        // TODO Auto-generated method stub
        ProcessBuilder pb;
        try {
            pb = new ProcessBuilder("java", "-jar", "test.jar");
            pb.environment().put("APPDATA", textfield.getText() == null ? System.getenv("APPDATA") : textfield.getText());
            Process p = pb.start();
        }catch(IOException e){
            e.printStackTrace();
        }

    }

}

代码没有做任何事情..就像,它只是坐在那里..没有在控制台中放置任何东西,什么都没有..有人可以告诉我发生了什么吗?

【问题讨论】:

  • 您应该执行String s = new File(".").getCanonicalPath() + File.separator + "test.jar" 之类的操作并打印出s 是什么,并确保它为初学者指向正确的路径。
  • 已经这样做了,它输出的正是我想要的.. C:\Users\MYNAMEHERE\Desktop\Testing\test.jar
  • 如果您手动打开命令提示符并输入java -jar C:\Users\MYNAMEHERE\Desktop\Testing\test.jar 是否有效?
  • 它不会打印到控制台,而是打印到您的进程。你需要消耗它。

标签: java process environment-variables processbuilder


【解决方案1】:

如果您使用的是 Java7,您应该在开始该过程之前调用pb.inheritIO()。这会将进程的标准输出和错误重定向到父 java 进程的流。然后你应该会看到它输出到控制台。

如果你不在Java7上,那么你需要通过调用p.getInputStream()来捕获子进程的标准输出,然后你可以将该数据复制到你的标准输出中。最简单的方法是使用IOUtils.copy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2016-04-24
    • 2015-04-12
    相关资源
    最近更新 更多