1、什么是Maven
Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被试图用来简化构建过程。
Maven是一个跨平台的项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
2、Maven的目标
Maven的主要目标是让开发人员在最短的时间内领会一个开发工作的健康状态,为了实现这个目标,Maven试图处理以下几个方面的内容:
(1)使项目构建过程更容易
虽然使用Maven不能够完全消除对底层机制的了解需要,Maven确实屏蔽了大量的细节。
(2) 提供统一构建系统(编译、测试、持续整合...)
Maven允许一个项目来构建和使用其项目对象模型(POM)和所有使用Maven的项目共享的插件集,并提供一个统一的构建系统。一旦你熟悉如何构建一个Maven项目你自然就会知道所有Maven项目是如何构建的,这样当你试图操纵许多项目时节约你大量的时间。
(3) 提供高质量的项目信息(依赖、报告、site...)
Maven提供了大量有用的项目信息,这些信息部分是从您的POM文件获取的,部分是从你的项目的源代码产生的。例如,Maven可以提供:
a. 更改日志文件直接从源头控制创建
b. 交叉引用来源
c. 邮件列表
d. 依赖列表
e. 单元测试报告,包括覆盖率
随着Maven的改进,提供的信息集也会跟着改进,所有的这些对于Maven用户来说是透明的。
其他产品也可以提供Maven插件让他们的项目信息集和Maven提供的标准信息一起仍然基于POM。
(4) 提供开发的最佳实践指南
Maven目的在于收集当前的最佳开发实践原则,并在这个方向让它很容易地引导项目。
例如,单元测试的规范,执行和报告是使用Maven正常构建周期的一部分。当前单元测试的最佳实践指引如下:
a.让您的测试代码在一个单独的但平行的源代码树下
b. 使用测试用例的命名约定来查找并执行测试
c. 测试用例设置自己的环境并且不依赖于定制生成的测试准备
Maven也旨在协助项目的工作流程,如版本管理和问题跟踪。
Maven对于如何设计你的项目的目录结构业提出了一些指导,这样一旦你学会了这种设计,您就可以轻松地浏览任何其他使用Maven和相同设置的项目。
(5) 能无缝的加入新的特性
Maven提供了一种简单的方法来更新Maven客户端,使他们能够利用Maven自身的任何变化。因此,安装新的或升级的第三方插件或Maven本身变得微不足道的。
3、Maven功能概括
以下是Maven的主要功能概括:
a. 遵循最佳实践的简单项目设置 -- 可以在数秒钟内得到一个新的项目或模块
b. 在所有项目中一致的使用意味着新进入项目的开发人员能够更快上手
c. 优秀的依赖管理,包括自动更新,依赖闭包(也称为传递依赖)
d. 能够很容易地同时与多个项目一起工作
e. 一个庞大且不断增长的开箱即用的库和元数据的存储库,以及最大的开源项目的最新版本的实时可用性维护。
f. 可扩展并且能够方便地使用Java和脚本语言编写插件
g. 使用很少或根本不用额外的配置就能即时访问新的功能
h. Maven之外的依赖管理和部署的Ant任务。
i. 基于模型的构建:Maven可以构建任意数量的项目到预定义的输出类型,如JAR,WAR,或基于元数据发布项目,在大多数情况下不需要任何的脚本。
j. 相干网站项目信息:通过在构建过程中使用相同的元数据,Maven能够生成一个网站或PDF包括任何你想添加的文件,并增加了项目开发进度的标准报告。
k. 发布管理和分销出版:无需太多额外配置,Maven将集成源代码控制系统如CVS并根据特定标签管理项目的发布。它也可以发布到其他项目使用的发布位置。Maven能够发布独立的输出,如JAR,包括其他依赖和文档的归档,或源代码分发。
l. 依赖管理:Maven鼓励使用中央存储库的JAR文件和其他的依赖。Maven带有一种机制能够让你项目的客户从中央JAR仓库下载构建项目所需的JAR文件,这很像Perl的CPAN库。这使得Maven用户在多个项目中重用的JAR文件,并鼓励项目之间的沟通以确保向后兼容性问题的处理。
4、安装配置Maven
(1)Windows安装
a. 确认已经正确安装JDK。
b. 下载最新版本的Maven,即apache-maven-3.0.4-bin.zip,下载地址是:http://maven.apache.org/download.html。
c. 解压,我把解压后的目录放在D:\Program Files下。
d. 设置环境变量。新建一个系统变量M3_HOME,值为:D:\Program Files\apache-maven-3.0.4。在系统变量里找到Path,点击编辑,添加变量值"%M3_HOME%\bin".注意:多个值之间需要有分号隔开。
e. 注意Path环境变量。当我们在cmd中输入命令时,Windows首先会在当前目录中寻找可执行文件或脚本,如果没有找到,Windows会接着遍历环境变量Path中定义的路径。安装好之后,在使用mvn -v命令来检查配置是否正确。如果安装无误,将会显示Maven的版本信息。
(2)Linux安装
a.下载最新版本的Maven,即apache-maven-3.0.4-bin.tar.gz,下载地址是:http://maven.apache.org/download.html。
b. 解压到本地目录: tar -zxvfapache-maven-3.0.4-bin.tar.gz。
c. 解压后Maven安装目录为apache-maven-3.0.4。虽然直接使用该目录配置环境变量之后就能直接使用Maven了,但推荐在安装目录旁平行地创建一个符号链接,以方便升级(直接把链接指向新版本):ln -s apache-maven-3.0.4apache-maven
d. 设置环境变量:export M3_HOME=/home/jackie/Software/apache-maven
export PATH=$PATH:$M3_HOME/bin
一般来说,需要将以上两行命令添加到系统的登录shell脚本中去,这样每次启动一个终端,这些配置就能自动执行。
5、Maven安装目录
(1)bin:该目录包含了mvn运行的脚本,这些脚本用来配置Java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。其中mvn是基于UNIX平台的shell脚本,mvn.bat是基于Windows平台的批处理文件。同理mvnDebug和mvnDebug.bat分别是UNIX平台和Windows平台的脚本。mvnDebug比mvn多了一条MAVEN_DEBUG_OPTS配置,其作用就是在运行Maven时开启debug,以便调试Maven本身。该目录还包含m2.conf文件,这是classworlds的配置文件。
(2)boot:该目录只包含一个文件,即plexus-classworlds-2.4.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,Maven使用该框架架在自己的类库。
(3)conf:该目录只包含一个settings.xml。直接修改该文件,就能在机器上全局的定制Maven行为。推荐做法是复制该文件至用户目录下的.m2目录下,然后修改该文件,在用户范围定制Maven行为。
(4)lib:该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的。
(5)LICENSE.txt:该文件记录了Maven使用的软件许可证Apache License Version 2.0。
(6)NOTICE.txt:记录Maven包含的第三方软件。
(7)README.txt:包含Maven的简介,包括安装需求及如何安装的简要指令等。
6、Maven安装最佳实践
(1)设置MAVEN_OPTS环境变量
通常需要设置MAVEN_OPTS的值,因为Java默认的最大可用内存往往不能够满足Maven运行的需要,比如项目较大时,使用Maven生成站点需占用大量内存,如果无此配置,很容易得到java.lang.OutofMemeoryError。所以推荐一开始就配置该变量。
(2)配置用户范围settings.xml
为避免影响系统其他用户,推荐使用用户范围的settings.xml,而且便于Maven升级。
(3)不要使用IDE内置的Maven
Eclipse有一个内置的Maven,不一定稳定,而且我们经常会使用命令行的Maven,所以推荐在Eclipse中配置Maven插件时使用与命令行一致的Maven。