[英]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.