如何使 Maven 发布插件跳过测试?

Posted

技术标签:

【中文标题】如何使 Maven 发布插件跳过测试?【英文标题】:how to make maven release plugin skip tests? 【发布时间】:2015-03-09 17:21:54 【问题描述】:

我在Spotify's docker-client 的主结帐时运行mvn release:prepare -Darguments="-Dmaven.test.skip=true -DskipTests"。但我无法让 maven 的发布插件跳过测试。为什么在这种情况下 maven 不尊重 CLI 标志?

我也很好奇是什么导致发布插件执行了surefire-plugin。 pom.xml 中没有指定surefire-plugin。

mvn --version

Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T12:29:23-05:00)
Maven home: /usr/local/Cellar/maven/3.2.5/libexec
Java version: 1.7.0_25, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac"

【问题讨论】:

您使用的是哪个版本的 maven-release?确保您使用的是 2.5.1 @EddúMeléndez 感谢您的提问。我在 3.2.5。我已经用上面的版本信息更新了我的问题。 还有 maven-release-plugin 版本? @EddúMeléndez 2.5 这里github.com/spotify/docker-client/blob/master/pom.xml#L180 您能接受其中一个正确答案吗?错误的答案在最上面总是令人困惑。 【参考方案1】:

这对我有用。我想准备和执行发布。

mvn clean -DskipTests -Darguments=-DskipTests release:prepare release:perform

【讨论】:

像魅力一样工作! -Darguments=-DskipTests 就足够了。不需要第一个-DskipTests OP 的命令在-Darguments 下已经有-DskipTests 那么为什么它对他不起作用呢?事实上,我在一个项目中也注意到了同样的事情。 这根本没有回答原来的问题,我真的很惊讶它仍然得到了这么多的赞成票。有关可能的根本原因,请参阅我的回答:***.com/a/61640653/95750【参考方案2】:

我在 pom.xml 中使用了以下内容

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5.3</version>
            <configuration>
                <tagNameFormat>v@project.version</tagNameFormat>
                <arguments>-Dmaven.javadoc.skip=true -Dmaven.test.skipTests=true -Dmaven.test.skip=true</arguments>
            </configuration>
        </plugin>

【讨论】:

没有-Dmaven.test.skipTests这样的设置。它被称为 -DskipTests,它只是跳过运行测试。在这种情况下,您还通过了 maven.test.skip,它一起跳过了测试源的编译步骤,因此无论如何都没有要运行的测试。 TL;DR:-Dmaven.test.skipTests=true -Dmaven.test.skip=true 可以替换为:-Dmaven.test.skip 并非如此,skipTests 编译测试但不运行它们,而 maven.test.skip=true 甚至跳过编译。【参考方案3】:

这是 google 中针对此问题的第一次点击,但没有最可能的解释和解决方案,所以这是我的尝试。

我在运行 release:prepare 时遇到了与 OP 相同的问题,而通过 -Darguments 传入的 -DskipTests 未被识别。深入研究后,我注意到一个祖父 POM(父级的父级)具有以下配置:

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.2</version>
          <configuration>
            <arguments>-B</arguments>
          </configuration>
        </plugin>

它实际上有更多配置,但我只显示与此问题最相关的配置,即&lt;arguments&gt;-B&lt;/arguments&gt;。这是将arguments配置参数硬编码为-B,而不是让它读取arguments属性。为了解决问题,我在项目 pom 中添加了以下内容并开始工作:

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <configuration>
            <arguments>$(arguments)</arguments>
          </configuration>
        </plugin>

【讨论】:

感谢分享。我遇到了同样的问题,POM 中的硬编码参数覆盖了 CLI 参数【参考方案4】:

这适用于 Maven 3.6(可能还有一些早期版本)。

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

【讨论】:

【参考方案5】:

有两件事。首先,如果您想运行一个版本,您需要运行mvn release:perform,它真正运行最终版本的步骤,而不是mvn release:prepare。如果你想跳过mvn release:prepare 中的测试,你应该使用mvn -Dmaven.test.skip=true 加上你定义的给定参数。

除了在default life cylce中定义的maven-surefire-plugin

【讨论】:

我运行了mvn release:prepare -Dmaven.test.skip=true -Darguments="-Dmaven.test.skip=true -DskipTests",它仍然运行了测试。 @khmarbaise:根据jira.codehaus.org/browse/MRELEASE-700,是mvn release:prepare arguments='-Dmaven.test.skip=true' 它也不会为我跳过测试 release:prepare 所做的一件事是更新 POM 版本信息(并提交该版本)。因此,我不建议跳过 release:prepare 步骤。

以上是关于如何使 Maven 发布插件跳过测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Maven 执行器跳过模块

马文。运行测试时跳过插件执行

Maven配置插件跳过测试代码的编译和运行

Maven 打包跳过测试的5种方式

maven 跳过单元测试的3种方法

maven 跳过单元测试的3种方法