我成功使用AutoIt执行命令,但我想我可以通过Runtime获得更稳定的实现。这样我知道命令将始终执行,并且不会被中断异常和其他随机废话抛出。有什么关于Runtime的东西,我不知道哪些不允许连续执行命令?它是否没有以前命令输出的内存,即它是否在持久命令行中运行?
以下命令导航到文件夹并执行Maven脚本。我怎么能让这个工作?如果后面还有10多个命令,它们会在同一个进程中执行吗?
sendCommand("cmd.exe cd homepath/plugins");
sendCommand("mvn archetype:generate -DarchetypeCatalog=file://homepath/.m2/repository");
private static void sendCommand(String text) throws IOException {
Runtime.getRuntime().exec(text);
}
答案 0 :(得分:2)
Runtime.exec()返回一个Process实例。在运行下一个命令之前,请在此对象上调用waitFor()以等待它完成。您可以通过其getInputStream()/ getOutputStream()方法与Process通信。
另请阅读Javadoc。对于Runtime.exec,它表示"在单独的进程中执行指定的字符串命令。"
答案 1 :(得分:1)
一些事情。
Process
和ProcessBuilder
代替。ProcessBuilder
支持更改命令的工作目录。举个例子:
sendCommand("homepath/plugins", "mvn", "archetype:generate", "-DarchetypeCatalog=file://homepath/.m2/repository");
private static void sendCommand(String workingDirectory, String... command) throws IOException {
Process proc = new ProcessBuilder(command).directory(new File(workingDirectory)).start();
int status = proc.waitFor();
if (status != 0) {
// Handle non-zero exit code, which means the command failed
}
}
注意a)如何拆分命令,以及b)使用ProcessBuilder.directory(File)
传入和设置工作目录。这将获得您期望的行为,但请注意,每个命令仍然是一个单独的过程,并且无法将它们与Java组合。您必须使用Maven的功能通过指定多个构建目标来使它们全部运行。