Maven 简介

Apache Maven 是一套软件工程管理和整合工具。基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建、报告和文档。

Maven 工程结构和内容被定义在一个 xml 文件中 - pom.xml,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。

官网地址:http://maven.apache.org/

Maven 的另外一个定义

(一) Maven - POM

1. POM 代表工程对象模型。

它是使用 Maven 工作时的基本组建,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。

2. POM 也包含了目标和插件。

当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标。能够在 POM 中设置的一些配置如下:

project dependencies

plugins

goals

build profiles

project version

developers

mailing list

3. 在创建 POM 之前,我们首先确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是工程的唯一标识。
4. 所有的Maven项目都扩展自超级POM, 我们可以在maven安装目录中找到并查看到。

(二) Maven 的生命周期

1. Maven的生命周期分为三种标准的生命周期
清理 -- Clean      在进行真正的构建之前,进行清理工作
构建 -- Default 构建部分,编译,测试,打包,部署,都在这个生命周期
站点 -- Site 生成项目报告,站点
参考链接 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
(1)Clean分为以下阶段
pre-clean  执行在clean之前完成的工作
clean 清除上一次构建生成的文件
post-clean 执行在clean之后立刻完成的工作
(2)Site 有以下阶段
pre-site     执行在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行生成站点文档之后的工作
site-deploy 将生成的站点文档部署到特定的服务器上
(3)Default有以下(重要)阶段
validate	验证工程是否正确,并且必要信息是否可用
initialize 初始化build状态等工作,设置属性或创建目录
prepare-resources 拷贝资源
compile 编译源代码
test-compile 编译单元测试源代码
test 单元测试,代码不被打包和部署
package 获取编译好的代码,并根据其可发布的格式进行打包,比如Jar, War
install 安装包到本地的仓库,使其被本地的其他工程所依赖
deploy 复制最终的包到远程的仓库,分享给其他的开发者或者项目

以上为重要阶段,全部阶段需参考文档:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

(三) Maven 仓库

1. 基本概念

Maven仓库存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工程指定的文件。

2. 仓库类型

Maven 仓库有三种类型:

本地仓库 local

中央仓库 central

远程仓库 remote

i. 本地仓库

Maven 的本地仓库,在你第一次运行任何 maven 命令的时候创建的,默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径,如:D:/T/RexenBMSite/RexenBMSite/doc/maven/maven/repository

Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用远程机器上的依赖文件。

ii. 中央仓库

Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量也是最全面的常用的资源。

要浏览中央仓库的内容,maven 社区提供了一个 URL:http://search.maven.org/#browse。使用这个仓库,开发人员可以搜索所有可以获取的代码库。

iii. 远程仓库

如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的库文件。

3. Maven对于依赖库的搜索顺序

步骤 1 ,在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。

步骤 2 ,在中央仓库中搜索,如果找不到,并且远程仓库已设置,则执行步骤 4,如果找到了则下载到本地仓库。

步骤 3 ,如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件的错误)。

步骤 4 ,在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件的错误)。

(四) Maven 依赖管理

由于Maven工程中是使用groupId, artifactId, version唯一定义的,所以我们可以根据此唯一标识,在POM中定义对其他工程的依赖

1. 传递依赖

当一个库 A 依赖于其他库 B. 另一工程 C 想要使用库 A, 那么该工程同样也需要使用到库 B, Maven 可以避免去搜索所有需要的库资源的这种需求。通过读取工程文件(pom.xml)中的依赖项,Maven 可以找出工程之间的依赖关系。我们只需要在每个工程的 pom 文件里去定义直接的依赖关系。Maven 则会自动的来接管后续的工作。

但是,通过传递依赖,所有被包含的库的图形可能会快速的增长。当重复的库存在时,可能出现的情形将会持续上升(此处会通过实际工程举例说明)。Maven 提供一些功能来控制可传递的依赖的程度。

2. 依赖控制
(1)依赖调节

决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。比如,A -> B -C D->E-C 那么如果A先声明,则先使用A依赖的C。如果深度不一致,则优先采用最短路径,选取依赖库。

(2)依赖管理(Dependency Management)

Maven提供dependencyManagement 元素既能让子模块继承到父模块的依赖配置,又能保证自模块依赖的使用灵活性。 即,在继承时,继承的是配置,而不是整体继承依赖,子POM中,引用时不需要引用版本号,如果子POM的对应上级POM的Dependency带有版本,则会覆盖从父模块继承下来的该依赖。

(3)依赖范围

compile 编译范围

默认范围,如果没有提供范围,那么依赖范围就是编译范围;

provided 已提供范围

如果范围是provided,那么当JDK,或容器已经提供该依赖之后才使用这个依赖,非传递性的,不会被打包;

runtime 运行时范围

如果一个依赖是runtime依赖范围,那么该依赖在运行和测试系统的时候才使用,在编译和打包的时候不需要,比如,在编译时,只需要JDBC API Jar文件,而只有在测试和运行的时候才需要JDBC的具体实现的Jar文件

test 测试范围

只有在测试和测试编译的时候需要,不会被打包

system 系统范围(一般不推荐)

如果一个依赖的依赖范围是系统范围,那么必须显示的提供一个本地系统中的JAR文件的路径,也就是说Maven不会在仓库中查找依赖,而是直接引用这个外部依赖,以保障编译和运行。

(4)排除依赖

任何可传递的依赖都可以通过 "exclusion" 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”。

(5)可选依赖

A编译时有一个依赖B,但对于B中的功能并不一定是使用的,所以当C引用A时并不一定需要在运行时引用B, 这时A依赖B标记为可选依赖,如果C真正需要B时,则显示声明依赖B。

(五)创建第一个maven工程

(1) 准备工作
将 http://repo1.maven.org/maven2/archetype-catalog.xml  文件下载到本地,并复制到maven 仓库中,如下目录
~\repository\org\apache\maven\archetype\archetype-catalog\2.x
在附件other-resources文件夹下可以找到已经下载好的该文件
(2) 创建java web工程
    进入控制台,执行如下命令
mvn archetype:generate -DgroupId=org.gh.mavenx -DartifactId=simple -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
可以创建
(3)打包
进入控制台,执行如下命令
mvn clean package
即可在”工程名/target”目录下生成war包
(4)测试
将war包copy至Tomcat下,用浏览器成功查看。
(5)查看该maven工程真正运行所根据的pom
执行如下命令查看
mvn help:effective-pom
可以看到输出至控制台的是包含默认设置的pom.xml
(6)理解clean 和 default 生命周期的独立性
执行   mvn clean compile 或 mvn clean package
再执行 mvn compile clean 或 mvn package clean
查看效果,说明这两个标准的生命周期之间是互相独立的。
(7)理解插件,目标,和阶段的关系
Note: “maven-jar-plugin 插件的jar目标,被绑定到package阶段”,”一个阶段可以绑定多个目标,一个插件可以由多个目标组成”
执行 mvn clean jar:jar
查看所打包的jar包的内容
再执行 mvn clean compile jar:jar
再次查看打包的内容,对比之前执行的mvn package效果,通过两次查看效果,可以清晰的看出,maven-jar-plugin这个插件,包含目标jar, 只有package阶段有此能力,此目标被绑定到package阶段
(8)理解maven生命周期 的各个阶段的有序性
执行 mvn xxx 查看有序性效果
(9)查看maven插件信息
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull

版权所有,转载需要标注出处:GavinHacker: http://www.cnblogs.com/gavinsp/p/6377227.html

Maven 概要介绍的更多相关文章

  1. Maven详细介绍

    Maven 目录 1 什么是Maven? 2 Maven 的好处 3 获取和安装 3.1 获取 3.2 安装 3.2.1 环境变量的配置 4 设置本地仓库 5 创建简单的Maven实例 5.1 使用骨 ...

  2. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  3. JMeter学习-005-JMeter 主要组件概要介绍及执行顺序

    本文将对 JMeter 主要组件(主要涉及 Threads(Users).Test Fragment.逻辑控制器.配置元件.定时器.前置处理器.Sampler.后置处理器.断言.监听器 十大组件)进行 ...

  4. maven仓库介绍

    maven仓库介绍 http://juvenshun.iteye.com/blog/359256

  5. maven系列(1)-maven的介绍与安装

    maven的介绍 maven是大名鼎鼎的Apache下的java构建工具. Apache Maven is a software project management and comprehensio ...

  6. maven的介绍及如何获取jar包

    本文转载自   https://www.cnblogs.com/whgk/p/7112560.html 该篇文章篇幅较长,大概的思路如下 maven的介绍,初步认识,获取jar包的三个关键属性 --& ...

  7. Maven实战(八)——常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  8. 开源项目MultiChoiceAdapter详解(一)——概要介绍

    项目地址:https://github.com/ManuelPeinado/MultiChoiceAdapter 这个项目主要是提供了一个多选适配器,使用者可以用它来替换传统的适配器,用途还算比较广泛 ...

  9. maven的介绍以及使用

    maven的介绍以及使用 1.什么是maven maven是一个项目管理工具,一个依赖管理系统,maven通过项目对象模型来管理jar包(POM.xml文件) 2.maven的优点 1.maven使用 ...

随机推荐

  1. 20155312 张竞予 Exp6 信息搜集与漏洞扫描

    Exp6 信息搜集与漏洞扫描 目录 基础问题回答 (1)哪些组织负责DNS,IP的管理. (2)什么是3R信息. (3)评价下扫描结果的准确性. 实验总结与体会 实践过程记录 (1)各种搜索技巧的应用 ...

  2. 第六周助教工作总结——NWNU李泓毅

    本周应批改作业23份,实际批改作业23份. 本周作业要求:https://www.cnblogs.com/nwnu-daizh/p/10569690.html 本周存在的问题: 一.github迭代过 ...

  3. 实战操作——通过wireshark查看任意qq好友IP

    今天有群里好友问我如何查看别人IP,查IP这个东西对于一些刚入门的小白来说可能是一个比较高大上的玩意,但是实际上只需一个网络协议分析工具就OK,废话不多说,下面开始实践 实验对象:任意QQ好友 操作工 ...

  4. jquery-能拖拽宽度的table

    控件官方地址:http://www.bacubacu.com/colresizable/?utm_source=jquer.in&utm_medium=website&utm_camp ...

  5. Python h5py

    1.关于安装: 如果你使用的是Anaconda的话,安装命令如下: conda install h5py 如果没有,安装命令如下: pip install h5py 2.核心概念 读取HDF5文件,假 ...

  6. ionic 侧栏菜单用法

    第一步: 引入js和css文件我这里是直接引入的cdn,ionic是基于angular的,bundle.min.js把常用angular的js已经压缩到一起,可以直接引入.bundle.min.js, ...

  7. MVC+EF 多条件查询

    根据以前的做法是拼接sql语句,这会增加维护成本,因为sql语句里的内容不会报错,所以在使用ef的时候必须要抛弃拼接sql语句的习惯. 构建实例 List<vyw_user> list = ...

  8. bzoj3110(整体二分)

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  9. JSF初学之概念篇1

    先转一篇介绍JSF的文章: Javaserver Faces 简介 — 什么是 JSF? 作者:Chris Schalk,Oracle Corporation2005 年 4 月 什么是 JSF? J ...

  10. Codeforces831B Keyboard Layouts

    B. Keyboard Layouts time limit per test 1 second memory limit per test 256 megabytes input standard ...