我正在处理遗留Java企业服务器项目,试图建立夜间构建。我们使用Java 5、Maven 2、JBOSS 4.2和亚特兰西竹2.1.5。我们的想法是在一个dev服务器上有一个bamboo代理,maven构建被配置为硬部署生成的.ear文件,然后重新启动服务器。(我们不能使用Soft Deploy,因为我们的旧应用程序使用了一个库,在取消部署期间会导致异常…我们将在某个时候摆脱这个该死的库,但不是现在。)我正在为此使用JBossMaven插件。当我在自己的机器上运行maven构建时(膝上型电脑,win xp-professional),它工作得很好:服务器停止并重新启动最新的构建,构建完成。
但是,当我尝试在我们的服务器上运行夜间构建(win 2003)时,在启动jboss服务器之后,构建过程将停止。竹剂显示在日志中:
Build MYPROJECT-NIGHTLY-44 completed.
然后它在那里等待,构建永远不会结束——除非我手动关闭JBoss服务器,此时,竹制构建过程恢复并运行其后期构建活动,然后以
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 docs
也是。但是,这仍然不适用于Win2003。此代码中是否有丢失或不正确的内容?这是竹子的问题吗?感谢您的帮助。
更新:
我在服务器上的命令行中测试了maven构建,它工作得很好。所以这显然是个竹节问题。看起来,Bamboo代理直接或间接地将其构建过程中派生的所有子流程绑定在一起,并在声明构建完成之前等待所有子流程终止。对于一个构建代理来说,这听起来有点合乎逻辑…只是对我有不幸的后果:-(
更新2:
我也把这个问题贴在竹制讨论板上,得到了亚特兰蒂斯支持者的一些回应,但还没有决定性的结果。