java - 无法执行命令: no such file or directory/Java

标签 java jar process terminal

我正在尝试通过另一个程序运行 .jar 文件。例如,我有一个 HelloWorld.jar 文件,它会打开一个显示“Hello World”的对话框。我有一个 Test.jar 程序。当我在 Test.jar 中执行某些操作(即单击某个按钮)时,它应该运行 HelloWorld.jar

我目前这样做的方式是使用 ProcessBuilder 运行终端命令 java -jar HelloWorld.jar。但是,我收到此错误:

Debug: "C:\Users\Asus\.fairplay\data\apps\Amnesia\.tmp524\.bin" exists: true
java.io.IOException: Cannot run program "java -jar Amnesia.jar" (in directory "C:\Users\Asus\.fairplay\data\apps\Amnesia\.tmp524\.bin"): CreateProcess error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at me.darksidecode.fairplay.client.util.Utils.execute(Utils.java:74)
    at me.darksidecode.fairplay.client.app.AppLauncher.launch0(AppLauncher.java:61)
    at me.darksidecode.fairplay.client.app.AppLauncher.launch(AppLauncher.java:37)
    at me.darksidecode.fairplay.client.app.AppLoader.downloadAndRun(AppLoader.java:28)
    at me.darksidecode.fairplay.client.gui.frame.GuiLauncher.onPacketReceiving(GuiLauncher.java:165)
    at me.darksidecode.fairplay.client.core.FairPlayClient.lambda$processPacket$1(FairPlayClient.java:120)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.io.IOException: CreateProcess error=2, No such file or directory
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:386)
    at java.lang.ProcessImpl.start(ProcessImpl.java:137)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 7 more

100%确定该文件和目录存在,我什至检查过。正如您在此处的错误中看到的,还有一条调试消息证明了这一点。

我的命令执行代码:

public static Process execute(final String path, final String cmd, final boolean removeJavaOptions) {
    File f = Files.getFile(path);
    System.out.println("Debug: \"" + f.getAbsolutePath() + "\" exists: " + f.exists());

    try {
        final ProcessBuilder pb = new ProcessBuilder(cmd);

        pb.directory(Files.getFile(path));
        pb.redirectErrorStream(true);

        if (removeJavaOptions)
            pb.environment().remove("_JAVA_OPTIONS");
        return pb.start();
    } catch (final Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

该方法本身的用法:

Utils.execute(bin.getAbsolutePath().replace(bin.getName(), ""), "java -jar " + bin.getName(), false);

我还没有在 StackOverflow 或其他任何地方找到这个问题的任何有用答案。希望有一个解决方案可以解决这个问题。

最佳答案

ProcessBuilder构造函数接受 List<String> ,或一个可变参数(几个字符串),例如

new ProcessBuilder( "command", "arg1", "arg2", "arg3" );

您尝试将命令与参数一起传递到同一字符串中,而不是分别传递命令和参数。

构建器将第一个参数解释为命令的名称。因此,它认为您正在尝试运行一个名为 java -jar Amnesia.jar 的文件。 。它认为您只是有一个名称中带有空格的可执行文件。但是,操作系统当然找不到这样的可执行文件。

您应该做的是运行命令,并将参数与命令分开,即:

new ProcessBuilder( "java", "-jar", "Amnesia.jar" );

所以你需要重建你的 execute方法,使得 cmd参数是 List<String> 、一个数组 ( String[] ),或者它是最后一个参数并且是一个 varargs 参数。

关于java - 无法执行命令: no such file or directory/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294511/

相关文章:

java - 从 java 执行 C 二进制文件并从进程的输出流中读取

java - Hadoop jar 引发反射时使用反射程序运行java.lang.NoClassDefFoundError

使用 Java Mapper/Reducer 的 Hadoop Streaming

java - 外部库位于 APK 中的什么位置?

.net - 线程C#中发生异常时,进程未终止

c - Linux C : When do I need "clone" function instead of "fork"?

java - 创建登录类型的 Activity 并强制它成为唯一的开放点

java - 定义在将 Spring 事务管理与 hibernate 一起使用时不在事务中运行的方法

ruby-on-rails - Heroku 后台作业的解决方案?

java - for 循环提前中断