为什么我的竹子构建被Java子进程阻止?

为什么我的竹子构建被Java子进程阻止?,java,maven-2,process,locking,bamboo,Java,Maven 2,Process,Locking,Bamboo,我正在从事一个遗留的Java企业服务器项目,试图设置夜间构建。我们使用的是Java5、Maven2、JBoss4.2和Atlassian竹2.1.5。我们的想法是在一个dev服务器上有一个bambol代理,Maven构建被配置为硬部署生成的.ear文件,然后重新启动服务器。(我们不能使用soft deploy,因为我们的遗留应用程序使用了一个库,在取消部署期间会导致异常……我们将在某个时候摆脱那个该死的库,但不是现在。)我使用JBoss Maven插件来实现这一点。当我在自己的机器(笔记本电脑,

我正在从事一个遗留的Java企业服务器项目,试图设置夜间构建。我们使用的是Java5、Maven2、JBoss4.2和Atlassian竹2.1.5。我们的想法是在一个dev服务器上有一个bambol代理,Maven构建被配置为硬部署生成的.ear文件,然后重新启动服务器。(我们不能使用soft deploy,因为我们的遗留应用程序使用了一个库,在取消部署期间会导致异常……我们将在某个时候摆脱那个该死的库,但不是现在。)我使用JBoss Maven插件来实现这一点。当我在自己的机器(笔记本电脑,WinXP Professional)上运行Maven构建时,它可以很好地工作:服务器停止并使用最新的构建重新启动,构建完成

但是,当我尝试在服务器上运行夜间构建(Win2003)时,在启动JBoss服务器之后,构建过程停止。竹代理将显示在日志中:

Build MYPROJECT-NIGHTLY-44 completed.
然后它在那里等待,构建永远不会结束——除非我手动关闭JBoss服务器,此时竹子构建过程继续并运行其构建后活动,然后以

Finished building MYPROJECT-NIGHTLY-44.
很明显,启动JBoss服务器的进程以某种方式锁定了Win2003上的父进程,而同一进程在WinXP上独立运行。JBoss插件的相关代码如下所示(为简洁起见重新格式化):

需要使用
dump()
方法来刷新进程的输出缓冲区-没有它,进程就无法运行,这一点在文档中也有说明。然而,这在Win2003上仍然不起作用。此代码中是否缺少或不正确?这是竹子的问题吗?感谢您的帮助

更新:我在服务器上从命令行测试了Maven构建,它工作得非常好。因此,这显然是一个竹子问题。看起来Bambol代理直接或间接地将从其构建进程派生的所有子进程绑定在一起,并在声明构建完成之前等待所有子进程终止。对于构建代理来说,这听起来有点合乎逻辑。。。只是给我带来了不幸的后果:-(

更新2:我也在Bambol讨论板上发布了这个问题,得到了Atlassian支持人员的一些回应,但还没有决定性的结果。

我相关的结果是:这似乎是Bambol的一个功能,因此没有直接的解决方法。建议的解决方案是在bui之后使用部署应用程序ld过程已完成

我没有尝试过这一点,因为我找到了一个替代解决方案,可以通过将服务器部署为Windows服务。我的相关研究结果是:这似乎是Bambol的一个功能,因此没有直接的解决方法。建议的解决方案是在构建过程完成后使用部署应用程序

我没有尝试过这一点,因为我找到了另一种解决方案,可以通过使用将服务器部署为Windows服务

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();
}