25

我正在尝试在自定义容器的顶部执行我的应用程序部署的集成测试。由于我的容器是自定义的,我不能使用 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 插件被卡住了,我的测试没有运行。根据如何从我的 Java 应用程序运行批处理文件中的建议?,我修改了我的 pom.xml 如下:

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

但这似乎并不能解决问题:

马文停了下来

4

5 回答 5

23

exec 插件无法做到这一点,我也发现了它的问题:http: //jira.codehaus.org/browse/MEXEC-87(由于codehaus rampdown,链接现在失效,可以从网络档案中找到)

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

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

这是一个取自工作配置并使用mvn verify. 这需要在<plugins>, 而不是<pluginManagement>(exec 可以驻留在 pluginmanagement 中就好了)。

<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。

于 2012-09-26T15:11:46.113 回答
8

请参阅此问题:如何从我的 Java 应用程序运行批处理文件?

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

更多信息

Exec 插件源代码显示Apache Commons Executor用于实际执行命令行。

您可以在这里阅读大量内容,即在 Apache Commons Executor 文档及其JIRA 问题中,但简短的版本是:这不是“Maven”的问题,而是依赖于平台的性质的问题执行exec()命令。

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

于 2012-09-26T13:51:32.053 回答
1

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

于 2016-02-01T14:14:50.723 回答
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

解决了这个问题。

于 2017-02-03T04:45:26.020 回答
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>
于 2020-07-07T17:46:11.943 回答