`
Yinny
  • 浏览: 293383 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

maven 命令背后是如何工作的

阅读更多
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 就能看到输出了




  • 大小: 24.6 KB
  • 大小: 59.9 KB
  • 大小: 58.8 KB
  • 大小: 76.2 KB
  • 大小: 63.1 KB
  • 大小: 115 KB
  • 大小: 63.8 KB
  • 大小: 37.4 KB
  • 大小: 60.1 KB
  • 大小: 56.7 KB
  • 大小: 73.4 KB
  • 大小: 65.9 KB
  • 大小: 95.3 KB
分享到:

相关推荐

    Maven 命令Maven 命令Maven 命令

    Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令Maven 命令

    java开发maven命令详解

    maven命令详解 零起步简单的了解maven的使用

    maven仓库清理命令

    maven仓库清理命令

    Maven常用命令 Maven Maven学习

    Maven常用命令 Maven Maven学习

    maven常用的命令

    Maven 常用命令 Maven 是一个基于项目对象模型(Project Object Model,POM)的项目管理工具,主要用于管理和构建 Java 项目。以下是 Maven 中的一些常用命令: 1. 创建项目 Maven 提供了 archetype 机制来快速...

    maven常用命令

    对于maven,你不应该只知道在pom中如何引入jar包,还应该了解maven一些常用的命令

    maven常用命令以及以个测试项目

    maven常用命令以及以个测试项目方便测试

    maven 常用命令集合

    主要描述了maven的一些常用命令,以备您不时之需

    maven命令行相关命令集锦

    maven构建Web工程相关的命令行命令的总结

    maven实用命令

    maven实用命令

    java Maven中常用命令和插件

    java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java Maven中常用命令和插件java 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安装maven安装maven安装...

    maven常用命令.docx

    一、maven常用命令: 1.mvn clean 清空产生的项目( target里) 2.mvn compile 编译源代码 3.mvn install 在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库) 4.mvn deploy 上传到私服...

    maven笔记1.pdf

    maven简介、maven安装使用、maven命令使用的详细说明(图文教程) maven简介、maven安装使用、maven命令使用的详细说明(图文教程) maven简介、maven安装使用、maven命令使用的详细说明(图文教程) maven简介、maven安装...

    maven基本命令详解

    maven的基本命令详解

    eclipse下几个简单maven命令

    只包含clean deploy、clean compile -U、clean package、clean clean、clean install

    maven学习与命令

    maven学习与命令

    常用maven命令2

    常用maven命令创建maven项目:mvn archetype:create指定 group: -DgroupId=packageName指定 artifac

Global site tag (gtag.js) - Google Analytics