使用JavaFx应用程序中的args执行Runnable Jar

问题描述

我需要从Java fx应用程序运行可执行jar。 我正在尝试以下代码

public void runJar() {
    try {
        //String serverIp = oRMIServer.getServerIP();
        String arg1 = "\"arg1\"";
        String arg2 = "\"arg2\"";
        String command = "java -jar "  + "path/of/jar.jar " + arg1 + " " + arg2;
        Runtime run = Runtime.getRuntime();
        Process proc = run.exec(command);
    } catch (Exception e) {
        System.out.println("Exception occured "+e);
    }

令人惊讶的是,如果我要创建一个新类并编写此代码,它将在我的日食中运行,但是在我的Java FX应用程序中,此代码根本没有运行。我看不到任何看起来像被跳过的东西。 有人可以帮忙如何从Java FX应用程序使用args执行Java可执行jar。

虽然我已经用过

String command = "cmd /c start \"\" \"" + classpath + "\\jre\\bin\\javaw.exe\" -jar \"" + classpath + "\\jarName.jar\" " + runTimeArg1 + " " + runTimeArg2;

Runtime run = Runtime.getRuntime();
Process proc = run.exec(command);

在此之后也没有任何反应。请帮忙!

解决方法

确保您的代码在try catch中运行并打印堆栈跟踪。您应该使用String[] command,以便不使用字符串连接,并使用ProcessBuilder进行调用,以便可以看到子进程的STDOUT / ERR。这是一个示例:

try {
    String java = Path.of(System.getProperty("java.home"),"bin","javaw.exe").toAbsolutePath().toString();
    String[] command = new String[] {java,"-jar","\\path\\to\\yourName.jar","runTimeArg1","runTimeArg2"};
    exec(command); // or Runtime.getRuntime().exec(command); 
} catch (Exception e) {
    System.out.println("Exception occurred "+e);
    e.printStackTrace();
}


public static int exec(String[] cmd) throws InterruptedException,IOException
{
    System.out.println("exec "+Arrays.toString(cmd));

    ProcessBuilder pb = new ProcessBuilder(cmd);

    Path tmpdir = Path.of(System.getProperty("java.io.tmpdir"));
    Path out = tmpdir.resolve(cmd[0]+"-stdout.log");
    Path err = tmpdir.resolve(cmd[0]+"-stderr.log");
    pb.redirectOutput(out.toFile());
    pb.redirectError(err.toFile());
    // OR pb.redirectErrorStream(true);

    Process p = pb.start();
    long pid = p.pid();
    System.out.println("started PID "+pid);
    int rc = p.waitFor();

    System.out.println("Exit PID "+pid+": RC "+rc +" => "+(rc == 0 ? "OK": "**** ERROR ****"));
    System.out.println("STDOUT: \""+Files.readString(out)+'"');
    System.out.println("STDERR: \""+Files.readString(err)+'"');
    System.out.println();
    return rc;
}