一、Maven是什么?
绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团队成员间的交流。一个更正式的 Apache Maven 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
二、Maven和ant的区别
Ant在构建过程方面十分优秀,它是一个基于任务和依赖的构建系统。每个任务包含一组由 XML 编码的指令。有 copy 任务和 javac 任务,以及 jar 任务。在你使用 Ant的时候,你为 Ant 提供特定的指令以编译和打包你的输出。你必须明确告诉 Ant 你的源码在哪里,结果字节码你想存储在哪里,如何将这些字节码打包成 JAR 文件。当然,Maven还有更强大的功能,简言之,Maven是一个项目管理工具,ant是一个项目构建工具。
下面就项目构建方面对Maven和ant做下简单对比。
Apache Ant
• Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。
• Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。
• Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。
Apache Maven
• Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。
• Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。
• Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。
三、为什么要使用Maven
1、工具可移植性/集成
像 Eclipse,NetBeans,和 InteliJ 这样的工具现在有共同的地方来找到项目的信息。在 Maven 出现之前,每个 IDE 都有不同的方法来存储实际上是自定义项目对象模型(POM)的信息。Maven 标准化了这种描述,而虽然每个 IDE 仍然继续维护它的自定义项目文件,但这些文件现在可以很容易的由模型生成。
2、标准的项目布局和项目结构生成器
一个标准的项目结构
3、多项目支持
通过maven的坐标和依赖管理使用多个项目之间关系透明化。
4、丰富的插件支持
Maven提供了丰富的插件,如Eclipse插m2eclipse,源代码控制软件CVS和SVN,持续集成工具Hudson等,Maven的丰富功能主要是通过插件来实现。
四、Maven中的重要概念
1、 项目对象模型(POM)
就像Make的Makefile,Ant的bulid.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。这个POM告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出。就好比一个Java Web应用有一个web.xml文件来描述,配置,及自定义该应用,一个Maven项目则通过一个 pom.xml文件定义。
一个简单的pom.xml
2、Maven坐标 (Coordinates) 及依赖管理 (Dependency Management)
在Maven为构件引入坐标概念之前,我们无法使用任何一种方式来唯一标识所有这些构件,因此,当需要用到Spring Framework依赖的时候,大家会去Spring Framework网站上寻找,当需要Log4j依赖的时候,大家又会到Apache网站上寻找。又因为各个项目的风格迥异,大量的时间花费在搜索、浏览网页等工作上面,没有统一的规范、统一的法则、该工作就无法自动化。Maven定义了这样一组规则,世界上任何一个构件都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。现在只要提供正确的坐标元素,Maven就能找到对应的构件。
当一个项目依赖于另一个项目生成的构件,我们就说这个构件是一个依赖。在Java项目的情况下,这可以简单到比如一个项目依赖与外部的如Log4J或JUnit依赖。Maven对项目依赖进行了细化,可以通过坐标在pom文件进行详细的配置。
3、Maven生命周期 (Lifecycle)
Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。
Maven默认的生命周期如下:
生命周期阶段 描述
validate 验证项目是否正确,以及所有为了完整构建必要的信息是否可用
generate-sources 生成所有需要包含在编译过程中的源代码
process-sources 处理源代码,比如过滤一些值
generate-resources 生成所有需要包含在打包过程中的资源文件
process-resources 复制并处理资源文件至目标目录,准备打包
compile 编译项目的源代码
process-classes 后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)
generate-test-sources 生成所有包含在测试编译过程中的测试源码
process-test-sources 处理测试源码,比如过滤一些值
generate-test-resources 生成测试需要的资源文件
process-test-resources 复制并处理测试资源文件至测试目标目录
test-compile 编译测试源码至测试目标目录
test 使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布
prepare-package 在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本
package 将编译好的代码打包成可分发的格式,如 JAR,WAR,或者EAR
pre-integration-test 执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境
integration-test 如果有必要的话,处理包并发布至集成测试可以 运行的环境
post-integration-test 执行一些在集成测试运行之后需要的动作。如清理集成测试环境。
verify 执行所有检查,验证包是有效的,符合质量规范
install 安装包至本地仓库,以备本地的其它项目作为依赖使用
deploy 复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)
4、Maven仓库(Repositories)
在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,如果你使用版本管理工具(如SVN),你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二进制文件方面并不出色。
Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使用。另外Maven有专门的仓库管理器(Nexus)来进行构建的管理。
五、小结
Maven有着许多实用的特点,并且完成任务十分出色。Maven中最值得称赞的地方就是使用了标准的目录结构和部署。这就使得开发人员能够适应不同的项目,并且不用学习任何结构方面新的东西,也不用掌握特殊的指令来构建结构。在文档方面,由于使用了项目站点构建工具,所以当项目构建完成后,您可以查看所有开发的当前状态,“约定优于配置”在Maven中得到了很好的体现。
Maven官方:http://maven.apache.org/
参考资源:http://www.juvenxu.com/
- 大小: 50.4 KB
- 大小: 28.8 KB
分享到:
相关推荐
### Maven使用小结 #### Maven简介 Maven是一款由Apache基金会提供的开源项目管理和构建工具,其设计理念基于项目对象模型(Project Object Model, POM)。通过一个中心信息片(即POM文件),Maven能够实现对项目...
### Maven环境搭建与配置详解 #### 一、Maven简介 Maven是Apache下的一个开源项目,它是一种项目管理和理解工具。通过一个中心信息管理的方式,Maven能够管理项目的构建、报告和文档。Maven使用描述性的XML文件来...
xml2.7.3 不要使用ide内嵌的maven2.8 小结第3章 maven使用入门3.1 编写pom3.2 编写主代码3.3 编写测试代码3.4 打包和运行3.5 使用archetype生成项目骨架3.6 m2eclipse简单使用3.6.1 导入maven项目3.6.2 ...
第3章 Maven使用入门16.3.1 编写POM17.3.2 编写主代码18.3.3 编写测试代码19.3.4 打包和运行20.3.5 使用Archetype生成项目骨架21.3.6 m2eclipse简单使用22.3.7 NetBeans Maven插件简单使用23.3.8 小结
#### 五、小结 通过本文的介绍,读者可以了解到如何离线安装Eclipse Maven Plugin插件,并在Eclipse中正确配置Maven环境。这为使用Eclipse进行Maven项目开发提供了坚实的基础。掌握了这些步骤后,开发者可以更高效地...
### 小结 Maven 3.3.9 提供了一个高效且稳定的构建环境,简化了Java项目管理。无论是新手还是经验丰富的开发者,都能从中受益。通过熟练掌握Maven,可以提高开发效率,减少手动管理依赖的繁琐工作,使团队协作更加...
### 小结 通过本文的介绍,我们可以了解到Maven作为一种强大的构建工具,在Java开发中扮演着重要的角色。正确理解和使用Maven本地仓库,对于简化项目构建流程、提高开发效率具有重要意义。希望本文能够帮助读者更好...
小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1. Yahoo! Weather RSS 4.3. 创建Simple Weather项目 4.4. 定制项目信息 4.5. 添加新的依赖 4.6. ...
### 小结 《Maven实战2》教程全面介绍了Maven的使用,包括基础概念、核心功能、命令操作以及高级应用。通过学习,你可以熟练掌握Maven,提升项目管理能力,实现快速、稳定的软件开发。阅读提供的"Mavenʵۡ2.pdf...
#### 四、小结 通过以上步骤,你可以成功地将Maven项目导入Eclipse,并进行必要的配置,以确保项目的正常运行。需要注意的是,随着Eclipse版本的更新,上述操作的具体实现可能会有所变化,但总体流程是相似的。希望...
#### 小结 通过上述介绍,我们可以看出Maven为开发者提供了极大的便利,特别是在依赖管理和自动化构建方面。它使得开发者能够专注于业务逻辑而不是繁琐的构建细节,极大地提升了开发效率。无论是对于初学者还是经验...
- **1.5 小结**:总结了Maven的基本概念及其重要性。 #### 2. Maven的安装和配置 - **2.1 在Windows上安装Maven** - **2.1.1 检查JDK安装**:确保系统已经安装了Java Development Kit (JDK)。 - **2.1.2 下载...