启动进程时出现 IOException

ste*_*oss 2 java

我正在尝试从 Java 程序运行一些 Mercurial 命令。我Process使用ProcessBuilder这样的方法构建我的:

final ProcessBuilder procBuilder = new ProcessBuilder("hg", "log");

procBuilder.directory(new File("/Users/feuerball/workspace/www"));

final Process proc = procBuilder.start();
Run Code Online (Sandbox Code Playgroud)

该文件夹www包含 Mercurial 存储库,hg已安装并在系统中PATH。但是当我开始这个过程时,我的程序抛出了一个异常。这是堆栈跟踪:

Exception in thread "main" java.io.IOException: Cannot run program "hg" (in directory "/Users/feuerball/workspace/www"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1042)
    at de.feuerball.tests.Test.main(Test.java:16)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:185)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1023)
    ... 1 more
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这个错误?

更新

为了表明该目录确实存在,我对代码进行了一些更改:

final File repo = new File("/Users/feuerball/workspace/www");

System.out.println("Directory? " + repo.isDirectory());
System.out.println("Readable? " + repo.canRead());
System.out.println("Writable? " + repo.canWrite());

final ProcessBuilder procBuilder = new ProcessBuilder("hg", "log");
procBuilder.directory(repo);

final Process proc = procBuilder.start();
Run Code Online (Sandbox Code Playgroud)

现在这是证据:

Directory? true
Readable? true
Writable? true
Exception in thread "main" java.io.IOException: Cannot run program "hg" (in directory "/Users/feuerball/workspace/www"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1042)
    at de.brushmate.tests.Test.main(Test.java:22)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:185)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1023)
    ... 1 more
Run Code Online (Sandbox Code Playgroud)

mor*_*ano 5

ProcessBuilder 不使用环境变量 PATH,它找不到“hg”,您需要指定“hg”的绝对路径(如 /usr/bin/hg,如果您使用的是 Linux)