java - 为什么我的 Bamboo 构建被 Java 子进程阻止?

标签 java maven-2 process locking bamboo

我正在开发一个遗留的 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 构建过程将恢复并运行其构建后 Activity ,然后以

终止
Finished building MYPROJECT-NIGHTLY-44.

显然,在 Win 2003 上启动 JBoss 服务器的进程以某种方式锁定了父进程,而同一进程在 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 上仍然不起作用。这段代码是否缺少或不正确?这是 Bamboo 的问题吗?如有任何帮助,我们将不胜感激。

更新:我在服务器上从命令行测试了 Maven 构建,它运行得很好。所以这显然是一个 Bamboo 问题。看起来 Bamboo 代理直接或间接地绑定(bind)了从其构建过程派生的所有子进程,并等到所有子进程都终止后再声明构建完成。这对于构建代理来说听起来有点合乎逻辑……但对我来说却带来了不幸的后果:-(

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

最佳答案

我的相关结果discussion on the Bamboo forum是:这似乎是 Bamboo 的一个功能,因此没有直接的解决方法。建议的解决方案是使用 post build command plugin在构建过程完成后部署应用程序。

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

关于java - 为什么我的 Bamboo 构建被 Java 子进程阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267398/

相关文章:

java - Eclipse 中的 icepdf-core maven 安装不起作用

python - 如何使用python获取进程的pid

java - 在 java 8 中对不同对象流执行平面映射时是否可以合并列表属性?

java - 桌面 GUI 工具,用于浏览新的 jar 并将其安装到本地 Maven 仓库

java - OpenGL 3.2 纹理不显示

java - Maven、Proguard 和装配问题

java - 多线程中所有处理器使用率如何达到 100%

java - 查找谁(什么)杀死了我的进程

java - TextView 在单击之前不可见

Java, "bind"线程的东西