我正在處理遺留Java Enterprise服務器項目,嘗試設置每晚構建。我們使用Java 5,Maven 2,JBoss 4.2和Atlassian Bamboo 2.1.5。我們的想法是,我們在我們的一個開發服務器上安裝了Bamboo代理,並且Maven構建被配置爲硬部署生成的.ear文件,然後重新啓動服務器。 (我們不能使用軟部署,因爲我們的遺留應用程序使用了一個在解除部署期間導致異常的庫......我們將在某個時候刪除那個該死的庫,但還不是現在。)我使用JBoss Maven插件這個。當我在我自己的機器上運行Maven構建時,它可以很好地工作(筆記本電腦,Win XP Professional):服務器停止並用最新版本重新啓動,構建完成。爲什麼我的Bamboo構建被Java子流程阻塞了?
但是,當我嘗試在我們的服務器(Win 2003)上運行每晚構建時,在啓動JBoss服務器之後,構建過程停止。竹代理在日誌中顯示:
Build MYPROJECT-NIGHTLY-44 completed.
然後等待在那裏,打造永不完的 - 除非我關閉手動JBoss服務器,此時竹構建過程恢復並運行後生成的活動,然後用
Finished building MYPROJECT-NIGHTLY-44.
顯然,進程終止啓動JBoss服務器莫名其妙地鎖定在2003年贏父進程,而同樣的過程在Win XP獨立運行。 JBoss的插件的相關代碼看起來是這樣的(重新格式化爲簡潔起見):需要
protected void launch(String fName, String params)
throws MojoExecutionException {
try {
checkConfig();
String osName = System.getProperty("os.name");
Runtime runtime = Runtime.getRuntime();
Process p = null;
if (osName.startsWith("Windows")) {
String command[] = { "cmd.exe", "/C", "cd " + jbossHome + "\\bin & " + fName + ".bat " + " " + params };
p = runtime.exec(command);
dump(p.getInputStream());
dump(p.getErrorStream());
} else {
String command[] = { "sh", "-c", "cd " + jbossHome + "/bin; ./" + fName + ".sh " + " " + params };
p = runtime.exec(command);
}
} catch (Exception e) {
throw new MojoExecutionException("Mojo error occurred: " + e.getMessage(), e);
}
}
protected void dump(final InputStream input) {
new Thread(new Runnable() {
public void run() {
try {
byte[] b = new byte[1000];
while ((input.read(b)) != -1) {
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
dump()
的方法來沖洗過程的輸出緩衝器 - 沒有它的過程中不能運行,如在已記錄也是API docs。但是,這仍然無法在Win 2003上運行。在這段代碼中是否有缺失或不正確的地方?這是一個竹子問題嗎?任何幫助表示讚賞。
更新:我從服務器上的命令行測試了Maven構建,它完美地工作。所以這顯然是一個竹子問題。看起來Bamboo代理將直接或間接地從構建過程中派生出來的所有子過程聯繫在一起,並等到它們全部終止,然後聲明構建完成。這聽起來用於生成代理類的邏輯...只是對我來說不幸的後果:-(
更新2:我張貼的問題上竹討論板也得到了來自Atlassian的支持傢伙的一些反應,但沒有決定性的結果