本文主要介绍以下几个部分:
- 安装目录分析
- Maven 依赖
- 继承和聚合
- 生命周期和插件
首先介绍一下Maven 名词
- POM(Project Object Model)项目对象模型
- 坐标:groupId , artifactId , version ,packaging,classifier
- Dependency
- Plug-in:Maven是有插件组织的,它的每一个功能都是由插件提供的
- Repository:仓库仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库
- Snapshot:快照 工程正在处于开发阶段
安装目录分析
bin:包含了mvn运行的脚本;这些脚本用来配置Java命令,准备好classpath和相关的java系统属性,然后执行java命令
boot:包含一个类加载器框架,maven 使用它加载自己的类库
conf:settings.xml 在机器上全局配额maven的行为
lib:maven 运行时需要的java 类库;
~/.m2 默认只有repository 仓库文件,一般用户都会复制settings.xml 过来;
Maven 依赖
一、Maven依赖配置
- groupId , artifactId , version 基本坐标
- Type 依赖的类型,默认是jar
- Scope 依赖范围( compile , test, provided, runtime, system )
- Optional 标记依赖是否可选
- Exclusions 用来排除传递的依赖
二、Maven 依赖范围
1. compile :编译依赖范围。 编译,测试,运行都有效,默认的选择
2. test : 测试依赖范围。测试有效,例如junit
3. provided : 已提依赖范围。编译,测试有效,例如 servlet ,运行时容器会提供实现
4. runtime :运行时依赖范围。 运行和测试有效,例如 jdbc,编译时只需相应的接口,测试和运行时才需要具体的实现
5. system :系统依赖范围。 编译,测试有效。使用此范围的依赖必须通过systemPath元素显式的指定依赖文件,因而
此类依赖是不通过Maven仓库解析的,一般适合于本机测试环境下,依赖本地起的服务。
编译、测试、运行 各自使用一套classpath,
依赖范围就是用来控制依赖与这三种classpath的关系
三、传递性依赖
- 假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。
- 表格的第一列是B在A中的依赖范围,第一行是C在B中的依赖范围,交叉的格子是C在A中的依赖范围
四、依赖调解
- 第一原则:路径最近者优先
- 第二原则:第一声明优先
五、依赖归类
Maven 继承和聚合
一、继承
- dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
二、聚合
- 方便快速构建
- 一个命令构建多个模块, 需要额外创建一个模块,然后通过该模块构建整个项目的所有模块
生命周期和插件
- Maven的生命周期就是为了对所有的构建过程进行抽象和统一;编译、测试、打包、集成测试、验证、部署和站点的生成都能映射到一个生命周期上;
- 生命周期是抽象的,不做任何实际的工作(如编译源代码),实际任务都交由插件来完成。每个构建步骤都可以绑定一个或多个插件行为;
一、三套生命周期
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
1、Clean Lifecycle
2、Default生命周期
3、Site生命周期
二、命令行和生命周期
- 从命令行执行maven 任务主要就是调用maven 的生命周期阶段;
- 各个生命周期相互独立,一个生命周期的阶段是有前后依赖的
- 如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开
- mvn clean ; mvn test; mvn clean install ;
- mvn clean deploy site-deploy
三、插件
- Maven生命周期与插件相互绑定,来完成实际的构建任务比如:编译这一任务,它对应了default生命周期的compile这一阶段,而maven-compiler-plugin 这一插件的compile的这一目标能够完成任务;
- 一个插件包含多个功能,每个功能就是一个插件目标;
1、内置绑定
default 生命周期阶段与插件目标的绑定关系图:
2、自定义绑定
一个常见的例子是创建项目的源码jar包。内置的插件绑定关系中没有涉及这一任务,因此需要用户自行配置。maven-source-plugin可以帮助我们完成该任务,它的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在执行完集成测试后和安装构件之前创建源码jar包。具体配置见下
3、插件配置
- 用户可以配置插件目标参数,调整插件目标来执行任务;
- 命令行插件配置
- 使用语法:
- maven命令 -D参数=参数值
- 比如:mvn install -Dmaven.test.skip=true,其中maven命令为install,参数为maven.test.skip,参数值为true,
4、pom中插件全局配置
5、获取插件信息
- 在线插件信息 http://maven.apache.org/plugins/
- 使用maven-help-plugin 描述插件
- 可以运行如下命令来获取maven-compiler-plugin2.1版本的信息:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
6、从命令行调用插件
- 除了mvn命令激活生命周期阶段从而执行绑定的插件目标外,还支持直接从命令行调用插件目标;
- mvn help:describe-Dplugin=complier
- mvn dependency:tree
- help 是maven-help-plugin的目标前缀;
- dependency是maven-dependency-plugin的目标前缀
7、常用Maven插件
- maven-archetype-plugin 项目的骨架
- maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题
- maven-enforcer-plugin建一系列规则强制大家遵守,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止 SNAPSHOT依赖
- maven-help-plugin
网站支持
- http://mvnrepository.com/ 搜寻你想要的jar包版本
- http://maven.apache.org/archetype/maven-archetype-plugin/ 项目骨架Maven Archetype
- http://maven.apache.org/plugins常用Maven插件