【问题标题】:Maven release:prepare goalMaven 发布:准备目标
【发布时间】:2012-10-02 04:40:40
【问题描述】:

我们的 POM 文件中有以下配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
    <executions>
        <execution>
            <id>surefire-it</id>
            <phase>integration-test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <skip>false</skip>
            </configuration>
        </execution>
    </executions>
</plugin>

这确保了测试不会在 test 阶段执行。测试仅在集成测试阶段执行。

但是,当我们准备发布 (release:prepare) 时,maven 在 test 阶段执行测试。这会导致我们的构建失败,因为我们的测试只能在集成测试阶段运行(我们使用 tomcat-maven 插件在执行测试之前部署打包好的 war)。

我知道我们可以通过传递参数(-DskipTests 等)来跳过测试。我们不想跳过任何测试,我们只想 release:prepare 像任何其他 maven 目标一样执行。

非常感谢任何建议/帮助。

【问题讨论】:

    标签: java jakarta-ee maven maven-2 maven-release-plugin


    【解决方案1】:

    尝试使用更通用的方法在test 阶段完全禁用maven-surefire-plugin

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <executions>
            <execution>
                <id>default-test</id>
                <!-- Disable the default-test by putting it in phase none -->
                <phase>none</phase>
            </execution>
            <execution>
                <!-- Enable the test during integration-test phase -->
                <id>surefire-it</id>
                <phase>integration-test</phase>
                <goals>
                    <goal>test</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    编辑

    这是我使用上面配置的surefire插件试运行mvn release:prepare的输出:

    C:\Users\maba\Development\svn\local\stackoverflow\Q12840869>mvn release:prepare -DdryRun [INFO] 正在扫描项目... [信息] [信息] --------------------------------------------- ------------------------- [信息] 建筑 Q12840869-1.0-SNAPSHOT 1.0-SNAPSHOT [信息] --------------------------------------------- ------------------------- [信息] [信息] --- maven-release-plugin:2.0:prepare (default-cli) @ Q12840869 --- [INFO] 从“scm-check-modifications”阶段恢复发布 [INFO] 正在验证没有本地修改... [INFO] 正在执行:cmd.exe /X /C "svn --non-interactive status" [INFO] 工作目录:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869 [INFO] 检查快照的依赖项和插件... “Q12840869-1.0-SNAPSHOT”的发布版本是什么? (com.stackoverflow:Q12840869) 1.0: : “Q12840869-1.0-SNAPSHOT”的 SCM 发布标签或标签是什么? (com.stackoverflow:Q12840869) Q12840869-1.0: : “Q12840869-1.0-SNAPSHOT”的新开发版本是什么? (com.stackoverflow:Q12840869) 1.1-SNAPSHOT: : [信息] 正在转换“Q12840869-1.0-SNAPSHOT”... [INFO] 不生成发布 POM [INFO] 执行准备目标 - 因为这是模拟模式,它针对原始项目运行,而不是重写的项目 [INFO] 执行目标“干净验证”... [警告] Maven 将以交互模式执行,但尚未为此 MavenInvoker 实例配置输入流。 [INFO] [INFO] 正在扫描项目... [信息] [信息] [信息] [信息] ----------------------------------------- ---------------------------- [INFO] [INFO] 楼 Q12840869-1.0-SNAPSHOT 1.0-SNAPSHOT [信息] [信息] ----------------------------------------- ---------------------------- [信息] [信息] [INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ Q12840869 --- [INFO] [INFO] 删除 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target [信息] [信息] [INFO] [INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ Q12840869 --- [INFO] [INFO] 使用 'UTF-8' 编码复制过滤的资源。 [INFO] [INFO] 复制 0 个资源 [信息] [信息] [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ Q12840869 --- [INFO] [INFO] 编译 1 个源文件到 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\classes [信息] [信息] [INFO] [INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ Q12840869 --- [INFO] [INFO] 使用 'UTF-8' 编码复制过滤的资源。 [INFO] [INFO] 跳过不存在的资源目录 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\src\test\resources [信息] [信息] [INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ Q12840869 --- [INFO] [INFO] 编译 1 个源文件到 C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\test-classes [信息] [信息] [INFO] [INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ Q12840869 --- [INFO] [INFO] 构建 jar:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\Q12840869-1.0-SNAPSHOT.jar [信息] [信息] [信息] [信息] --- maven-surefire-plugin:2.7.2:test (surefire-it) @ Q12840869 --- [INFO] [INFO] Surefire 报告目录:C:\Users\maba\Development\svn\local\stackoverflow\Q12840869\target\surefire -报告 [信息] [信息] --------------------------------------------- -------- [信息] T E S T S [信息] --------------------------------------------- -------- [信息] 运行 com.stackoverflow.MainTest [信息] 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.041 秒 [信息] [信息] 结果: [信息] [INFO] 测试运行:1,失败:0,错误:0,跳过:0 [信息] [信息] [信息] ----------------------------------------- ---------------------------- [信息] [信息] 构建成功 [信息] [信息] ----------------------------------------- ---------------------------- [INFO] [INFO] 总时间:5.102s [INFO] [INFO] 完成于:Thu Oct 11 17:10:29 CEST 2012 [INFO] [INFO] 最终内存:13M/147M [信息] [信息] ----------------------------------------- ----------------------------

    【讨论】:

    • 我试过这个,但没有任何效果。测试继续在“测试”阶段执行。
    • @saravana_pc 他们继续被release:preparemvn install 执行?
    • 发布:准备。我们在执行以下操作时不会遇到任何问题: mvn install (or) mvn deploy
    • @saravana_pc 添加了我自己的release:prepare 的输出,我没有得到任何输出表明我的测试已经在test 阶段运行。测试是在jar 构建后运行的,它处于package 阶段。可以看到maven-surefire-plugin 只被调用了一次。
    • @saravana_pc 另外,删除我添加到不在test 阶段运行的两行,&lt;id&gt;default-test&lt;/id&gt;&lt;phase&gt;none&lt;/phase&gt;。然后您将看到测试将运行两次。首先在test 阶段,然后在integration-test 阶段。
    【解决方案2】:

    在默认情况下不活动的单独配置文件中添加您的集成测试。添加触发规则或其他内容。然后根据需要使用集成测试调用构建。例如,在您的 CI(Jenkins/Hudson、TeamCity、Bamboo 等)上触发了配置文件。

    您当前面临的问题是您没有区分这两种类型的测试以及它们应该何时运行。您只是简单地定义了您希望它们执行的阶段。这对于 Maven 执行上下文的了解还不够,无法确定您想要做什么,它也会在发布期间调用它们。

    【讨论】:

    • @carlspring- 感谢您的回复。测试按预期执行,目标是 clean、install、deploy 等。只有当我们执行 release:prepare 时,我们才会遇到这些问题。
    • 类似地,就像 mattb 建议的那样,您可以定义参数 -P!yourProfile 以跳过它。
    【解决方案3】:

    我会尝试另一种方法,并尝试将发布插件配置为始终使用 -DskipTests 作为参数,这样您就不需要每次都指定它:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin<artifactId>
        <configuration>
            <arguments>-DskipTests</arguments>
        </configuration>
    </plugin>
    

    理论上,这应该将-DskipTests 附加到preparerelease 目标传递给它们执行的Maven 子执行的参数。

    【讨论】:

    • 此参数将确保永远不会运行测试。我们希望执行集成测试。
    【解决方案4】:

    使用maven-failsafe-plugin 进行集成测试,保留maven-surefire-plugin 进行单元测试。

    这将保证单元测试与集成测试完全隔离(因此可以单独关闭),并且集成测试在“构建生命周期的integration-testverify 阶段”运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多