【问题标题】:Understanding the purpose of Maven Plugin了解 Maven 插件的用途
【发布时间】:2020-05-13 16:18:10
【问题描述】:

到目前为止,在使用 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,以便它获取插件中提到的阶段/目标?

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

【问题讨论】:

  • 首先首先默认情况下,所有东西都可以在没有补充配置的情况下开箱即用,这包括使用TestNG;不需要提供套件文件等,除了这些测试是集成测试,应该使用 maven-failsafe-plugin 来运行。此外,从命令行运行意味着简单:mvn packagemvn clean package,如果您想进行集成测试,mvn clean verify 但不需要手动调用目标...仅支持命令行执行的插件目标需要(例外)...

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


【解决方案1】:

至少,maven 除了解析 xml 文件、跟踪生命周期和使用少量插件外,不能做太多事情。

maven的真正强大之处在于它使用插件,我将在下面解释。

Maven 插件 是一个或多个目标的集合。 jar插件生成jar文件,编译器插件编译代码,surefire插件执行测试用例并生成报告。

每个插件都有与之相关的目标数量。例如编译器插件有两个目标:

compiler:compile绑定到编译阶段,用于编译主要源文件。 compiler:testCompile绑定到test-compile阶段,用于编译测试源文件

您可以在此处阅读更多内容:[https://maven.apache.org/plugins/maven-compiler-plugin/][1]

现在每个目标都是一个需要执行的任务单元。比如compiler:compile,编译器目标有compile plugin来编译源代码。

现在,您最初下载的 Maven 核心与您的项目相关的任务(如编译、打包、部署等)没有太大关系。它将这项工作分别委托给 Compiler 插件、Jar 插件。

当您第一次使用这些插件时,这些插件将从 maven 存储库中下载。这样可以很容易地模块化不同插件的功能,如果插件有任何更新,它将自动从存储库中下载,您将获得插件的最新更改。

Maven 生命周期

Maven 有一个构建生命周期。构建生命周期是构建项目所涉及的有序阶段序列。换句话说,如果你在做一个项目,它会经历一个编译、测试、构建、部署等周期。

Maven 可以支持许多不同的生命周期(我不需要使用任何生命周期,除了默认的 Maven 生命周期),但最常用的是默认的 Maven 生命周期,它从验证阶段开始项目的基本完整性,并以涉及将项目部署到生产的阶段结束

生命周期图片https://ibb.co/Msmkyjd

插件目标可以附加到生命周期阶段。随着 Maven 在生命周期的各个阶段中移动,它将执行附加到每个特定阶段的目标。每个阶段可能有零个或多个与其绑定的目标。

现在打包阶段将为带有 jar 打包的项目创建一个 JAR 文件。但是它前面的目标是什么,例如 Maven 生命周期中的 compiler: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

从这个例子可以看出,执行生命周期阶段很容易,然后就是在命令行上指定明确的目标。此外,利用通用生命周期(默认生命周期),开发者可以在不同的项目之间切换,而不必过多担心项目的底层细节。

希望这有助于澄清您关于目标、阶段、生命周期、插件等的概念。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2017-09-07
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多