了解Maven插件的目的

时间:2020-05-13 16:18:10

标签: maven maven-3 maven-surefire-plugin

到目前为止,在与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 testmvn jar:jar之类的阶段/目标。我知道它们的工作方式不同,但是我不知道为什么要在插件下的POM中指定阶段和目标。

或者是否有一种方法可以运行此POM而无需提及阶段/目标,以便它可以选择插件中提到的阶段/目标?

如果有现有的答案可以帮助我理解这一点,请随时指导我。

1 个答案:

答案 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

从本示例中可以看到,执行生命周期阶段很容易,然后在命令行上指定了明确的目标。同样,通过使用通用生命周期(默认生命周期),开发人员可以在不同项目之间切换,而不必担心项目的基本细节。

希望这有助于阐明有关目标,阶段,生命周期,插件等的概念。