转载自:http://yinny.iteye.com/blog/1883488

Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),它有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,请别将Maven的生命周期看成一个整体哦,三个生命周期是独立线性执行的!分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

每个生命周期包含一些阶段(phase),这些阶段(phase)是有顺序的,每个阶段蕴含一个或多个目标(goal),并且后面的阶段依赖于前面的阶段,我们和Maven最直接的交互方式就是调用这些生命周期阶段。

较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default
生命周期的某个阶段,而不会对其他生命周期产生任何影响。例如,当用户调用clean生命周期的clean阶段的时候,不会触发default生命周期的
任何阶段。

其中deault是最重要的生命周期,拥有validate 、compile 、test 、package 、integration、verify、install、deploy等等阶段

我们来看一下Maven的编译阶段

让maven进行编译代码,使用的是声明的方式来告知Maven如何做的。看似一个简单的命令,注但其实它后面执行了一系列的工作。

mvn compile

这里没有指定compile阶段的goal,所以complie阶段所有goal都会执行

Maven是如何知道从哪里找到要编译的源文件?并且Maven如何知道将编译好的类文件放到哪里?这里就是由Mave基础工作之一“通过配置进
行约定”所解决的问题。一般情况下,源文件放在src/main/java路径下,这种默认设置(虽然在上面的POM文件中并没看到)是从Super
POM继承来的。即使最简单的POM也知道源文件的默认位置。

apache的官方文档里讲述了所有pom在没有被明确地设置过的情况下都继承了super pom



那为神马我们又看不到super pom文件呢,因为这个文件被打包到 Maven 的 Lib Jar文件中了

位置在lib下的maven-2.2.1-uber.jar 包里的\org\apache\maven\project目录下

这意味着我的工程不需要在POM里面明确再设置这些位置,其实你也可以覆盖默认的位置,但并不推荐这样做,如果非要这样做的话,会增加团队无谓的交流和开发成本,会搞得很蛋疼的哦。

那究竟是什么编译了项目的源文件?

插件绑定

Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段和插件的目标相互绑定,以完成某个具体的构建任务。例
如compile这一任务,是将default生命周期的compile阶段和maven-compiler-plugin这一插件的compile目标
进行绑定,其实这个目标本身什么都不会做,真正编译代码的是compiler插件,而插件在super pom里已经配置好了的。

super pom里的配置如下



当首次执行compile命令或其它命令时,maven会下载所有插件和相关的文件,而之后再执行同一个命令的时候会发现比第一次快很多,这就为
什么首次执行命令时候会比较慢的原因啦。编译后的类文件被放在了target/classes中,看一下我们的工程,maven的原生依赖非常少,就是因
为继承了默认的配置。

说完了compile插件,还有一些我们常用的插件大家都很熟悉啦就不多说了,如下



之后来讲一下maven-help-plugin插件,它是一个实用的辅助插件,最新版的help插件一共有9个goals,其中最简单的就是help;system,它会打印出所有可用的环境变量和java系统属性



help插件9个goals里主要的4个goals分别是:

help:effective-pom,help:effective-settings,mvn help:active-profiles和mvn help:describe

help:effective-pom和help:effective-settings最为有用,它们分别打印项目的有效POM和有效
settings,有效POM是指合并了所有父POM(包括Super
POM)后的XML,当你不确定POM的某些信息从何而来时,就可以查看有效POM。

有效settings同理,特别是当你发现自己配置的settings.xml没有生效时,就可以用help:effective-settings来验证。

mvn help:active-profiles 列出当前项目的活动profile(项目的,用户的,全局的)

mvn help:describe 
描述插件的属性。它不需要在项目目录下运行。但是你必须提供你想要描述插件的groupId和artifactId,这个目标比较复杂,包含7种参数
{plugin ,mojo,Dcmd,minimal, medium ,output and full }

#mvn help:describe -Dplugin=org.apache.maven.plugins:maven-help-plugin 查看compile插件的大概信息,要查看更详细的信息加上-Detail参数(等同Dfull参数)

Dmoji参数是存放每个阶段的goal信息的,比如compiler阶段有2个goals:complie和testCompile 在查询的时候Dmojo=compile或testCompile

#mvn help:describe -Dplugin=compiler -Dmojo=compile

# mvn help:describe -Dcmd=compile 查看complie插件描述和在maven生命周期里的组成

# mvn help:describe -Dplugin=help -Ddetail=true -Doutput=/path/to/file

该命令就是将help插件的完整信息重定向到file文件里,这样比较便于阅读

Ddetail和Dfull就是显示完整信息的参数,这里不再赘述啦。

大家有没有想过,如果maven自带的插件满足不了我们的需求时候,该怎么办呢?其实不难办,可以通过自己写插件来实现哈。下面给大家讲一下如何写插件。

1、首先需要创建一个maven项目tinaproject,然后把pom里的packaging改成 maven-plugin

  1. <groupId>com.taobao.test</groupId>
  2. <artifactId>tinaproject</artifactId>
  3. <packaging>maven-plugin</packaging>
  4. <version>1.0-SNAPSHOT</version>
  5. <name>tinaproject Maven Webapp</name>
  6. <url>http://maven.apache.org</url>

然后把版本改为你自己使用的版本,一般现在都是用maven2

  1. <version>2.2.1</version>

接着添加依赖

  1. <dependencies>
  2. <dependency>
  3. <groupid>org.apache.maven</groupid>
  4. <artifactid>maven-plugin-api</artifactid>
  5. <version>2.2.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupid>org.apache.maven</groupid>
  9. <artifactid>maven-core</artifactid>
  10. <version>2.2.1</version>
  11. </dependency>
  12. </dependencies>

2、pom修改完了之后就开始创建mojo类了,maven插件里每一个goal所对应的功能都是一个Mojo,比如说eclipse:clean和eclipse:eclipse就是两个Mojo

  1. package test.mojo;
  2. import org.apache.maven.plugin.AbstractMojo;
  3. import org.apache.maven.plugin.MojoExecutionException;
  4. import org.apache.maven.plugin.MojoFailureException;
  5. /**
  6. * @author tina.wyn
  7. * @goal SimpleMojo
  8. */
  9. public class SimpleMojo extends AbstractMojo {
  10. @Override
  11. public void execute() throws MojoExecutionException, MojoFailureException {
  12. getLog().info("***********hi,I am tina,it's my first maven plugin!************");
  13. }
  14. }

写完了一个最简单的mojo类之后就来测试下能否正确运行,把mvn install吧它发布到本地maven仓库,然后在pom里再增加一个plugin(就是我自己写的这个)

  1. <plugins>
  2. <plugin>
  3. <groupId>com.taobao.test</groupId>
  4. <artifactId>tinaproject</artifactId>
  5. <version>2.2.1</version>
  6. <executions>
  7. <execution>
  8. <phase>compile</phase>
  9. <goals>
  10. <goal>SimpleMojo</goal>
  11. </goals>
  12. </execution>
  13. </executions>
  14. </plugin>
  15. </plugins>

最后再运行mvn compile 就能看到输出了

【转】maven命令背后是如何工作的的更多相关文章

  1. Maven之(四)Maven命令

    常用命令 从某种意义上来说,软件是帮助不懂程序的人来操作计算机的,图形化界面尤其如此.在上个世纪,比尔盖茨之所以成为世界首富,微软之所以IT界的巨鳄,就是因为Windows开图形化操作之先河,并抢先占 ...

  2. 常用maven命令总结

    常用Maven命令: mvn -v //查看版本 mvn archetype:create //创建 Maven 项目 mvn compile //编译源代码 mvn test-compile //编 ...

  3. Maven详解【面试+工作】 各种安装 没用

    1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...

  4. 《Maven实战》关联实际工作的核心知识

    通读了<Maven实战>这本书,由于在实际的工作中,对其有一定的操作上的经验.因此,再回头去通读这本书,就能够更加精准的把握里面的核心知识了. 以下我主要从两点去介绍之—— 1> m ...

  5. 装服务器,测试数据库,简单的maven命令

    [说明]今天总体回顾一下:大概是早上装服务器,下午测试数据库,晚上了解简单的maven命令 一:今日完成 1)在远程服务器的tomcat 设置好管理员的登录账号 2)登录tomcat 的项目管理 查看 ...

  6. Maven 命令格式及一些常用命令

    Maven自身指定定义了一套对项目进行编译,测试,打包,运行,部署等工作的抽象.Maven自己是不实际负责这些工作的,而是把它们交给了插件.所以Maven命令的实际工作执行者是各种各样的插件. 要了解 ...

  7. 解决idea中执行maven命令失败的问题

    1.问题描述 如上图所示,在使用idea 里的maven命令执行项目打包时,有时候会报如下一个错误. -Dmaven.multiModuleProjectDirectory system proper ...

  8. Maven-eclipse运行maven命令

    右击项目,点击Run as,如下图: 即可看到有很多现有的maven命令,点击即可运行,并在控制台可以看到运行信息 如果你想运行的maven命令在这里没有找到,点击Maven build创建新的命令, ...

  9. 《Maven_孔浩》Maven命令

    maven命令: mvn compile:maven编译 mvn test:测试 mvn clean:删除编译生成的target文件 mvn package:运行编译.测试.package,把项目打包 ...

随机推荐

  1. iOS开发中的错误整理,通过storyboard做项目,遇到view看不见,或者view被压缩的情况

    前言:在网易新闻的练习中遇到了这个错误 注意:练习中遇到了如图的bug,主要是因为用storyboard布局 600 * 600   显示的时候要经过自动布局,缩小到相应手机的屏幕大小.也就是有的尺寸 ...

  2. Laravel教程 一:安装及环境配置

    Laravel教程 一:安装及环境配置 此文章为原创文章,未经同意,禁止转载. Homestead 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算有机 ...

  3. 菲涅尔反射(Fresnel Reflection)

    离线渲染中,通常可以用kd,ks,kt(分别代表物体的漫反射系数,镜面反射系数,透射系数)来简单地描述一个物体的基本材质,例如,我们将一个物体设置为:kd=0,ks=0.1,kt=0.9,即代表一束光 ...

  4. Oracle 11g r2 x64 中文乱码解决方案

    1.检查服务器编码: 执行SQL语法: select * from v$nls_parameters; 2.设置本地客户端编码: 进入 我的电脑,属性,高级,环境变量,添加2项:LANG=zh_CN. ...

  5. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  6. 不起眼却有大作用的 .NET功能集(转发)

    http://www.cnblogs.com/powertoolsteam/p/top15features.html 目录 1. ObsoleteAttribute2. 设置默认值属性: Defaul ...

  7. liunx几台机器直接用ssh链接

    1,查看ip sudo ifconfig 2,查看是否安装了ssh server服务 ps -ef |grep ssh  或者ps -aux |grep ssh 看一下里面有没有sshd.如果没有表示 ...

  8. [转] Android开发者必备的42个链接

    下面收集了42个帮助大家学习Android的内容链接,部分内容是面向初学者的,帮助大家从头开始学习Android开发,其他则面向较高级的开发者.希望推荐的这些内容对你有帮助. 官方网站 1.谷歌And ...

  9. HDOJ 1536 S-Nim

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. The Pilots Brothers' refrigerator(dfs)

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19718 ...