1

我正在处理一个遗留的 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 支持人员的一些回复,但还没有决定性的结果。

4

1 回答 1

1

我在 Bamboo 论坛上相关讨论的结果是:这似乎是 Bamboo 的一个特性,所以没有直接的解决方法。建议的解决方案是在构建过程完成后使用构建后命令插件来部署应用程序。

我没有尝试过,因为我找到了一种替代解决方案,可以使用Exec Maven Plugin通过Tanuki将我们的服务器部署为 Windows 服务。

于 2010-03-10T10:06:15.343 回答