【问题标题】:Java ProcessBuilder() runs a program, but the program doesn't return any outputJava ProcessBuilder() 运行程序,但程序不返回任何输出
【发布时间】:2016-02-13 13:04:38
【问题描述】:

我这样运行程序:

    Process process;
    try {
        process = new ProcessBuilder("java", "-jar", "test.jar", "1", "20").start();
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
          System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我调用的程序使用标准输出System.out.println("Hello!"); 但是,调用程序什么也没得到。我使用 ProcessBuilder() 错了吗?谢谢!

【问题讨论】:

  • 请显示所有代码,这段代码怎么称呼?
  • 您是否 100% 肯定 `java -jar test.jar 1 20" 输出了什么?您是否也尝试过重定向错误流?
  • 你可以在stackoverflow中按照这个例子clickhere
  • @ManojKrishna 很好的提示,但最好这样写你的评论:“你可以在 stackoverflow 中关注this example
  • 运行第二个 JVM 有限制吗?为什么不使用另一个类加载器在当前 JVM 中运行代码?

标签: java processbuilder


【解决方案1】:

如果没有启动另一个 JVM 的限制(例如:在 test.jar 中使用 System.exit()),您可以在当前 JVM 中加载并运行 test.jar

下面sn-p说明原理。

File file = new File("/tmp/test.jar");
URLClassLoader loader = new URLClassLoader(
        new URL[]{file.toURI().toURL()}
);

String className = new JarFile(file)
        .getManifest()
        .getMainAttributes()
        .getValue(Attributes.Name.MAIN_CLASS);

Method main = loader
        .loadClass(className)
        .getDeclaredMethod("main", String[].class);

Object arg = new String[]{"1", "20"};

try {
    main.invoke(null, arg);
} catch (Exception e) {
    // do appropriate exception handling here
    e.printStackTrace(System.err);
}

【讨论】:

  • 但是你能在不使用 processBuilder 的情况下捕获那个 jar 的输出吗?
  • @firstpostcommenter 你的意思是将test.jar 的输出重定向到别的东西然后System.out
  • 是的,此代码不允许使用 System.out,因为 processBuilder 使之成为可能(如果需要,我们可以使用 shell 脚本将第一个 jar 输出通过管道传输到第二个 jar 输入,但那是不同的解决方案)
  • @firstpostcommenter 这取决于您的要求和想要实现的目标。与使用登录框架从当前 JVM 中启动另一个 JVM 不同,这样的解决方案会占用更少的内存并且可能更快(与额外 JVM 的启动时间相关)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多