【问题标题】:Command line argument works in console, fails from within Runtime.getRuntime().exec命令行参数在控制台中工作,在 Runtime.getRuntime().exec 中失败
【发布时间】:2013-11-11 04:29:20
【问题描述】:

尝试为 java 游戏构建一个基本的启动器。我正在构建正确的命令来运行应用程序。当在启动器中执行以下命令时,启动器会按预期关闭,但该命令似乎不起作用 - 要么它不起作用,要么游戏启动并立即崩溃。

当我将相同的命令打印到控制台并将其复制/粘贴到控制台并手动执行时,它可以完美运行。

/**
 * 
 */
protected void launch(){

    currentStatusMsg = "Launching...";

    String cmd = "java -jar";
    cmd += " -Djava.library.path=\"" +nativesDirectory.getAbsolutePath() + "\"";
    cmd += " \""+applicationJar.getAbsolutePath() + "\"";

    System.out.println(cmd);

    try {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec(cmd);
        //closeLauncher();

        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

        String line=null;

        while((line=input.readLine()) != null) {
            System.out.println(line);
        }

        int exitVal = pr.waitFor();
        System.out.println("Exited with error code "+exitVal);

    } catch(Exception e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }
}

我尝试添加一些内容来读取输出,但没有打印任何内容。

我原来是改用下面的格式,但是效果是一样的:

Process pr = Runtime.getRuntime().exec(new String[]{
                "java",
                "-Djava.library.path=\"" +nativesDirectory.getAbsolutePath() + "\"",
                "-jar",
                applicationJar.getAbsolutePath()});

更新我意识到我在允许调试代码运行之前关闭了启动器。系统只打印:“Exited with error code 1”

我终于能够打印出子进程错误。它指出:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path

但是,它应该是可用的,因为我正在执行的命令包括库路径,并且当手动运行这个确切的命令时,它工作正常。

【问题讨论】:

    标签: java


    【解决方案1】:

    java 命令启动器不是外壳。不要使用引号和空格分隔的命令,因为它不会很好地结束。将每个参数放入单独的字符串中,无需任何额外的引号,并使用exec(String[]) 方法。

    【讨论】:

    • 是否会自动处理引号,因为路径中通常包含空格。
    • 我已经更新了帖子。我最初使用了String[],但结果相同。
    • @BotskoNet - 你只需要在使用 shell 时引用,这就是为什么我指出你应该删除 all 引号(这就是为什么库路径仍然不是工作)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多