6

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

stdoutbash 脚本在withecho和上产生输出printf。我注意到脚本的输出不会立即写入 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>
4

3 回答 3

4

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-发布/

于 2015-01-15T15:36:47.817 回答
1

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

我观察到这种行为只存在于 1.3 版以后的插件中。

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

于 2014-07-16T06:49:49.327 回答
1

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

我认为你有两个选择:

  1. 复制并更改 exec-maven-plugin 以满足您的需要。
  2. 将 antrun 插件与 ant exec 任务一起使用。这确实会刷新输出流,因此您可以在输出出现时看到它。请参阅http://sanchitbahal.wordpress.com/2011/09/19/maven-exec-plugin-vs-maven-antrun-plugin-for-running-command-line-tool/

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

于 2014-05-19T14:40:07.513 回答