故障安全插件不会在一个项目上运行,但会在另一个项目上运行——为啥?

Posted

技术标签:

【中文标题】故障安全插件不会在一个项目上运行,但会在另一个项目上运行——为啥?【英文标题】:failsafe plugin won't run on one project but will run on another -- why?故障安全插件不会在一个项目上运行,但会在另一个项目上运行——为什么? 【发布时间】:2012-04-14 10:01:23 【问题描述】:

这让我发疯了。 Maven 故障保护插件不会在我的项目上运行。如果我运行mvn verify,则只有肯定会运行。如果我输入 mvn failsafe:verify 它会失败并出现以下错误:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Simulation Experiment Server 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-failsafe-plugin:2.11:verify (default-cli) @ experiment-server ---
[INFO] Failsafe report directory: C:\IdeaProjects\experiment_server\target\failsafe-reports
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.551s
[INFO] Finished at: Fri Mar 30 11:24:58 GMT-06:00 2012
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-failsafe-plugin:2.11:verify (default-cli) on project experiment-server: C:\IdeaProjects\experiment_server\target\failsafe-reports\failsafe-summary.xml (The system cannot find the path specified) -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

它抱怨找不到failsafe-summary.xml。但这应该由插件创建。该插件运行良好(如果我运行 Antonio Goncalves 精彩 Arquillian example project,则会创建 failsafe-summary.xml 文件。

所以我复制了 Antonio 使用的确切插件信息,但它仍然无法在我的项目中运行。我已经将我的 POM 建模为与他的完全一样(除了没有父 pom)——一定是出了问题,我只是不知道是什么。为什么故障保护会在他的项目上运行,而不是我的??

这是我的failsafe pom.xml 条目,取自他的,与failsafe usaages 网站上的相同):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>$version.maven.failsafe.plugin</version>
    <configuration>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

感谢您的帮助,这让我发疯了。

更新好的,我似乎已经解决了cannot find failsafe-summary.xml 的问题——我将我的目录从experiment_server 更改为experiment-server。我想这会破坏故障安全。

但是,我仍然无法通过命令 mvn verifymvn integration-test 运行故障保护。这两个命令都调用surefire而不是failsafe。我现在可以使用以下命令直接运行故障安全:mvn failsafe:integration-test,但不应该使用mvn verify 自动运行故障安全吗?我的mvn help:effective-pom 表明存在故障保护,所以这不是问题...有什么想法吗?

【问题讨论】:

你运行哪个 Maven 版本? 可以在 IT 未运行的地方添加运行的输出吗?你是怎么称呼 Maven 的? 我运行 Maven 3.04。我不明白你在第二个问题中要问什么。你能改写一下吗? 郑重声明,cannot find failsafe-summary.xml 问题不是由于目录名称问题,而是由于缺少 integration-test 目标/阶段绑定。 大卫,你应该回答这个问题,因为你的解决方案是正确的 【参考方案1】:

查看failsafe docs 以了解默认情况下failsafe 期望的测试名称:

<includes>
  <include>**/IT*.java</include>
  <include>**/*IT.java</include>
  <include>**/*ITCase.java</include>
</includes>

您的测试是否按照这些模式之一命名?如果没有,请尝试在插件配置中定义 &lt;includes&gt; 元素。或者更改您的测试名称以适应默认模式。


好的,现在我们已经验证了测试类名称 - 通常当我将执行添加到插件配置时,我会这样做:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>$version.maven.failsafe.plugin</version>
    <configuration>
    </configuration>
    <executions>
        <execution>
            <id>failsafe-integration-tests</id>
            <phase>integration-test</phase>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
        <execution>
            <id>failsafe-verify</id>
            <phase>verify</phase>
            <goals>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这将您要运行的failsafe 插件目标明确绑定到构建生命周期的正确阶段。我相信surefire 插件默认绑定到test 生命周期阶段(无论如何对于jar、war 和ejb),但没有绑定到integration-testverify

【讨论】:

是的,我的集成测试被命名为 foobarIT.java。我什至尝试过明确地将includes 放入(现在又做了一次,以防万一)。现在的问题不是故障安全没有找到我的测试——当我运行mvn failsafe:integration-test 时它确实找到了。问题是当我运行 mvn verifymvn integration-test 时,不调用故障安全,肯定是。 做到了!我想知道为什么 &lt;goal&gt;integration-test&lt;/goal&gt; 以前不起作用。诡异的。无论如何,谢谢!【参考方案2】:

在这里,我将分享我的 2 美分。我有同样的问题,上面的解决方案没有解决我的问题。

我将 maven-failsafe-plugin 封装在 pluginManagement 标记中。当我在 4.0.0 maven 架构中看到这个文档时,我注意到将它移到 plugins 标记中:

默认插件信息可供参考 从这个衍生的项目。此插件配置不会 除非被引用,否则被解析或绑定到生命周期。任何本地 给定插件的配置将覆盖插件的整个 定义在这里。

希望这个附加信息。解决了更多像我这样的人的问题。

【讨论】:

顺便说一下,有时会违反此保证。例如,如果您在父 pom 的 pluginManagement 部分中定义 jRebel 插件,则 jRebel maven 插件将在每个子项目上运行,即使它没有显式添加到该子项目的插件定义中。所以,小心。【参考方案3】:

对我来说,它只有在我添加了“默认”包含之后才起作用。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.15</version>
        <configuration>
            <includes>
                <include>**/IT*.java</include>
                <include>**/*IT.java</include>
                <include>**/*ITCase.java</include>
                <include>**/IntegrationTest*.java</include>
            </includes>
        </configuration>
        <executions>
            <execution>
                <id>failsafe-integration-tests</id>
                <phase>integration-test</phase>
                <goals>
                    <goal>integration-test</goal>
                </goals>
            </execution>
            <execution>
                <id>failsafe-verify</id>
                <phase>verify</phase>
                <goals>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

【讨论】:

【参考方案4】:

如果您运行的是 2.12.2 版本的故障保护插件,这是正常的。切换到以前的版本。好像2.13还没有。

Jira link

【讨论】:

以上是关于故障安全插件不会在一个项目上运行,但会在另一个项目上运行——为啥?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序不会在 Xcode 模拟器上运行,但会在 iPhone 上运行

Python不会在bash中运行,但会在cmd中运行[重复]

程序不能在 Win XP 上运行,但会在 Win7 上运行

Xcode安全区域故障与iPhone SE和4s

我的网站不会在 iPhone 上加载图像,但会在所有其他浏览器、移动设备或桌面设备上加载

Fancybox 不会在 $(elem).click() 上触发,但会在“真实”点击时触发?