我正在处理一个遗留的 Java Enterprise 服务器项目,尝试设置夜间构建。我们正在使用 Java 5、Maven 2、JBoss 4.2 和 Atlassian Bamboo 2.1.5。我们的想法是我们在我们的一个开发服务器上有一个 Bamboo 代理,并且 Maven 构建被配置为硬部署生成的 .ear 文件,然后重新启动服务器。(我们不能使用软部署,因为我们的遗留应用程序使用了一个在取消部署期间导致异常的库......我们将在某个时候摆脱那个该死的库,但还不是。)我正在使用 JBoss Maven 插件这。当我在自己的机器(笔记本电脑,Win XP Professional)上运行 Maven 构建时,它运行良好:服务器停止并使用最新构建重新启动,构建完成。
但是,当我尝试在我们的服务器(Win 2003)上运行夜间构建时,启动 JBoss 服务器后构建过程停止。Bamboo 代理在日志中显示:
Build MYPROJECT-NIGHTLY-44 completed.
然后它在那里等待,构建永远不会完成 - 除非我手动关闭 JBoss 服务器,此时 Bamboo 构建过程恢复并运行其构建后活动,然后以
Finished building MYPROJECT-NIGHTLY-44.
显然,启动 JBoss 服务器的进程以某种方式锁定了 Win 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 文档中所记录的那样。但是,这在 Win 2003 上仍然不起作用。此代码中是否缺少某些内容或不正确?这是竹子的问题吗?任何帮助表示赞赏。
更新:我从服务器上的命令行测试了 Maven 构建,它运行良好。所以这显然是一个竹子的问题。看起来 Bamboo 代理直接或间接地绑定了从其构建过程中派生的所有子流程,并等待所有子流程终止,然后再声明构建完成。对于构建代理来说,这听起来有点合乎逻辑......只是对我有不幸的后果:-(
更新 2:我也在 Bamboo 讨论板上发布了这个问题,得到了 Atlassian 支持人员的一些回复,但还没有决定性的结果。