我正在尝试从 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)