Maven 介绍

本文主要介绍以下几个部分:

  1.  安装目录分析
  2. Maven 依赖
  3. 继承和聚合
  4. 生命周期和插件

首先介绍一下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

 

 

 

 

网站支持

 

posted @ 2019-05-16 17:02  jingjunfeng  阅读(171)  评论(0编辑  收藏  举报