【问题标题】:Plugin absent in the POM, but still being invoked by MavenPOM 中不存在插件,但仍被 Maven 调用
【发布时间】:2017-02-21 16:23:17
【问题描述】:

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

【问题讨论】:

    标签: maven maven-surefire-plugin


    【解决方案1】:

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

    为什么在我注释依赖项时会调用插件?

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

    为什么我注释掉了一个插件?!

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

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

    test:surefire:test

    这意味着,在default 生命周期的test 阶段(对于某些打包),目标surefire:test 将被调用(另见the documentation)。这就是您在此处看到的:maven-surefire-plugin,其前缀为 surefire,并在上面使用,有一个名为 test 的目标,其目的是运行您项目的测试类。

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

    实际问题

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

    您可以通过配置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>
    

    注意它是如何放置在&lt;build&gt; 中以配置构建插件的。你可以省略&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;,它是默认的。

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

    【讨论】:

    • 如何刷新maven项目以强制它忘记插件?(刷新构建生命周期)为什么当我注释掉插件时会调用它?!我不清楚,为什么会这样。
    • @LuchkoSerega 通常,您不会告诉 Maven 忘记它,而是要跳过它。请参阅此问题以跳过测试stackoverflow.com/questions/7456006/…。如果你真的想完全禁用它,可以参考这个stackoverflow.com/questions/7821152/…(这里的插件是maven-surefire-plugin)或者这个stackoverflow.com/a/16329002/1743880
    • 为什么我们不能像在添加插件定义行之前那样删除插件?
    • @LuchkoSerega 因为surefire:test 在JAR 的test 阶段被调用(例如)是在Maven 安装本身中定义的。这是一个你不需要担心的预先定义好的定义:你不想测试?用-DskipTests 跳过它们。那些默认的插件绑定在那里是因为它简化了很多事情:例如,你不需要告诉 Maven 在 compile 阶段运行 maven-compiler-plugin 来编译你的 Java 源代码:它已经在那里了。
    • 非常感谢!)我注意到其他项目目标文件夹中的surefire。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2014-07-22
    相关资源
    最近更新 更多