我制作了2个.java文件和1个.bat文件。让我们将第一个.java文件称为“First.java”,将第二个称为“Second.java”。批处理文件是“compile.bat”。让我们说First.java位于“... / Desktop / temp / First.java”,而Second.java位于“... / Desktop / Test / Second.java”以及批处理文件(“.. ./Desktop/Test/compile.bat“)。现在,compile.bat包含以下代码:
cmd /c "cd C:\blahblah\temp && javac First.java"
我在CMD中测试了它,通过双击,它可以工作。我想使用以下代码从Second.java编译First.java:
Process p1 = Runtime.getRuntime().exec("C:\\blahblah\\compile.bat");
(我必须导航到dir,因为CMD的默认目录与compile.bat的目录不同)。这不起作用。它似乎只是忽略了代码。正如我所说,我尝试了很多不同的东西,我甚至尝试使用其他一些应该改变了目录的库。请帮帮我!
答案 0 :(得分:2)
最简单的方法:您应该使用start
。设置工作目录也是可能的,请看这个例子:
Runtime r=Runtime.getRuntime();
r.exec("cmd.exe /c start compile.bat", //path to executable
null, // env vars, null means pass parent env
new File("C:\\blahblah")); // working directory
其他信息:
如果你不想在它的单独控制台中启动你的进程(这就是start
所做的那样)你可以做r.exec("cmd.exe /c compile.bat");
,但是因为它在它的父控制台的上下文中执行,你必须等待p.waitFor()
或读取它的输入流 - 否则它可能会无声地失败。
这将运行并显示您的命令输出:
Process p=r.exec("cmd.exe /c compile.bat", //path to executable
null, // env vars, null means pass parent env
new File("C:\\blahblah"));
InputStream is=p.getInputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(is));
String line=new String();
while ((line=br.readLine())!=null) System.out.println (line);
从1.5开始,ProcessBuilder是开始进程的首选方式(来自Java doc):
java.lang.Process中
创建流程的方法可能不适用于特殊方法 某些本机平台上的进程,例如本机窗口 进程,守护程序进程,Microsoft Windows上的Win16 / DOS进程, 或shell脚本。
默认情况下,创建的子进程没有自己的终端或 安慰。所有标准I / O(即stdin,stdout,stderr)操作 将被重定向到父进程,在那里可以访问它们 通过使用方法getOutputStream()获得的流, getInputStream()和getErrorStream()。父进程使用这些 stream将输入提供给子进程并从子进程获取输出。因为 某些本机平台仅为标准提供有限的缓冲区大小 输入和输出流,无法及时写入输入流 或者读取子进程的输出流可能会导致子进程 阻止,甚至死锁。
如果需要,还可以使用以下方法重定向子进程I / O. ProcessBuilder类。
当没有更多引用时,子进程不会被终止 进程对象,而是子进程继续执行 异步。
不要求Process对象表示的进程 相对于Java异步或并发执行 拥有Process对象的进程。
从1.5开始,ProcessBuilder.start()是创建一个的首选方法 过程
自:JDK1.0
答案 1 :(得分:1)
如果这是来自Java的直接引用,那么你最后会丢失分号,字符串中的必要转义字符以及cmd命令向Windows指示它需要cmd.exe来启动它:
Process p1 = Runtime.getRuntime().exec("cmd C:\\blahblah\\compile.bat");
您也可以在cmd之后添加/ c以在完成后立即关闭该进程,并且/或者开始指示它应该在另一个窗口中启动。