【问题标题】:ProcessBuilder or Runtime.getRuntime().exec won't complete jar executionProcessBuilder 或 Runtime.getRuntime().exec 不会完成 jar 执行
【发布时间】:2015-06-17 16:50:23
【问题描述】:

我有一个 jar,它使用 Java 中的 XSLT 将一种 XML 转换为另一种 XML 格式。 jar 将输出复制到某个文件夹。当在命令提示符下运行它但通过Runtime.getRuntime().exec or ProcessBuilder 运行它时,它工作得非常好,并没有完成该过程。只有 25 个文件被转换并冻结。当我关闭进程时,我可以看到输出文件夹中加载的所有文件都没有加载到同一个文件夹中。

有什么建议吗?

我的代码

 private boolean runLoaderScript() throws IOException, InterruptedException {
    String args[] = { "java", "-jar", "C:\\Users\\gursahibsahni\\Desktop\\jar\\epnlm_new-1.0.0-jar-with-dependencies_WSJ_stringdate.jar", "-c", "-f", "-d", "7", "C:\\Users\\gursahibsahni\\Desktop\\ConsynInput\\wsjInput\\input" };
    ProcessBuilder builder = new ProcessBuilder(args);
    Process qq = (builder).start();
    qq.waitFor();
    return true;
}

private boolean runValidator() throws IOException, InterruptedException {
    Process validatorProcess = Runtime.getRuntime().exec("java -jar C:\\Users\\gursahibsahni\\Desktop\\jar\\wsj_jar_20140423.jar  -efv -d 7 C:\\Users\\gursahibsahni\\Desktop\\ConsynInput\\wsjInput\\output");
    return (validatorProcess.waitFor()) == 0 ? true : false;
}

此外,当我尝试在我的项目中导入 jar 并调用 main 函数来转换 XML 时,它没有正确转换 XML。 意思是,常量的出现非常好,但是在导入期间没有调用类文件中调用以获取数据的函数。

是的!在命令行上运行jar就成功了!它完美无缺。但是导入时无法正确转换。为什么会有这样的行为?它非常奇怪。请帮忙。

【问题讨论】:

  • 当您可以将 JAR 文件导入到类路径并执行 {CLASS}.main({ARGS});(您可以使用反射动态导入类)时,为什么还要在 Java 中使用 exec?
  • 是的,它确实有效。但是为什么上述方法不起作用。 ?
  • @nulldev 我已经更新了问题。

标签: java xml xslt cmd processbuilder


【解决方案1】:

你必须消耗你的进程的 StdOut(也许还有 StdErr)......否则 当缓冲区被填满时,进程将挂起!

如果您不想自己编写代码,可以看看 Apache CommonsExec ...它有助于执行和处理外部进程 https://commons.apache.org/proper/commons-exec/tutorial.html

除其他外,它使用org.apache.commons.exec.ExecuteStreamHandler. 捕获子流程输出

【讨论】:

  • 它正在工作..你能解释一下缓冲区的填充吗?
  • 跟java本身没有关系。操作系统(在这方面 Linux、Win 等没有区别)在父进程和子进程之间创建了一个大小仅为几 kBytes 的缓冲区。如果您的子进程通过写入控制台来填充此缓冲区并且父进程没有使用缓冲区中的数据,那么最终缓冲区被填满并且子进程下一次写入它将阻塞并“挂起”子进程。跨度>
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多