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

maven-surefire-plugin ignores plugins order in pom.xml

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

<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 仍然是 运行s 第一。

[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.Whosebug</groupId>
    <artifactId>Whosebug-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/Whosebug-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.Whosebug:Whosebug-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 Whosebug-31225404 1.0-SNAPSHOT
------------------------------------------------------------------------

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

--- maven-resources-plugin:2.5:resources (default-resources) @ Whosebug-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/Whosebug-31225404/src/main/resources

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

--- maven-resources-plugin:2.5:testResources (default-testResources) @ Whosebug-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/Whosebug-31225404/src/test/resources

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

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

--- maven-surefire-plugin:2.10:test (run-after-antrun) @ Whosebug-31225404 ---
No tests to run.
Surefire report directory: /Users/stefanheimberg/git/Whosebug-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) @ Whosebug-31225404 ---
JAR will be empty - no content was marked for inclusion!
Building jar: /Users/stefanheimberg/git/Whosebug-31225404/target/Whosebug-31225404-1.0-SNAPSHOT.jar

--- maven-install-plugin:2.3.1:install (default-install) @ Whosebug-31225404 ---
Installing /Users/stefanheimberg/git/Whosebug-31225404/target/Whosebug-31225404-1.0-SNAPSHOT.jar to /Users/stefanheimberg/.m2/repository/ch/stefanheimberg/Whosebug/Whosebug-31225404/1.0-SNAPSHOT/Whosebug-31225404-1.0-SNAPSHOT.jar
Installing /Users/stefanheimberg/git/Whosebug-31225404/pom.xml to /Users/stefanheimberg/.m2/repository/ch/stefanheimberg/Whosebug/Whosebug-31225404/1.0-SNAPSHOT/Whosebug-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 中)绑定到测试阶段,然后再解除绑定 "default-test" 阶段。在此之后,您可以再次将 maven-surfire 绑定到测试阶段。

在同一阶段,maven 应该按照 pom.xml 中列出的相同顺序执行插件。更新您的 Maven 版本:

对于 maven 3,从 3.0.3 版本开始是 fixed

对于 Maven 2,它是 fixed 自版本 2.0.11 和 2.1.0