如何即时显示exec-maven-plugin的输出

时间:2014-05-14 07:34:04

标签: linux bash shell maven exec-maven-plugin

我正在使用Maven 3.1.1和exec-maven-plugin(1.3)来在构建作业期间执行bash脚本。

bash脚本使用stdoutechoprintf上生成输出。我注意到脚本的输出不会立即写入maven控制台输出。相反,maven控制台输出“冻结”,直到它立即使用bash脚本的多个输出行进行更新。我不知道更新maven输出的触发器是什么(超时?完全输出缓冲区?),但它很慢。

我们来看一个非常简单的bash脚本,例如counter.sh

#!/usr/bin/env bash
for i in `seq 1 1000`; do
  echo $i
  sleep 0.5
done 

这是pom.xml中的插件配置:

<plugin>
    <artifactId>exec-maven-plugin</artifactId>
    <groupId>org.codehaus.mojo</groupId>
    <version>1.3</version>
    <executions>
        <execution>
            <id>execute-script</id>
            <phase>package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>${project.build.directory}/executable/counter.sh</executable>
            </configuration>
        </execution>
    </executions>
</plugin>

当我使用mvn clean package执行构建作业时,maven输出会在exec-maven-plugin处冻结,并且在脚本在约8分钟后完成后才显示没有进度/输出。

当我执行另一个运行时间更长的脚本时,我每隔15分钟就得到一个输出块。

我正在寻找的是一种在maven控制台输出中即时查看bash脚本输出的方法。

更新:使用maven-antrun-plugin解决方案(感谢Ivan)

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <id>execute-script</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>
                    <exec dir="${project.basedir}" executable="${project.build.directory}/executable/counter.sh" />
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

exec-maven-plugin使用不会自动刷新的输出流。

我认为你有两个选择:

  1. 复制并更改exec-maven-plugin以满足您的需求。
  2. 将antrun插件与annt exec任务一起使用。这会刷新输出流,以便在输出时看到输出。请参阅http://sanchitbahal.wordpress.com/2011/09/19/maven-exec-plugin-vs-maven-antrun-plugin-for-running-command-line-tool/
  3. 也许第二个选项可能会变慢,因为maven会调用ant,然后ant会调用你的脚本,但这很容易。

答案 2 :(得分:1)

正如Ivan已经指出exec-maven-plugin:1.3不会自动刷新输出流。这可能导致输出延迟。

我发现此行为仅出现在1.3版本的插件中。

exec-maven-plugin:1.2.1实际上具有所需的行为并刷新输出流。因此,您可以切换到较旧版本的exec-maven-plugin而不是使用ant。