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

我正在使用Maven 3.1.1和exec-maven-plugin (1.3),以便在构build作业中执行bash脚本。

bash脚本使用echoprintfstdout上产生输出。 我注意到脚本的输出没有立即写入到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插件configuration:

 <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执行构build作业时,Maven输出在exec-maven-plugin冻结,并且在exec-maven-plugin分钟后脚本完成之前不显示进度/输出。

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

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

更新:使用maven-antrun-plugin的解决scheme (感谢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> 

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

我想你有两个选择:

  1. 复制并更改exec-maven-plugin以适应您的需求。
  2. 使用antrun插件与蚂蚁执行任务。 这会刷新输出流,以便在输出时看到输出。 请参阅http://sanchitbahal.wordpress.com/2011/09/19/maven-exec-plugin-vs-maven-antrun-plugin-for-running-command-line-tool/

也许第二个选项可能会更慢,因为maven调用ant,然后ant调用你的脚本,但是很容易。

JFYI,这个问题在exec-maven-plugin v 1.3.2中修复 – http://blog.soebes.de/blog/2014/07/28/mojo-exec-maven-plugin-version-1-dot-3 -2-发布/

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

我观察到,这种行为只出现在版本1.3以上的插件中。

exec-maven-plugin:1.2.1实际上具有所需的行为并刷新输出流。 所以,而不是使用蚂蚁,你可以切换到一个老版本的exec-maven-plugin。