【问题标题】:Runtime.getRuntime().exec(), executing Java classRuntime.getRuntime().exec(),执行Java类
【发布时间】:2010-12-05 09:42:22
【问题描述】:

我正在我的应用程序中执行 Java 类。

proc = Runtime.getRuntime().exec("java Test");

如何识别Test 是否执行成功(即没有异常)?


重定向输出/错误:

proc = Runtime.getRuntime().exec(new String[] {
    "java",
    mclass,
    ">NUL 2>test.txt"
});

来自cmd

java Main >NUL 2>test.txt

【问题讨论】:

    标签: java runtime.exec


    【解决方案1】:
    process.waitFor();
    int exitCode = process.exitValue();
    if(exitCode == 0) { // success }
    else { // failed }
    

    如果 Test 设计正确并返回适当的退出代码(通常,如果出现问题,则 >0),这将有效。

    如果你想得到Tests 输出/错误消息来确定哪里出了问题,你应该得到proc.getInputStream()(这将返回子进程的输出流),proc.getErrorStream() 并从输入流中读取分开的线程。

    请注意,如果子进程写入错误/输出流并且没有读取器,它将被阻塞。所以在任何情况下读取进程的错误/输出流都是有用的。

    避免子阻塞的另一个选择是将其错误/输出重定向到文件和/或/dev/null(Windows 为“NUL”):

    Runtime.exec("java Test >/dev/null 2>&1");
    Runtime.exec("java Test >/dev/null 2>erroroutput");
    

    【讨论】:

    • 谢谢!我试过重定向。但是当我从 Windows cmd 运行它时,它运行良好。而当我使用exec 或进程构建器时,我的应用程序只是停止并且没有任何反应,所以我必须终止它。有什么建议吗?
    • 很难说清楚。尝试重定向到文件。执行后是否包含任何内容?
    • 请看我的更新。我做对了吗?使用cmdexec,文件不包含任何内容。
    • 好吧,虽然NIL 仍然对我不起作用,但我决定将错误和输出流放到单独的线程中。感谢您的帮助。
    • 只是为了不让未来的读者感到困惑。 Process 类中没有 exitCode() 方法。仅限exitValue()
    【解决方案2】:

    重定向是由 shell 处理器完成的,而不是 Runtime.exec()(至少在 Windows 上不是)。
    你需要通过cmd.exe执行你的命令:

    String command = "cmd /c java -classpath D:\\dev\\temp\\ Main >NUL 2>test.txt";
    proc = Runtime.getRuntime().exec(command);
    

    【讨论】:

    • 谢谢,它有效。如果我必须有独立于操作系统的解决方案怎么办?
    • 您可以检查“os.name”系统属性(System.getProperty)并调用适当的shell命令(sh或cmd)。或者小技巧:在 Unix/Linux 中创建一个名为“cmd”的链接,指向 shell 命令...
    【解决方案3】:

    See the Process class

    您可以调用proc.waitFor() 来返回一个整数值。但是您必须确保程序的所有输出都得到正确处理(例如,使用proc.getInputStream() 方法)。

    【讨论】:

      【解决方案4】:

      你试过proc.exitValue()吗?

      【讨论】:

        【解决方案5】:

        呃……什么?这样做:

        int response = (int)(getClass().getClassLoader().findClass("Test").
                getMethod("someStaticMethod", new String[]{}).
                invoke(null, new Object[]{}));
        

        这会调用动态加载的“Test”类的静态方法“int someStaticMethod()”。

        【讨论】:

        • 您可能并不总是想在自己的 JVM 中调用该类,尽管这样更有效。话又说回来,为什么不直接打电话给Test.sameStaticMethod()
        • @Marc:可能编译时类名未知?
        • @thejh 例如,您可能希望在单独的 JVM 中执行 java 代码以避免 32 位内存限制。
        • 我必须通过给定的类名调用给定位置的类。
        • @Little Jeans:你为什么不把它放在类路径中?
        【解决方案6】:

        您可以使用 java 的 ProcessBuilder 类来执行这些文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多