maven-surefire-plugin 忽略 pom.xml 中的插件顺序

标签 maven unit-testing maven-plugin pom.xml maven-surefire-plugin

我有一个多模块 Maven 项目。该项目包含自己编写的 maven 插件和该插件的测试项目。 我想在 maven-surefire-plugin 之前的 test 阶段运行我的插件 我在 pom.xml 中的插件之后放置了 maven-surefire-plugin

<build>
    <plugins>
        <plugin>
            <groupId>com.my.group</groupId>
            <artifactId>validator-maven-plugin</artifactId>
            <version>${project.version}</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <goals>
                        <goal>validate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
</build>

但是 maven-surefire-plugin 仍然先运行。

[INFO] ------------------------------------------------------------------------
[INFO] Building PC_TEST_PROJECT 0.23-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ PC_TEST_PROJECT ---
[INFO] Deleting C:\validator\PC_TEST_PROJECT\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ PC_TEST_PROJECT ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\validator\PC_TEST_PROJECT\src\main\java
[INFO] skip non existing resourceDirectory C:\validator\PC_TEST_PROJECT\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ PC_TEST_PROJECT ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ PC_TEST_PROJECT ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ PC_TEST_PROJECT ---
[INFO] Compiling 1 source file to C:\validator\PC_TEST_PROJECT\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ PC_TEST_PROJECT ---
[INFO] Surefire report directory: C:\validator\PC_TEST_PROJECT\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.my.group.validator.MainTest
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.657 sec - in com.my.group.validator.MainTest

Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] >>> validator-maven-plugin:0.23-SNAPSHOT:validate (default) > test @ PC_TEST_PROJECT >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ PC_TEST_PROJECT ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\validator\PC_TEST_PROJECT\src\main\java
[INFO] skip non existing resourceDirectory C:\validator\PC_TEST_PROJECT\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ PC_TEST_PROJECT ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ PC_TEST_PROJECT ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ PC_TEST_PROJECT ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ PC_TEST_PROJECT ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default) @ PC_TEST_PROJECT ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO]
[INFO] <<< validator-maven-plugin:0.23-SNAPSHOT:validate (default) < test @ PC_TEST_PROJECT <<<
[INFO]
[INFO] --- validator-maven-plugin:0.23-SNAPSHOT:validate (default) @ PC_TEST_PROJECT ---
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default) @ PC_TEST_PROJECT ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] validator-parent ................................... SUCCESS [  0.175 s]
[INFO] validator .......................................... SUCCESS [  6.038 s]
[INFO] validator-maven-plugin ............................. SUCCESS [  2.012 s]
[INFO] PC_TEST_PROJECT .................................... SUCCESS [  2.762 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.298 s
[INFO] Finished at: 2015-07-05T00:46:59+03:00
[INFO] Final Memory: 21M/51M
[INFO] ------------------------------------------------------------------------

这是 maven-surefire-plugin 的预期行为吗? 如何更改插件的执行顺序?

最佳答案

试试这个:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>ch.stefanheimberg.stackoverflow</groupId>
    <artifactId>stackoverflow-31225404</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>run-before-surfire</id>
                        <phase>test</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo message=" !!!! THIS SHOULD RUN BEFORE SUREFIRE !!!! " />
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-test</id>
                        <phase>none</phase>
                    </execution>

                    <execution>
                        <id>run-after-antrun</id>
                        <phase>test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

和控制台输出:

cd /Users/stefanheimberg/git/stackoverflow-31225404; JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home "/Applications/NetBeans/NetBeans 8.0.2.app/Contents/Resources/NetBeans/java/maven/bin/mvn" clean install
Scanning for projects...

Some problems were encountered while building the effective model for ch.stefanheimberg.stackoverflow:stackoverflow-31225404:jar:1.0-SNAPSHOT
'build.plugins.plugin.version' for org.apache.maven.plugins:maven-surefire-plugin is missing. @ line 31, column 21

It is highly recommended to fix these problems because they threaten the stability of your build.

For this reason, future Maven versions might no longer support building such malformed projects.


------------------------------------------------------------------------
Building stackoverflow-31225404 1.0-SNAPSHOT
------------------------------------------------------------------------

--- maven-clean-plugin:2.4.1:clean (default-clean) @ stackoverflow-31225404 ---
Deleting /Users/stefanheimberg/git/stackoverflow-31225404/target

--- maven-resources-plugin:2.5:resources (default-resources) @ stackoverflow-31225404 ---
[debug] execute contextualize
Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory /Users/stefanheimberg/git/stackoverflow-31225404/src/main/resources

--- maven-compiler-plugin:2.3.2:compile (default-compile) @ stackoverflow-31225404 ---
No sources to compile

--- maven-resources-plugin:2.5:testResources (default-testResources) @ stackoverflow-31225404 ---
[debug] execute contextualize
Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory /Users/stefanheimberg/git/stackoverflow-31225404/src/test/resources

--- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ stackoverflow-31225404 ---
No sources to compile

--- maven-antrun-plugin:1.3:run (run-before-surfire) @ stackoverflow-31225404 ---
Executing tasks
     [echo]  !!!! THIS SHOULD RUN BEFORE SUREFIRE !!!! 
Executed tasks

--- maven-surefire-plugin:2.10:test (run-after-antrun) @ stackoverflow-31225404 ---
No tests to run.
Surefire report directory: /Users/stefanheimberg/git/stackoverflow-31225404/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0


--- maven-jar-plugin:2.3.2:jar (default-jar) @ stackoverflow-31225404 ---
JAR will be empty - no content was marked for inclusion!
Building jar: /Users/stefanheimberg/git/stackoverflow-31225404/target/stackoverflow-31225404-1.0-SNAPSHOT.jar

--- maven-install-plugin:2.3.1:install (default-install) @ stackoverflow-31225404 ---
Installing /Users/stefanheimberg/git/stackoverflow-31225404/target/stackoverflow-31225404-1.0-SNAPSHOT.jar to /Users/stefanheimberg/.m2/repository/ch/stefanheimberg/stackoverflow/stackoverflow-31225404/1.0-SNAPSHOT/stackoverflow-31225404-1.0-SNAPSHOT.jar
Installing /Users/stefanheimberg/git/stackoverflow-31225404/pom.xml to /Users/stefanheimberg/.m2/repository/ch/stefanheimberg/stackoverflow/stackoverflow-31225404/1.0-SNAPSHOT/stackoverflow-31225404-1.0-SNAPSHOT.pom
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 1.888s
Finished at: Tue Jul 07 00:41:57 CEST 2015
Final Memory: 8M/155M
------------------------------------------------------------------------

这里的技巧是,首先将您的插件(在我的 antrun 中)绑定(bind)到测试阶段,然后再解除绑定(bind)“默认测试”阶段。在此之后,您可以再次将 maven-surfire 绑定(bind)到测试阶段。

关于maven-surefire-plugin 忽略 pom.xml 中的插件顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31225404/

相关文章:

java - 使用自定义打包类型对遗留项目进行 Maven 化

maven - java.lang.NoSuchMethodError : org. apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar 错误

c++ - C++ 的 CXX 测试框架

java - 如何在 maven2 中跟踪插件依赖项?

java - 为 Spring 单元测试注入(inject)模拟 @Service

c# - MSUnit 测试异步 hell

maven - tomcat7-maven-plugin tomcatManager 状态码 :403, ReasonPhrase:Forbbiden

java - Jasper 服务器 maven 存储库 url?

java - Maven依赖声明触发编译过程的变化?

web-services - 在 Tomcat 上创建 Maven Web 服务