插件缺少在POM中,但仍被Maven调用

时间:2016-10-12 18:27:48

标签: maven maven-surefire-plugin

我有一个pom.xml文件,我评论了一个依赖项和一个插件。在此之后我刷新并重新进口,但无论如何插件都能正常工作。我无法理解为什么,因为pom.xml中没有。

实际上我尝试更改Surefire插件的输出目录,但它始终是target / surefire。

<?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>TEST</groupId>
    <artifactId>TEST</artifactId>
    <version>1.0-SNAPSHOT</version>  

    <properties>
        <!--<org.apache.maven.surefire.version>2.19.1</org.apache.maven.surefire.version>-->
    </properties>

    <!--<reporting>-->
        <!--<plugins>-->
            <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-surefire-report-plugin</artifactId>-->
                <!--<version>2.19.1</version>-->
            <!--</plugin>-->
        <!--</plugins>-->
    <!--</reporting>-->

    <dependencies>
        <!--<dependency>-->
            <!--<groupId>org.apache.maven.surefire</groupId>-->
            <!--<artifactId>surefire</artifactId>-->
            <!--<version>${org.apache.maven.surefire.version}</version>-->
            <!--<type>pom</type>-->
        <!--</dependency>-->
    </dependencies>

</project>

1 个答案:

答案 0 :(得分:2)

对这个问题存在一些误解。我们来看看吧。

为什么在评论依赖项时会调用插件?

因为<dependency>对插件的执行完全没有影响。这用于声明项目所依赖的内容,以便编译并运行它。它与您的项目的实际构建过程是分开的,该过程由Maven启动并调用几个插件来执行某些任务,例如执行实际编译或复制文件等。

为什么在我评论插件时调用插件?!

解释依赖于build lifecycles的存在。简而言之,生命周期由几个阶段组成,其中包含插件目标。可能存在多个生命周期,但default是生命周期,通常用于管理项目的打包和部署。例如,阶段是compile,表示项目源编译的阶段,或package表示项目被打包成可交付成果的阶段,或{{1} }表示项目的单元测试。

而且,默认情况下,several plugins已绑定到test生命周期的各个阶段(取决于打包)。你会注意到:

  

defaulttest

这意味着,在surefire:test生命周期的test阶段(针对特定包装),将调用目标default(另请参阅the documentation) 。这就是您在此处看到的内容:maven-surefire-plugin,其前缀为surefire:test并在上面使用,其目标是test,其目的是运行项目的测试类。

还有第二个考虑因素。上面的解释是指在您的POM的surefire元素中声明的build plugins。您注释掉的实际上是<reporting> section,其中包含为项目生成网站时调用的报告插件。

实际问题

  

实际上我尝试更改surefire插件的输出目录

您可以通过配置<build><plugins><plugin>的{​​{3}}来执行此操作,默认为maven-surefire-plugin。这看起来像你的情况:

target/surefire-reports

注意如何在<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <build> ... <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <reportsDirectory>target/someDirectory</reportsDirectory> </configuration> </plugin> </plugins> </build> </project> 内部配置构建插件。你可以省略<build>,这是默认值。

最佳做法是在构建期间生成的所有文件(如Surefire报告)都放在<groupId>org.apache.maven.plugins</groupId>内,或者更一般地说,放在构建目录中(可以使用通用中的target属性获取方式)。