zoukankan      html  css  js  c++  java
  • 【转】maven命令背后是如何工作的

    转载自: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 包里的orgapachemavenproject目录下




    这意味着我的工程不需要在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

    Java代码  收藏代码
    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

    Java代码  收藏代码
    1. <version>2.2.1</version>  



    接着添加依赖

    Java代码  收藏代码
    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

    Java代码  收藏代码
    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. /** 
    7.  * @author tina.wyn 
    8.  * @goal SimpleMojo 
    9.  */  
    10. public class SimpleMojo extends AbstractMojo {  
    11.   
    12.     @Override  
    13.     public void execute() throws MojoExecutionException, MojoFailureException {  
    14.         getLog().info("***********hi,I am tina,it's my first maven plugin!************");  
    15.           
    16.     }  
    17. }  



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

    Java代码  收藏代码
    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 就能看到输出了

  • 相关阅读:
    基于flash的web视频对讲直播测试
    终于放弃Windows下丑陋的cmd
    直播推流兼容性问题追踪
    32位和64位dll判断
    H264编码参数的一些小细节
    cmake编译win下64位obs
    The certificate used to sign "XXX" has either expired or has been revoked
    记录一次Android交叉编译ffmpeg排查错误
    SDK "iphoneos" cannot be located
    av_interleaved_write_frame 网络不好的情况下返回较慢
  • 原文地址:https://www.cnblogs.com/gmq-sh/p/4274251.html
Copyright © 2011-2022 走看看