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

无法从Java启动程序(使用ProcessBuilder)

凌联
2023-03-14
问题内容

我正在尝试从Java应用程序调用cleartool,但是
即使对于简单的“ -version”参数,cleartool也会挂起。运行cleardiff而不是cleartool
可以正常工作,因此显然cleartool
程序有一些特定的东西(我认为这与其交互功能有关)。

以下程序

import java.io.*;
import java.util.*;

public class ExecTesting extends Thread {

    private List<String> command = new ArrayList<String>();

    public ExecTesting (List<String> command) {
        super();
        this.command = command;
    }

    private void print(String s) {
        System.out.println(s);
    }

    @Override
    public void run() {
        Process process;
        OutputStream stdin;
        InputStream stdout;
        InputStream stderr;
        String line;

        try {
            String commandString = joinList(command, " ");
            print("Executing: " + commandString);

            // runtime.exec has several issues (http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1)
            // better to use ProcessBuilder (http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#2)
            //process = Runtime.getRuntime().exec(commandString);
            process = new ProcessBuilder(command).start();
            // it fails in both cases though

            stdin  = process.getOutputStream();
            stdout = process.getInputStream();
            stderr = process.getErrorStream();

            BufferedReader bufferedStderr = new BufferedReader(new InputStreamReader(stderr));
            while ((line = bufferedStderr.readLine()) != null) {
                print("stderr: " + line);
            }
            bufferedStderr.close();

            BufferedReader bufferedStdout = new BufferedReader(new InputStreamReader(stdout));
            while ((line = bufferedStdout.readLine()) != null) {
                print("stdout: " + line);
            }
            bufferedStdout.close();

            stdin.close();
            stdout.close();
            stderr.close();

            process.waitFor();
            print("Execution finished, exit code " + process.exitValue());
            process.destroy();
        } catch (IOException e) {
            print("IOException: " +e.getStackTrace());
        } catch (InterruptedException e) {
            print("InterruptedException: " + e.getStackTrace());
        }

    }

    /* assumes a list with at least one element */
    private static String joinList(List<String> list, String glue) {
        Iterator<String> i = list.iterator();
        String ret = i.next();
        while (i.hasNext()) {
            ret += glue + i.next();
        }
        return ret;
    }

    public static void main(String[] args) {
        ArrayList<String> cmd1 = new ArrayList<String>();
        cmd1.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleardiff.exe");
        cmd1.add("-version");
        ExecTesting et1 = new ExecTesting(cmd1);
        et1.start();

        ArrayList<String> cmd2 = new ArrayList<String>();
        //cmd2.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleardiff.exe");
        cmd2.add("c:\\Program Files\\Rational\\ClearCase\\bin\\cleartool.exe");
        cmd2.add("-version");
        ExecTesting et2 = new ExecTesting(cmd2);
        et2.start();

        et1 = new ExecTesting(cmd1);
        et1.start();
    }
}

gives the following output

Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version]
Executing: [c:\Program Files\Rational\ClearCase\bin\cleartool.exe, -version]
Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version]
stdout: cleardiff                         2003.06.10+ (Tue Jul 13 14:02:05  2004)
Execution finished, exit code 0

hanging on the execution of the cleartool command. If instead cmd2 is changed
to cleardiff the output is as expected

Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version]
Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version]
Executing: [c:\Program Files\Rational\ClearCase\bin\cleardiff.exe, -version]
stdout: cleardiff                         2003.06.10+ (Tue Jul 13 14:02:05  2004)
Execution finished, exit code 0
stdout: cleardiff                         2003.06.10+ (Tue Jul 13 14:02:05  2004)
Execution finished, exit code 0
stdout: cleardiff                         2003.06.10+ (Tue Jul 13 14:02:05  2004)
Execution finished, exit code 0

Question: Does anyone know why cleartool is hanging and how to fix?


问题答案:

您应该在单独的线程中使用stdout和stderr,否则
会遇到阻塞行为。

我怀疑这就是这种情况(它与cleartool / cleardiff无关,除了它们输出的是stdout / err外)。



 类似资料:
  • 问题内容: 因此,我们安装了Java 7u21版本,该版本应该加强小程序的安全性。不幸的是,它太紧了,以致我们的applet不再运行。不好。 有趣的是,只有在我们使用JWS进行操作时,它才停止工作。如果我们从标准网页将其作为标准小程序启动,则一切正常。 在JWS模式下,我们至少在反射和方面遇到了安全问题。 证书看起来还可以。 Oracle的发行说明没有提供任何与JWS相关的信息。 因此,我对社区的

  • 我试图运行简单的Spring Data Rest Boot应用程序(v1.2.3. RELEASE),只有一个小的修改从工作Spring参考示例应用程序(http://spring.io/guides/gs/accessing-mongodb-data-rest/),它无法启动。 更具体地说,当我使用: 下面是简单的代码配置: 在没有其他任何问题的情况下,我在启动时遇到以下错误: 2015-04-

  • 我已经在tomcat服务器上安装了应用程序。在启动和加载应用程序的过程中,我有以下堆栈跟踪的错误。如何解决这个问题? apache-tomcat-7.0.47/webapps/petclinic 2016年10月27日下午12:14:36 org。阿帕奇。卡塔琳娜。果心标准上下文起始内部 严重:ServletContainerInitializer处理javax时出错。servlet。Servle

  • 问题内容: 我希望能够从现有的Java应用程序启动Java服务器进程,并监视stdoutput和stderror并将该输出重定向到文件。是使用“ Runtime.exec”并像对待其他任何OS进程一样对待应用程序的最佳方法,还是有一些更适合新JVM的方法。 这是在Java 1.5上 问题答案: 而不是,您可能应该使用,尽管我不知道其他情况是否更适合您的情况(尤其是运行Java进程)。

  • 问题内容: 直到最近,我还能够使用 Java web start 在 Firefox中 启动/打开 JNLP 文件。 不知道发生了什么事,突然突然启动了 JNLP 文件,出现了启动屏幕,显示 Java正在启动… ,然后什么也没有发生。甚至浏览器和 javacpl.cpl 小程序中的 Java控制台 也不会打开。 __ 尝试了所有可能性:删除了所有较旧的版本并安装了最新的JRE(Java版本“ 1.

  • 问题内容: 我正在尝试按照本教程创建可执行文件 https://github.com/anthony- tuininga/cx_Freeze/tree/master/cx_Freeze/samples/Tkinter 进行一些调整后,我可以编译项目,但是当我单击.exe时,会触发加载鼠标的动画,但没有任何加载。之前曾问过这个问题,但从未解决过。 我的应用程式档案 我的setup.py 另外我一直在