zoukankan      html  css  js  c++  java
  • #maven系列(4)-maven插件的介绍

    1. 简介

    在Maven设计中,实际的任务都是交由插件完成的,这种思想和设计模式中的模板方法非常类似,模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样既保证了算法有足够的可扩展性,又能够严格控制算法的整体结构。

    Maven为大多数构建步骤编写并绑定了默认插件,例如:针对编译的插件有maven-compiler-plugin,针对测试的插件有maven-surefire-plugin等。用户几乎察觉不到插件的存在,但实际上编译由maven-compiler-plugin完成的,而测试由maven-surefire-plugin完成的,当有特殊需要的时候,也可以配置插件定制构建行为,甚至自己编写插件。Maven定义的生命周期和插件机制一方面保证了所有Maven项目有一致的构建标准,另一方面又通过默认插件简化和稳定了实际项目的构建,此外,该机制还提供了足够的扩展空间,用户可以通过配置现有插件或者自行编写插件来自定义构建行为。

    下面的代码能说明maven中模板方法的使用。

    public void build(){
    
    initialize(); compile(); test(); packagee(); integrationTest();deploy();
    
    }
    
    protected abstract void initialize();
    
    protected abstract void compile();
    
    protected abstract void test();
    
    protected abstract void packagee();
    
    protected abstract void integrationTest();
    
    protected abstract void deploy();
    

    2. 插件目标

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

    用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

    认识上述Maven插件的基本概念能帮助你理解Maven的工作机制,不过要想更高效率地使用Maven,了解一些常用的插件还是很有必要的,这可以帮助你避免一不小心重新发明轮子。多年来Maven社区积累了大量的经验,并随之形成了一个成熟的插件生态圈。Maven官方有两个插件列表,第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:[]http://mojo.codehaus.org/plugins.html](http://mojo.codehaus.org/plugins.html)。

    3. 插件绑定

    maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。比如项目编译这个任务,对应default生命周期的compile阶段,而插件maven-compiler-plugin目标compile能完成这一任务。将二者绑定能完成编译任务。

    3.1. 内置绑定

    前面已经讲过maven的生命周期,包括clean、default和site三个生命周期,每个生命周期又包括不同的阶段。
    clean

    生命周期阶段 插件目标
    pre-clean
    clean maven-clean-plugin:clean
    post-clean

    default

    生命周期阶段 插件目标
    process-resources maven-resources-plugin:resources
    compile maven-compiler-plugin:compile
    process-test-resources maven-resources-plugin:testResources
    test-compile maven-compiler-plugin:testCompile
    test maven-surefire-plugin:test
    package maven-jar-plugin:jar
    install maven-install-plugin:install
    deploy maven-deploy-plugin:deploy

    site

    生命周期阶段 插件目标
    pre-site
    site maven-site-plugin:site
    post-site
    site-deploy maven-site-plugin:deploy

    以clean为例,可以从命令行输出看插件与生命周期的关系,如下:

    D:	mpchzhaotest>mvn clean
    [INFO] Scanning for projects...
    [INFO]
    [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethrea
    ded.SingleThreadedBuilder with a thread count of 1
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building chzhaotest 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ chzhaotest ---
    [INFO] Deleting D:	mpchzhaotest	arget
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.112 s
    [INFO] Finished at: 2015-05-26T09:38:38+08:00
    [INFO] Final Memory: 6M/145M
    [INFO] ------------------------------------------------------------------------
    
  • 相关阅读:
    二分图之最小边覆盖(poj3020)
    第一章:计算机网络概述
    X Window 简单的新手教程
    SharePoint Permission Analyzer 权限分析仪
    《源创新》:破坏性创新换了个说法,有陷入锤子钉子模式的嫌疑,书中的案例可以看一看。
    《金融可以颠覆历史》:隐藏在历史事件背后的金融制度发展历程
    转发:三伏天话“三伏贴”
    《浪潮之巅》(第2版):精彩的IT商战史
    《史玉柱自述》:管理者要谦虚,好的经营策略是试出来的
    《生活中的经济学》:主张让市场去解决生活中的问题,离中国的现实有点远
  • 原文地址:https://www.cnblogs.com/wardensky/p/4529784.html
Copyright © 2011-2022 走看看