我正在尝试通过另一个程序运行 .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/