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-plugin
的 reportsDirectory
来实现,默认情况下为 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}
属性 以通用方式)。
我有一个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-plugin
的 reportsDirectory
来实现,默认情况下为 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}
属性 以通用方式)。