`

Maven 的 Lifecycle 和 plugins

阅读更多
第一篇:Maven 的 Lifecycle 和 plugins

Maven 通过生命周期和配置插件构建项目

一、【生命周期】和【阶段】的概念

Maven 是基于插件的项目,这与其基于阶段的构建过程是分不开的。
Maven 的每一个构建阶段,都有对应绑定的插件。

注意:
构建阶段和插件是相互独立的。
构建阶段的默认执行插件及目标是通过 packaging 的类型指定的。
packaging 的类型中定义了一系列的阶段,及每个阶段要执行哪个插件的哪个目标。



Maven 把构建项目的过程,总体分为三个生命周期(lifecycle):
    1、默认构建:default
    2、项目清理:clean
    3、项目建站:site

每个生命周期又由许多阶段(phase)组成。
而每个阶段,都可以指定默认执行的目标(goal),去具体执行某项工作。


举例说明:

1、默认构建:default,分为以下阶段:
    1)validate
    2)compile
    3)test
    4)package
    5)verify
    6)install
    7)deploy
这些阶段是有顺序的,构建时按序逐一执行。

在命令行中使用阶段来执行构建。只需输入阶段名称即可。
Maven会按顺序执行该阶段之前的所有阶段。
例如:
mvn install
mvn clean package


查看三大生命周期中的阶段:
http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html


2、阶段被绑定了默认的执行插件及目标

当指定了 packaging 的类型时,
我们可以直接调用阶段的名称来执行 Maven 构建。
因为阶段被默认绑定了一个(或多个) Maven 的核心插件。

然而,我们也可以用命令行调用某个插件的某个目标:
mvn clean dependency:copy-dependencies package

以上命令会执行 clean ,然后执行 dependency 插件的 copy-dependencies 目标(goal),
最后执行 package 阶段。


当然,
使用内置 packaging 类型时,构建的阶段都是绑定了一个或多个插件,
这些插件被称为【核心插件】。
参考:https://maven.apache.org/plugins/index.html

核心插件的命名规则为:maven-name-plugin
而自定义插件的命名规则为:name-maven-plugin
参考:https://maven.apache.org/guides/plugin/guide-java-plugin-development.html


如果你对 maven 提供的核心插件默认执行的 goal 不满意,
Maven 还允许对核心插件进行配置(通过 plugins标签)。

Maven 的核心插件分为两种:
类型一(Type:B):Build plugins
类型二(Type:R):Reporting plugins

参考:https://maven.apache.org/plugins/index.html


二、构建项目:给阶段绑定目标

上面说了,可以单独调用某个阶段名称绑定某个插件的某个goal,进行单个步骤的构建。
但是,Maven 的阶段是独立于 goal 的,生命周期中的阶段都没有绑定任何插件的任何 goal。
引用:http://maven.apache.org/ref/3.5.0/maven-core/lifecycles.html

如果要想一系列的调用阶段,并在每个阶段都绑定一些特定的 goal,该怎么做?


1、整体构建:使用内置的基本打包类型 packaging

Maven 提供了通过指定 packaging 的类型来指定生命周期中的某些阶段所执行特定插件的 goal。
内置的 packaging 的类型包括:jar,war,ear,pom

拿 jar 举例(jar 是 maven 默认的 packaging 类型,packaging 未指定时就是 jar 类型),
如果 packaging 类型是 jar,则其相应的 maven 各个阶段所对应的插件的默认执行的目标如下:

/*
阶段名称                     该阶段所对应的插件及默认调用的目标

process-resources	        resources:resources
compile	                    compiler:compile


process-test-resources	    resources:testResources
test-compile	            compiler:testCompile


test	                    surefire:test

package	                    jar:jar

install	                    install:install

deploy	                    deploy:deploy
*/

这基本上就是标准的绑定了。但是,不同的 packaging 的类型所调用的阶段和插件也不一样。
例如 packaging 是 pom 的(表明该 project 是一个父类),
只绑定了 install 和 deploy 两个阶段。

另外,如果使用自定义的 packaging 类型,需要在 build 标签的 plugin 标签里加上
extension 值为 true


查看所有内置 packaging 类型在不同的构建阶段(phase)的默认绑定目标(goal):
http://maven.apache.org/ref/3.5.0/maven-core/default-bindings.html




2、配置 plugin 标签:将插件的 goal 绑定到项目构建的不同阶段中

第二种方法是在 plugins 标签中对每个插件进行配置。
前面已提到,Maven 是基于插件的,并且提供了可以对其核心插件进行配置的功能。

需要注意的是,只是在 build 中引用 plugin 的坐标是不够的,
还需要在 plugin 标签中的 execution 标签中配置在哪个阶段(phase)运行哪些目标(goal)。
新配置的 goal 会添加到阶段中,与阶段中原有的 goal 合并。
执行顺序是先执行原有的,再执行新配置的。

如果配置了多个 execution,它们的 goal 被绑定在相同的阶段,
goal 都会被按配置的顺序逐一执行。当然,还是阶段原有的goal先执行。
阶段原有的 goal 是在 packaging 中定义的。


举例:
拿 compiler 核心插件举例。该插件有两个目标:compile,testCompile
前者编译 main 目录下的源码
后者编译 test 目录下的源码

packaging 为 jar 时,它在 compile 阶段只绑定了 compiler 插件的 compile 目标。
即:compile 阶段不执行 testCompile 目标。
我们可以在 compile 阶段,把 testCompile 目标也添加进来:


说明:
这样做只是为了演示用途,
因为 testCompile 目标被 packaging 为 jar 时,绑定在了 test-compile 阶段上。


<build>
  <finalName>test</finalName>
  <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.6.1</version>
          <executions>
              <execution>
                  <configuration>
                      <target>1.7</target>
                      <source>1.7</source>
                  </configuration>
                  <phase>compile</phase>
                  <goals>
                      <goal>testCompile</goal> 
                  </goals>
              </execution>
          </executions>
      </plugin>
  </plugins>
</build>


运行:
mvn clean compile


日志:
/*
[INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 6 source files to /Users/Eddy/Documents/workspace/Test002-JavaEE/target/classes
[INFO] 
[INFO] --- maven-compiler-plugin:3.6.1:testCompile (default) @ test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/Eddy/Documents/workspace/Test002-JavaEE/target/test-classes
*/


从执行日志中可以看出,Maven 先执行了 compile 阶段原有的目标:compile,
而后执行了在 plugins 中新配置的且绑定在 compile 阶段的目标:testCompile

注意:
如果在 plugins 中配置的绑定在 compile 阶段的目标也为 compile 的话,
compile 目标会执行两边!





第二篇:Maven构建项目之 build 标签

http://lixh1986.iteye.com/blog/2382352



第三篇:Maven构建项目之 build 标签中的 Plugin 配置



一、Maven 插件之基本配置:configuration 标签

    Maven 的插件具体分为 Build 插件 和 Report 插件。
    它们都有共同的 configuration 配置标签。

    configuration 标签中的配置项,对应的是插件类中的属性或set方法。


举例:

1、插件的实现类:
    /**
     * @goal query
     */
    public class MyQueryMojo
        extends AbstractMojo
    {
        /**
         * @parameter expression="${query.url}"
         */
        private String url;

        /**
         * @parameter default-value="60"
         */
        private int timeout;

        /**
         * @parameter
         */
        private String[] options;

        public void execute()
            throws MojoExecutionException
        {
            ...
        }
    }


2、对应的配置文件应该为:
    <project>
        ...
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-myquery-plugin</artifactId>
                    <version>1.0</version>
                    <configuration>
                        <url>http://www.foobar.com/query</url>
                        <timeout>10</timeout>
                        <options>
                            <option>one</option>
                            <option>two</option>
                            <option>three</option>
                        </options>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        ...
    </project>




二、Maven 插件之 Build 中插件的配置:executions 标签

    executions 标签用来配置在 Maven 构建项目时的哪个生命周期的哪个阶段(phase),
    执行什么目标(goal)。

    如果 goal 有默认的 phase,则 goal 会在执行到那个 phase 时执行。
    如果 goal 没有默认的 phase,而又没有手动指定一个,则该 goal 不会自动执行。

    当然,每一个 execution 都可以有自己的一个 configuration。
    <project>
        ...
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-myquery-plugin</artifactId>
                    <version>1.0</version>
                    <executions>
                        <execution>
                            <id>execution1</id>
                            <phase>test</phase>
                            <configuration>
                                <url>http://www.foo.com/query</url>
                                <timeout>10</timeout>
                            </configuration>
                            <goals>
                                <goal>query</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>execution2</id>
                            <configuration>
                                <url>http://www.bar.com/query</url>
                                <timeout>15</timeout>
                            </configuration>
                            <goals>
                                <goal>query</goal>
                            </goals>
                        </execution>

                    </executions>
                </plugin>
            </plugins>
        </build>
        ...
    </project>


    execution 的 id 是干嘛用的?
    如果在执行 maven 时,没有指定 execution 的 id,则会执行全部的 executions。
    如果指定了,则只会执行指定的那个 execution。




三、dependencies 标签

    Maven 是可以自动解决依赖包的下载的。
    此处的 dependencies 标签主要用于指定使用某个特定版本的依赖。
    比如指定使用最新版本的依赖包。


四、inherited 标签

    Maven项目中的插件,默认是传递给子项目中起作用的。
    可以使用 inherited 标签,将传递功能禁用。





-

转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2383960









引用:

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

https://maven.apache.org/guides/mini/guide-configuring-plugins.html






-

















分享到:
评论

相关推荐

    解决maven中只有Lifecycle而Dependencies和Plugins消失的问题

    在使用Apache Maven构建Java项目时,开发者可能会遇到一个棘手的问题:在IntelliJ IDEA (例如版本2019.2.2) 的Maven Projects工具窗口中,只有生命周期(Lifecycle)显示,而依赖(Dependencies)和插件(Plugins)...

    maven工具包 maven plugins

    - **生命周期(Lifecycle)**:Maven有三个主要的生命周期阶段:`clean`(清理)、`default`(构建)和`site`(站点生成)。每个阶段包含一系列的阶段(phase),如`compile`、`test`、`package`等。 - **插件...

    Maven3实战笔记04Maven的生命周期和插件

    Maven的核心特性之一是其生命周期(Lifecycle),它定义了一系列必须按顺序执行的构建阶段(Phase)。每个阶段都有一个特定的目的,并且可以由Maven插件执行特定的任务。 Maven的生命周期分为三个基本的生命周期:...

    Apache.Maven.Cookbook.1785286129

    Chapter 3: Maven Lifecycle Chapter 4: Essential Maven Plugins Chapter 5: Dependency Management Chapter 6: Code Quality Plugins Chapter 7: Reporting and Documentation Chapter 8: Handling Typical Build ...

    maven安装包和maven安装步骤

    ** Maven安装包与Maven安装步骤详解 ** Maven,作为Java项目管理和构建工具,是开发者不可或缺的一...在实际开发中,不断学习和掌握Maven的高级特性,如 profiles、lifecycle、plugins 等,将使你的开发工作更加高效。

    maven 3.5.2 maven 3.5.2 maven 3.5.2

    4. **生命周期 (LifeCycle)**: Maven有三个主要的生命周期,分别是clean、default和site。default生命周期包含编译、测试、打包、验证、部署等阶段。 5. **插件 (Plugins)**: Maven通过插件执行各种构建任务,如...

    maven.rar apache-maven-3.5.4

    Apache Maven 是一个强大的项目管理和构建工具,主要用于Java项目。它基于项目对象模型(Project Object Model,POM),能够管理项目的构建、报告和文档,通过一套统一的构建生命周期和插件系统,极大地简化了软件...

    maven API maven API

    2. **生命周期 (Lifecycle)**: Maven的生命周期包括一系列阶段(phases),如clean、validate、compile、test、package、install和deploy,这些阶段按顺序执行,构建并管理整个项目流程。 3. **插件 (Plugins)**: ...

    maven中文文档和maven免安装版

    1. **生命周期(Lifecycle)**:Maven的生命周期定义了一系列的阶段,如compile(编译)、test(测试)、package(打包)、install(安装)和deploy(部署)。每个阶段都对应一组目标(Goals),执行目标可以完成...

    maven3.0 maven3.0

    - **生命周期(Lifecycle)**:Maven 有三个主要的生命周期:clean、default和site,分别对应清理、构建和站点生成。 - **构建阶段(Phases)**:每个生命周期由多个阶段组成,如compile、test、install等,它们按...

    apache-maven-3.6.3安装包

    Apache Maven 是一个强大的Java项目管理和综合工具,它简化了构建过程,通过标准化项目结构和自动化构建生命周期。在本文中,我们将深入探讨Maven的核心概念、安装步骤以及如何在实际项目中使用它。 **Maven核心...

    maven项目开发的maven3.3.9使用包

    4. **生命周期(Lifecycle)**:Maven有一套预定义的构建生命周期,包括clean、compile、test、package、install和deploy等阶段,开发者可以根据需要执行特定阶段。 5. **插件(Plugins)**:Maven通过插件执行各种...

    maven3.9.6压缩包

    4. **生命周期(Lifecycle)**:Maven有一套预定义的生命周期,包括clean、default和site三个阶段,用于构建、测试和部署项目。 5. **插件(Plugins)**:Maven使用插件执行特定的任务,如编译、测试、打包、部署等...

    Maven安装包(版本:3.5.3)

    3. **生命周期(Lifecycle)**: Maven有三个主要的生命周期阶段:compile、test和install。每个阶段包含一系列的目标(或称为阶段),如compile用于编译源代码,test用于运行单元测试,install用于将构建的项目安装...

    maven 3.6.3.zip

    3. **生命周期(Lifecycle)**:Maven拥有一个预定义的构建生命周期,包括编译、测试、打包、验证、集成测试、部署等阶段。开发者可以通过简单的命令执行这些阶段。 4. **插件(Plugins)**:Maven通过插件来实现...

    Maven3.6.3(20210503下载).zip

    3. **生命周期和构建阶段**:Maven 提供了一个生命周期(Lifecycle),包括清理(clean)、默认(default)和站点(site)三个主要阶段。默认阶段包含了编译(compile)、测试(test)、打包(package)、验证...

    Maven3.3.9安装包

    3. **生命周期 (LifeCycle)**: Maven有一套预定义的构建阶段,如编译(compile)、测试(test)、打包(package)、验证(validate)和部署(deploy)等,每个阶段都有相应的插件目标执行具体任务。 4. **插件 ...

    Apache-maven-3.1.1

    4. **生命周期(Lifecycle)**:Maven的生命周期定义了一系列构建阶段,如编译(compile)、测试(test)、打包(package)、验证(validate)、集成测试(integration-test)、安装(install)和部署(deploy)。...

    apache-maven3.5.4

    - **生命周期(LifeCycle)**:Maven 提供了一套预定义的构建阶段,如编译(compile)、测试(test)、打包(package)、安装(install)和部署(deploy)等,开发者可以根据需要调用这些阶段。 - **插件(Plugins)...

Global site tag (gtag.js) - Google Analytics