Maven--搭建开发环境(一)

Maven--构建企业级仓库(二)

Maven—几个需要补充的问题(三)

Maven—生命周期和插件(四)

上几篇从应用角度来讲Maven,这篇还本着应用的精神继续讲解,Maven最好玩的地方不是单单的为你管理了jar这么简单,而是在他所定义的生命周期和插件下,玩多模块才是最有意思的,这篇大概讲一下生命周期和插件,下篇讲多模块依赖。

Maven的声明周期有三套,这里只说平时用到最核心的一套,也就是默认的声明周期,有以下几个重要的过程(其余忽略):

validate:验证项目正确性以及所必须信息的完整性。

initialize:初始化构建状态

generate-sources:产生所有的用来编译的源代码

process-sources:处理源代码

generate-resources:处理项目主资源文件。对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。

process-resources:复制并处理资源文件,至目标目录,准备打包。

compile:编译项目的源代码。

process-test-resources:复制并处理资源文件,至目标测试目录。

test-compile:编译测试源代码。

test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

package:接受编译好的代码,打包成可发布的格式,如JAR。

install:将包安装至本地仓库,以让其它项目依赖。

deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

Maven本身是一个插件框架,因此一系列的动作都要靠插件来完成,想玩Maven,必须对插件灵活运用,比如maven-compiler-plugin是用来编译的,每一个任务都是需要插件的一个目标(goal)来完成,那maven-compiler-plugin的compile目标就是用来编译位于src/main/java/目标下的源码,而testCompile是用来编译src/test/java目标下的测试源码。

Maven开发者提供了很多有用的插件,也提供用户自己开发插件。先说用法,插件有两种用法,一种是直接运行命令,另一种是和声明周期绑定,前者如mvnarchetype:generate,表示调用maven-archetype-plugin的generate目标,命令都是带冒号的;后者的具体用法如下:

那么如何来写一个插件呢?其实平时提供的这些插件基本够用,本人太懒,没有亲自写,但下面是一位网友写的内容,通俗易懂,我就拿来主义了。

所有的mojo都继承自org.apache.maven.plugin.AbstractMojo,我们来建立我们的maven插件工程:

mvn archetype:create -DgroupId=com.alibaba.maven.plugins -DartifactId=greeting-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-mojo  

跟普通Maven的项目一样,自己定义groupId和artifactId。我们这里分别定义groupId为com.alibaba.maven.plugins和greeting-maven-plugin。

archetypeGroupId和archetypeArtifactId用来定位用哪个maven的工程模板来建立项目。当然我们使用的是maven-archetype-mojo模板来建立插件项目。

/** @author admin 
*   @goal sayHello  
*/  
public class HelloWorldMojo extends AbstractMojo{  
 @Override      
public void execute() throws MojoExecutionException, MojoFailureException {   
      getLog().info("Hello World!");      
}} 

Ok,如上所示我们复写了execute方法,最重要@goal的一个annotation,它定义了这个mojo跟goal一一对应的关系。现在我们运行命令mvninstall把该插件先发布到本地库。之后我们便可以执行我们的插件了。

插件的运行方式为:mvngroupID:artifactID:version:goal

按照我们的项目,那么我们运行插件应该:mvncom.alibaba.maven.plugins:greeting-maven-plugin:1.0-SNAPSHOT:sayHello

看看,我们是不是已经在控制台看到我们打出的"HelloWorld"文字了。想想,为什么mvn eclipse:eclipse的插件运行方式可以这么简单。

怎么减少输入呢?首先,我们在maven的setting.xml配置文件中,可以找到这样一个配置项:

<pluginGroups>
<pluginGroup>*</pluginGroup>
</pluginGroups>

如果这里配置上我们的groupID,如我们的com.alibaba.maven.plugins,那么groupId的输入便可省略了。

另外,我们的项目名称DartifactId如果以${name}-maven-plugin或以maven-${name}-plugin的格式命名,我们便能省去-maven-plugin等信息。

version本来可以省略,maven会找到最新的版本来执行。

那么省略后的执行命令就可以这样写了:mvngreeting:sayHello

Ok,那么我要运行插件时输入参数,该怎么处理呢?如同mvn install -Dmaven.test.skip=true。我们重写我们的mojo,加入@parameter的annotation。如下

 /**  
* @author admin  
* @goal sayHello  
*/  
public class HelloWorldMojo extends AbstractMojo{      
/**      
* @parameter default-value="Somebody" expression="${username}      
*/  
private String userName;     
@Override      
public void execute() throws MojoExecutionException, MojoFailureException {  
        getLog().info("Hello World!"+userName);      
}} 

在install一把,然后运行mvngreeting:sayHello -Dusername=张三。这样就可以了。

Maven--生命周期和插件(四)的更多相关文章

  1. 05 Maven 生命周期和插件

    Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...

  2. maven生命周期和插件

    maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...

  3. [maven] 生命周期和插件

    maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...

  4. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  5. Maven系列学习(三)Maven生命周期和插件

    Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期 ...

  6. maven生命周期与插件

    目录 Maven生命周期 clean default site 命令与对应周期 插件与绑定 插件目标 插件绑定 内置绑定 自定义绑定 插件配置 本文主要是针对<maven实战>书中关键知识 ...

  7. Maven实战读书笔记(四):Maven生命周期与插件

    Maven的生命周期是对所有构建过程的抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤. Maven的生命周期是抽象的,其实际行为是由插件来完成 ...

  8. 5 Maven生命周期和插件

        命令行的输入往往就对应了声明周期,Maven的生命周期是抽象的,其实际行为都是由插件来完成.生命周期和插件两者协同工作,密不可分. 一.何为声明周期     Maven的生命周期就是为了对多有 ...

  9. (十二)Maven生命周期和插件

    除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...

  10. Maven生命周期和插件机制

    Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...

随机推荐

  1. Grails教程

    1简介- Reference DocumentationVersion:null Table of Contents 1.1Grails 2.0有那些新特性?1.1.1面向开发的特性1.1.2核心特性 ...

  2. iOS 压缩与裁剪图片问题

    我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好. 这时你可能想到设置UIImageView ...

  3. ListView OnItemClickListener position 索引不正确

    在使用ListView添加如下代码时 listview.setOnItemClickListener(new OnItemClickListener() { @Override public void ...

  4. Android应用开发-小巫CSDN博客client之嵌入有米广告

    Android应用开发-小巫CSDN博客client之嵌入有米广告 上一篇博客给大家介绍怎样集成友盟社会化组件,本篇继续带来干货,教大家怎样嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SD ...

  5. Oracle11g新特性之动态变量窥视

    1. 11g之前的绑定变量窥视     我们都知道,为了可以让SQL语句共享运行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个变量来取代原来出如今SQL语句里的字 ...

  6. jQuery下的显示和隐藏

    因为太久没更新了,所以来放一点没意思的内容. 做的是jQuery框架的隐藏和显示,HTML如下: <ul> <li>1</li> <li>2</l ...

  7. Oracle Enterprise Manager快速重建

    我们在使用Oracle时, 可以利用Oracle自带的EM(Enterprise Manager)来更方便的管理我们的数据库.但是有时候我们的em却有时候无法连接,造成这个问题的原因有好多,例如没有正 ...

  8. 深入研究MiniMVC之后续篇

    今天在园子看到<深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的>之后,本来是不打算开博来续这个后传,不过,在那边回了个评论之后, ...

  9. jquery的.detach()方法

    .detach()就是从DOM中删除所有匹配的元素. 与.remove()方法不同的是, 这个方法不会把匹配的元素从jQuery对象中删除,所有绑定的事件.附加的数据等都会保留下来,因而可以在将来再使 ...

  10. wordpress禁止调用官方Gravatar头像调用ssl头像链接提升加载速度

    在主题中的functions.php文件末尾加上以下代码即可(外观>编辑>functions.php) //官方Gravatar头像调用ssl头像链接 function get_ssl_a ...