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
- <groupId>com.taobao.test</groupId>
- <artifactId>tinaproject</artifactId>
- <packaging>maven-plugin</packaging>
- <version>1.0-SNAPSHOT</version>
- <name>tinaproject Maven Webapp</name>
- <url>http://maven.apache.org</url>
然后把版本改为你自己使用的版本,一般现在都是用maven2
- <version>2.2.1</version>
接着添加依赖
- <dependencies>
- <dependency>
- <groupid>org.apache.maven</groupid>
- <artifactid>maven-plugin-api</artifactid>
- <version>2.2.1</version>
- </dependency>
- <dependency>
- <groupid>org.apache.maven</groupid>
- <artifactid>maven-core</artifactid>
- <version>2.2.1</version>
- </dependency>
- </dependencies>
2、pom修改完了之后就开始创建mojo类了,maven插件里每一个goal所对应的功能都是一个Mojo,比如说eclipse:clean和eclipse:eclipse就是两个Mojo
- package test.mojo;
- import org.apache.maven.plugin.AbstractMojo;
- import org.apache.maven.plugin.MojoExecutionException;
- import org.apache.maven.plugin.MojoFailureException;
- /**
- * @author tina.wyn
- * @goal SimpleMojo
- */
- public class SimpleMojo extends AbstractMojo {
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- getLog().info("***********hi,I am tina,it's my first maven plugin!************");
- }
- }
写完了一个最简单的mojo类之后就来测试下能否正确运行,把mvn install吧它发布到本地maven仓库,然后在pom里再增加一个plugin(就是我自己写的这个)
- <plugins>
- <plugin>
- <groupId>com.taobao.test</groupId>
- <artifactId>tinaproject</artifactId>
- <version>2.2.1</version>
- <executions>
- <execution>
- <phase>compile</phase>
- <goals>
- <goal>SimpleMojo</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
最后再运行mvn compile 就能看到输出了
相关推荐
NULL 博文链接:https://3806850.iteye.com/blog/904909
Maven原理与实践(高级)
Maven原理及使用 涵盖Maven基础概念,实践,Eclipse插件使用
maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装maven安装...
maven的部署应用文档,秘钥仓库的创建。
何为Maven 构建,依赖管理,项目信息聚合 Maven核心概念 坐标,依赖,仓库,生命周期,插件 Maven最佳实践 创建、打包、发布、版本管理 项目实战 Nexus(Todo…) M2eclipse(Todo…)
本文档内容讲述maven的原理及其最佳的实践方式
Maven原理 配置 Maven 的常用命令 Maven Eclipse和MyEclipse 的配置
Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令
maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0maven3.0
基于MAVEN项目的CGLib动态代理原理及实现
Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven3.9.4版本压缩包,仅供学习参考,更新版本请前往Maven官方下载;Maven...
maven 工具 maven 工具 maven 工具 maven 工具 maven 工具
maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程maven教程
用maven创建工作流例子,demo里全部都是单元测试用例,用JUnit Test执行,先执行createTable中的createTableTest,创建25张表(数据库mysql,测试前修改activiti.cfg.xml),然后再执行其他函数
maven
Maven 的基本原理很简单,采用远程仓库和本地仓库以及一个类似 build.xml 的 pom.xml ,将 pom.xml 中定义的 jar 文件从远程仓库下载到本地仓库,各个应用使用同一个本地仓库的 jar ,同一个版本的 jar 只需下载一次...
maven-demo To understand how maven works. 下载 从下载最新的3.5.4包。解压到, /usr/local/ 得到 /usr/local/apache-maven-3.5.4 其中bin目录下的就是maven的应用程序。 环境变量 Linux环境下,打开~/.bash_...
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目...Maven的主要目标是允许开发人员理解完整的 在最短的时间内完成开发工作。简化构建过程,提供统一的构建系统,提供高质量的项目信息,鼓励更好的发展做法。
maven api