【发布时间】:2011-03-20 23:12:18
【问题描述】:
不使用 .bat 文件,如何为 java 程序构建代码以编译和执行 java 程序列表。
【问题讨论】:
-
你可能想看看Ant:ant.apache.org
-
顺便说一句,欢迎来到 Stack Overflow! :)
标签: java
不使用 .bat 文件,如何为 java 程序构建代码以编译和执行 java 程序列表。
【问题讨论】:
标签: java
它没有直接回答这个问题,但是一些库可以帮助使用“Runtime.exec()”方法(使用 I/O 流等)来调用“javac”。比如this one,命名为“Shell”(法文文末可以下载库)。
【讨论】:
您可以使用 ANT。而不是从 Eclipse 或其他什么运行 ANT,您也可以从命令运行它。这意味着您可以创建一个执行命令的 java 程序 -> ergo 执行带有参数的 ant。
这些参数可以从您要构建的应用程序列表中的变量派生而来。
【讨论】:
Runtime.exec
虽然可能不是最理想的解决方案,但您可以使用 Runtime.getRuntime().exec(someCommand) 将 shell 命令作为单独的 Process 执行。还有一些重载将参数作为String[]。
这不是一个简单的解决方案。管理并发 Process 并防止死锁等并非易事。
Process 流一般你不能只用waitFor() 和Process 来终止;您还必须排空其 I/O 流以防止死锁。
来自the API:
由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。
在 Java 中编译 Java 源代码的一个选项是使用 Java 6 Compiler API。这需要安装 JDK(不仅仅是 JRE)。
【讨论】:
JavaCompiler 是这个问题的正确答案,而不是 Runtime.exec 并且绝对不是“改用 ant”
使用 Runtime.getRuntime().exec(someCommand) 的另一个问题是您需要从生成进程中读取输出流和错误流,否则您的进程将挂起。
可用于两个流的缓冲区数量有限,一旦它们填满,程序将等待您从中读取并且无法继续。这两个缓冲区必须在各自独立的线程中读取,这样一个就不会死锁另一个。
【讨论】:
java.lang.Runtime 类有一个方法可以让你执行任意的 shell 命令。所以它应该看起来像这样:
List<String> commandsToExecute = ...
for (String cmd : commandsToExecute) {
Process p = Runtime.getRuntime().exec (cmd);
p.waitFor(); // If you need to run them all sequentially.
}
还有几个其他版本的 Runtime.exec() 方法都在documentation 中描述。
【讨论】:
waitFor 还不够;必须排空 I/O 流以防止死锁。