Java CreateProcess错误=2,系统找不到指定的文件

Java CreateProcess错误=2,系统找不到指定的文件,java,process,Java,Process,我正在用java编写一个程序,该程序将执行winrar并为我解压一个jar文件,该文件位于h:\myjar.jar文件夹h:\new。我的java代码是这样的 import java.io.File; import java.io.IOException; public class MainClass { public static void main(String[] args) { Runtime r = Runtime.getRuntime();

我正在用java编写一个程序,该程序将执行winrar并为我解压一个jar文件,该文件位于
h:\myjar.jar
文件夹
h:\new
。我的java代码是这样的

import java.io.File;
import java.io.IOException;

public class MainClass {

    public static void main(String[] args) {

        Runtime r = Runtime.getRuntime();
        Process p = null;

        try {
            File dir = new File("C:/Program Files/WinRAR");
            p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
当我执行这个时,我得到了这个错误

java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at MainClass.main(MainClass.java:16)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 4 more
java.io.IOException:无法运行程序“winrar”(在目录“C:\program Files\winrar”中):CreateProcess error=2,系统找不到指定的文件
位于java.lang.ProcessBuilder.start(未知源)
位于java.lang.Runtime.exec(未知源)
位于java.lang.Runtime.exec(未知源)
在MainClass.main(MainClass.java:16)
原因:java.io.IOException:CreateProcess error=2,系统找不到指定的文件
在java.lang.ProcessImpl.create(本机方法)
位于java.lang.ProcessImpl。(未知源)
位于java.lang.ProcessImpl.start(未知源)
... 4更多

有人能告诉我为什么我会遇到这样的问题吗。我需要在代码中加入什么样的更改才能使其工作?

exec的完整第一个参数被解释为可执行文件。使用

p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
            null, 
            dir);

您指定的
dir
是正在运行的进程的工作目录-它无助于查找可执行文件。使用
cmd/c winrar…
运行进程,在路径中查找可执行文件,或者尝试使用winrar的绝对路径。

假设
winrar.exe
位于
路径中,则
运行时.exec
能够找到它,如果它不是,则需要为它提供完全限定的路径,例如,假设
winrar.exe
安装在
C:/Program Files/winrar
中,您需要使用类似于

p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
就个人而言,我建议您使用
ProcessBuilder
,因为它还有一些额外的配置功能。在可能的情况下,您还应该将命令和参数分离为单独的
String
元素,它比单个
String
变量更好地处理空格之类的事情,例如

ProcessBuilder pb = new ProcessBuilder(
    "C:/Program Files/WinRAR/winrar",
    "x",
    "myjar.jar",
    "*.*",
    "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);

Process p = pb.start();

不要忘记从进程中读取
InputStream
的内容,否则可能会导致进程暂停

我使用了ProcessBuilder,但也有同样的问题。问题在于使用命令作为一个字符串行(就像我在cmd中键入命令一样),而不是字符串数组。在上面的例子中。如果我跑

ProcessBuilder pb = 
   new ProcessBuilder("C:/Program Files/WinRAR/winrar x myjar.jar *.* new");
pb.directory(new File("H:/"));
pb.redirectErrorStream(true);

Process p = pb.start();
我犯了个错误。但如果我跑

ProcessBuilder pb = 
   new ProcessBuilder("C:/Program Files/WinRAR/winrar", "x", "myjar.jar", "*.*", "new");
pb.directory(new File("H:/"));
pb.redirectErrorStream(true);

Process p = pb.start();

一切正常。

我的建议是保留
getRuntime().exec
,因为
exec
使用
ProcessBuilder

试一试


winrar.exe
在您的路径上吗?我刚刚安装了winrar…我没有为winrar设置环境路径。它需要在路径上,否则您必须指定完整路径以及可执行文件。您可以告诉我知道绝对路径的命令吗?p=rt.exec(新字符串[]{“C:\Program Files\winrar\winrar.exe”,“x”,“h:\\myjar.jar”,“h:\\new”}null,dir);。。。我仍然收到相同的错误。如果执行
rt.exec(新字符串[]{“cmd”,“/c”,“winrar.exe x h:\\myjar.jar.h:\\new”},null,dir)
,会怎么样?这为我修复了它。关键是
pb.directory(…)
语句。正如下面提到的其他人一样,一旦这样做,您就可以将exe的名称作为第一个命令参数。我还必须使用cmd/c,比如so
List params=Arrays.asList(“cmd”、“/c”、“quack1.exe”、“inputfile.txt”、“param1”、“param2”、“A”);ProcessBuilder pb=新的ProcessBuilder(参数);目录(新文件(“C:/dev/test”);进程pr=(pb.start()
my case刚才我在Windows的系统变量中为该exe设置了bin的路径,我运行了python代码,其中包含python.exe目录的完整路径。非常感谢。
 p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);