使用Maven exec插件启动Windows批处理脚本会阻止构建,即使脚本使用“start”

时间:2012-09-26 08:47:16

标签: maven maven-3 exec-maven-plugin

我正在尝试在自定义容器的顶部执行应用程序部署的集成品尝。由于我的容器是自定义的,我不能使用Maven Cargo插件来设置容器。

我的容器:

  • 必须通过正确的bat文件启动,该文件位于运行测试的计算机的路径中。
  • 可以手动关闭,因为我有一个包含所有集成测试的maven模块,即使有一天我想知道如何在测试完成后关闭进程。

我的问题是我必须在不同的进程中运行我的容器,因为它需要在我的测试执行时继续运行。此外,我在测试中有一个API,让我等待容器准备就绪(一种带超时的查找)。

我已将以下行添加到我的pom.xml

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1</version>
            <executions>
                <execution>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <executable>scripts/start-agent.bat</executable>
            </configuration>
        </plugin>

这将调用一个仅包含

的脚本
  

开始调用gs-agent.bat

然而,mvn exec插件被卡住了,我的测试没有运行。根据{{​​3}}中的建议,我修改了我的pom.xml,如下所示:

 <configuration>
                <executable>cmd</executable>
                <arguments>
                    <argument>/C</argument>
                    <argument>start</argument>
                    <argument>gs-agent.bat</argument>
                </arguments>
            </configuration>

但这似乎没有解决问题:

Maven halted

5 个答案:

答案 0 :(得分:18)

exec插件无法执行此操作,我也发现了它的问题:http://jira.codehaus.org/browse/MEXEC-87

在上面链接的jira问题中,提到了一个具有该功能的exec插件的fork和一个链接。

除此之外,我认为你暂时需要使用antrun-plugin。

以下是从工作配置中获取并使用mvn verify运行的示例。这需要在<plugins>,而不是<pluginManagement>(exec可以驻留在插件管理中就好了。)

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <phase>pre-integration-test</phase>
            <configuration>
                <target>
                    <exec executable="cmd.exe"
                          spawn="true">
                        <arg value="/c"/>
                        <arg value="D:\myfolder\test.bat"/>
                    </exec>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
       </execution>
   </executions>      
</plugin>

请注意,spawn="true"是关键,如果您不希望执行阻止,如问题中指定的那样。如果您希望它立即阻止并查看输出,请将其设置为false。

答案 1 :(得分:6)

请参阅此问题:How do I run a batch file from my Java Application?

Windows批处理文件不可执行。它们是由cmd可执行文件运行的脚本。

更多信息

Exec plugin source code显示Apache Commons Executor用于实际执行命令行。

你可以在这里做很多阅读,例如在Apache Commons Executor文档和他们的JIRA issues中,但是短版本是:这不是“Maven”的问题,这是一个问题执行exec()命令的平台相关性质。

我之前已经解决了这类问题,我总是设计的解决方案是将.bat脚本解构为实际命令并直接从exec插件启动,而不是调用脚本。

答案 2 :(得分:1)

在我的情况下,我遇到了npm和ng的问题..潜在的问题是exec-maven-plugin试图执行sh脚本(没有扩展名)。

重命名

C:\Users\User\AppData\Roaming\npm\ngC:\Users\User\AppData\Roaming\npm\ng.sh

C:\apps\nodejs\npmC:\apps\nodejs\npm.sh

解决了这个问题。

答案 3 :(得分:0)

The Fallowing Code适合我

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
        <executions>
            <execution>
              <phase>generate-sources</phase>
                <configuration>
                    <tasks>
                        <exec dir="${project.basedir}" executable="Script.bat"  failonerror="true">
                        </exec>
                    </tasks>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
       </execution>
   </executions>      
</plugin>

来源https://maven.apache.org/guides/mini/guide-using-ant.html

答案 4 :(得分:0)

如果要使用 exec-maven-plugin ,请参见下面的示例,以运行带有参数的批处理脚本。例如。运行类似的内容:

.\test.bat arg1 arg2 arg3

将以下内容添加到pom.xml:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <id>exec-test</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <executable>cmd</executable>
        <workingDirectory>./</workingDirectory>
        <arguments>
            <argument>/c</argument>
            <argument>start</argument>
            <argument>""</argument>
            <argument>exec.bat</argument>
            <argument>arg1</argument>
            <argument>arg2</argument>
            <argument>arg3</argument>
        </arguments>
    </configuration>
  </plugin>