到目前为止,在与Maven
一起工作时,我能够理解Maven阶段和目标之间的差异以及不同的Maven生命周期。不过,困扰我的是为什么我们使用plugins
?
我在一个示例中使用surefire
插件以以下方式执行测试:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
<executions>
<execution>
<phase>test</phase>
<goals><goal>surefire:test</goal></goals>
</execution>
</executions>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testngChrome.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
我确实了解这里的一个插件用例,它使我可以传递我的 testNG.xml 文件用于执行。
我想了解的是在运行POM时,我们实际上指定了诸如mvn clean test
或mvn jar:jar
之类的阶段/目标。我知道它们的工作方式不同,但是我不知道为什么要在插件下的POM中指定阶段和目标。
或者是否有一种方法可以运行此POM而无需提及阶段/目标,以便它可以选择插件中提到的阶段/目标?
如果有现有的答案可以帮助我理解这一点,请随时指导我。
答案 0 :(得分:1)
在最低限度上,除了解析xml文件,跟踪生命周期并使用少量插件之外,maven不能做任何事情。
maven的真正功能是在使用插件时实现的,这将在下面解释。
Maven插件是一个或多个目标的集合。 jar插件将生成jar文件,编译器插件将编译代码,surefire插件将执行测试用例并生成报告。
每个插件都有与其关联的目标数量。例如,编译器插件有两个目标:
compiler:compile
绑定到编译阶段,用于编译主要源文件。
compiler:testCompile
绑定到测试编译阶段,用于编译测试源文件
您可以在此处了解更多信息:[https://maven.apache.org/plugins/maven-compiler-plugin/][1]
现在,每个目标都是需要执行的任务单元。例如compile:compile,编译器目标具有compile插件以编译源代码。
现在,您最初下载的Maven内核与与项目相关的任务没有太多关系,例如编译,打包,分离等。它将此工作分别委派给Compiler插件和Jar插件。
首次使用这些插件时,将从插件库中下载这些插件。这样,可以很容易地对不同插件的功能进行模块化,并且如果插件中有任何更新,它将自动从存储库中下载,您将获得插件的最新更改。
Maven生命周期
Maven具有构建生命周期。构建生命周期是构建项目所涉及的阶段的有序序列。换句话说,如果您正在从事一个项目,则它会经历一个编译,测试,构建,部署等循环。
Maven可以支持许多不同的生命周期(除了默认的Maven生命周期,我不需要使用任何生命周期),但是最常用的一个是默认的Maven生命周期,它以一个阶段来验证项目的基本完整性,并以涉及将项目部署到生产中的阶段结束
生命周期图像:https://ibb.co/Msmkyjd
插件目标可以附加到生命周期阶段。当Maven在生命周期中经历各个阶段时,它将执行附加到每个特定阶段的目标。每个阶段可能都有零个或多个目标。
现在,打包阶段将为使用jar包装的项目创建一个JAR文件。但是它之前的目标是什么,例如Maven生命周期中的editor:compile和先前的包;执行阶段将首先按顺序执行所有后续阶段,并以命令行中指定的阶段结束。
Maven遍历默认生命周期并执行以下目标:
resources:resources
compiler:compile
resources:testResources
compiler:testCompile
surefire:test
jar:jar
简单地说,当我们执行mvn install时,Maven会执行直到安装阶段的所有阶段。在其下面将使用默认生命周期,并执行生命周期中每个阶段的所有目标。
您也可以单独运行目标:
mvn resources:resources
compiler:compile
resources:testResources
compiler:testCompile
surefire:test
jar:jar
install:install
从本示例中可以看到,执行生命周期阶段很容易,然后在命令行上指定了明确的目标。同样,通过使用通用生命周期(默认生命周期),开发人员可以在不同项目之间切换,而不必担心项目的基本细节。
希望这有助于阐明有关目标,阶段,生命周期,插件等的概念。