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

Plugin absent in the POM, but still being invoked by Maven

我有一个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>

这个问题有几个误解。让我们来看看它们。

为什么当我评论一个依赖项时会调用一个插件?

因为<dependency>对插件的执行完全没有影响。这用于声明您的项目依赖什么来编译它和运行它。它独立于项目的实际构建过程,由 Maven 启动并调用多个插件来执行某些任务,例如执行实际编译或复制文件等。

为什么我注释掉的插件会被调用?!

解释依赖于build lifecycles的存在。简而言之,生命周期由几个阶段组成,这些阶段本身由插件目标组成。可能有多个生命周期,但 default 一个是中心生命周期,通常控制项目的打包和部署。例如,这些阶段是 compile,代表编译项目源的阶段,或 package,代表项目被打包成可交付成果的阶段,或 test 表示您的项目的单元测试。

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

test: surefire:test

这意味着,在 default 生命周期的 test 阶段(对于某些包装),目标 surefire:test 将被调用(另见 the documentation). This is what you're seeing here: maven-surefire-plugin, whose prefix is surefire and was used above, has a goal called test,其目的是 运行 测试 类 您的项目。

还有第二个考虑。上面的解释参考了 build plugins, declared in the <build><plugins><plugin> element of your POM. What you commented out was actually the <reporting> section,其中包含为您的项目生成网站时调用的报告插件。

实际问题

Actually I try to change output directory for surefire plugin

您可以通过配置 maven-surefire-pluginreportsDirectory 来实现,默认情况下为 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> 中以配置构建插件的。你可以省略<groupId>org.apache.maven.plugins</groupId>,它是默认的。

最佳做法是在构建过程中生成的所有文件(如 Surefire 报告)都放在 target 内,或者更一般地说,构建目录(可以通过 ${project.build.directory} 属性 以通用方式)。