据我了解,try 块中的前两个语句应该具有相同的效果;启动 chrome.exe,但第一个语句会导致 IO 异常,因为它找不到 chrome.exe。我做错了什么吗?
import java.io.File;
public class Program
{
public static void main( final String[] args )
{
try
{
//Process process = Runtime.getRuntime().exec("chrome.exe", null, new File("C:\Program Files (x86)\Google\Chrome\Application\"));
Process process = Runtime.getRuntime().exec("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe");
process.waitFor();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
堆栈跟踪:
java.io.IOException: Cannot run program "chrome.exe" (in directory "C:Program Files (x86)GoogleChromeApplication"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
at java.lang.Runtime.exec(Runtime.java:450)
at Program.main(Program.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>(ProcessImpl.java:386)
at java.lang.ProcessImpl.start(ProcessImpl.java:137)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 3 more
在您的第一个示例中,将"chrome.exe"更改为"notepad.exe",如下所示:
Process process = Runtime.getRuntime().exec("notepad.exe", null, new File("C:\Program Files (x86)\Google\Chrome\Application\"));
你会看到这有效。 这是因为"记事本.exe"所在的目录位于 Windows 路径环境变量中。
问题是,使用 Runtime.exec(String command, String[] envp, File dir)
方法执行时,您仍然需要在 Path 环境变量中执行可执行文件。 所以我继续向我的 Path 添加C:Program Files (x86)GoogleChromeApplication
,然后你的代码按预期执行。
我认为这有点奇怪,只是因为我可以cd
C:Program Files (x86)GoogleChromeApplication
并执行"chrome.exe"并且它可以工作。 所以这里似乎存在不一致的地方。 在 Windows 的命令提示符下,当我在一个目录(我认为是工作目录(时,我可以在那里执行可执行文件,而无需将这些可执行文件放在 Path env 变量中。 但是在使用时并非如此 Runtime.exec(String command, String[] envp, File dir)
.