[英]How to create a java progam to compile and run a list of java programs
如何为java程序构建代码以编译和执行java程序列表,而不是使用.bat文件。
Runtime.exec
虽然可能不是最理想的解决方案,但您可以使用Runtime.getRuntime().exec(someCommand)
作为单独的Process
执行shell命令。 还有一些重载将参数作为String[]
。
这不是一个简单的解决方案。 管理并发Process
并防止死锁等并非易事。
Process
流 通常你不能只是waitFor()
一个Process
终止; 您还必须耗尽其I / O流以防止死锁。
来自API :
由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞甚至死锁。
在Java中编译Java源代码的一个选择是使用Java 6编译器API。 这需要安装JDK(而不仅仅是JRE)。
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()方法,这些都在文档中描述。
使用Runtime.getRuntime()。exec(someCommand)的另一个问题是,您需要从spawn进程读取输出流和错误流,否则您的进程将挂起。
两个流可用的缓冲区数量有限,一旦填满程序,将等待您从中读取并无法继续。 必须在各自独立的线程中读取这两个缓冲区,以便一个不会死锁另一个。
你可以使用ANT。 而不是从Eclipse或其他任何东西运行ANT,你也可以从命令运行它。 这意味着你可以创建一个执行命令的java程序 - > ergo,用参数执行ant。
这些参数可以从您要构建的应用程序列表中的变量派生。
它没有直接回答这个问题,但是一些库可以帮助使用“Runtime.exec()”方法(消耗I / O流等)来调用“javac”。 例如, 这个名为“Shell”(法文文章,其中可以在最后下载库)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.