Java 什么';Maven编译阶段和插件目标之间的区别是什么?
我正在学习Maven,我试图理解生命周期和插件之间的区别。例如,我有一个非常简单的Maven项目,如下所示:Java 什么';Maven编译阶段和插件目标之间的区别是什么?,java,maven,maven-plugin,Java,Maven,Maven Plugin,我正在学习Maven,我试图理解生命周期和插件之间的区别。例如,我有一个非常简单的Maven项目,如下所示: import org.apache.commons.lang3.StringUtils; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!!!! "); System.out.println(St
import org.apache.commons.lang3.StringUtils;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!!!! ");
System.out.println(StringUtils.capitalize("hello world"));
}
}
以下是pom.xml文件:
<?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>guru.springframework</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.0.0
斯普林格大师
你好,世界
1.0-快照
UTF-8
UTF-8
11
${java.version}
${java.version}
org.apache.commons
commons-lang3
3.8.1
maven清洁插件
3.1.0
自动清洗
初始化
清洁的
如果我使用以下命令:mvn compiler:compile
,它将创建目标文件夹,并在HelloWorld.class中看到:Decompiled.class文件,字节码版本:55.0(Java 11)
。所以它使用的是Java11
现在,如果我将pom.xml中的Java版本更改为1.8并再次使用命令mvn compiler:compile
,我会看到消息:无需编译-所有类都是最新的
。在目标文件夹中,HelloWorld.class有:Decompiled.class文件,字节码版本:55.0(Java 11)
。在pom.xml中将Java11更改为1.8后,它显示了Java11
在那之后,如果我使用命令mvncile
,首先它使用maven clean插件(自动清理)
,然后maven resources插件(默认资源)
,然后maven编译器插件(默认编译器)
并显示消息:检测到更改-重新编译模块代码>。在目标文件夹中,HelloWorld.class有:Decompiled.class文件,字节码版本:52.0(Java 8)
。所以现在它使用Java8
因此,我不明白为什么如果我使用命令mvn compiler:compile
,它不会使用我在pom.xml中添加的auto clean
。但是如果我使用的是mvncile
,它使用的是auto-clean
。有人能帮我理解吗
而且我也不明白为什么如果我使用命令mvnclean
,它会使用默认的clean
。但是,如果我使用命令mvncile
,它将使用自动清理
。任何反馈都将不胜感激。谢谢大家! 阶段和插件目标之间的区别在于,阶段是不同插件目标执行的组
请注意,当前执行之前生命周期中的所有阶段,即执行编译
阶段也会导致验证
、初始化
、生成源
、处理源
、生成资源
和处理资源
运行
当您在命令行上直接指定插件目标时,您将忽略整个生命周期来运行它