第一章:Maven简介

一、何为Maven?

Maven这个词可以翻译为“知识的积累”,本书将介绍Maven这一跨平台的项目管理工具。作为Apache组织中的一个个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。

(一)Maven是优秀的——项目构建工具

要理解何为Maven,首先得理解何为构建。构建是我们每一位程序员每天都在做的工作,除了编写代码,我们每天有相当一部分时间花在了清理、编译、测试、生成文档、打包和项目部署等繁琐的工作上,这就是构建(build)

Maven是一个异常强大的构建工具,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍遍地输入指令和点击鼠标,我们要做的是使用Maven配置好项目,然后输入简单的命令(如man clean install),Maven会帮我们处理那些繁琐的任务。

Maven抽象了一个完整的构建生命周期模型,并且为绝大部分的构建任务提供了已实现的插件。只要遵循这个模型,就可以避免很多不必要的错误,可以直接使用大量成熟的Maven插件来完成我们的任务。此外,如果有非常特殊的需求,我们亦可以轻松实现自己的插件。

Maven作为构建工具,不仅能帮助我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供一致的操作接口(标准化构建过程),这一切足以使它成为优秀的、流行的构建工具。

(二)Maven是出色的——项目依赖管理工具

在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些类库都可以通过依赖的方式引入到项目中来。随着依赖的增多,版本的不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题变得十分枯燥,幸运的是Maven提供了一个优秀的解决方案,它通过一个坐标系统准确的定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个Java类库。Maven给这个类库世界引入经纬,让它们变得有秩序。

Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),我们还能对其进行快速的搜索,只要定位了坐标,Maven就能够帮我们自动下载,省去手工的麻烦。

(三)Maven还是——项目信息管理工具

Maven还能够帮助我们管理那些原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。为我们节省了大量寻找信息的时间。

除了直接的项目信息,通过Maven自动生成的站点,以及已有的一些插件,我们可以轻松的获取项目文档、测试报告、静态分析报告、源码版本日志报告等非常具有价值的项目信息。

另外,使用Maven还有一个额外的好处,Maven对项目的目录结构、测试用例命名方式等内容都有既有的约定规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置(Convention Over Configuration)

二、为什么需要Maven

Maven不是Java领域唯一的构建管理解决方案。本节将通过一些简单的例子解释Maven的必要性,并介绍其他的构建解决方案,如IDE、Make和Ant,并将它们与Maven进行比较。

(一)为什么不是自定义构建系统

使用脚本建立高度自定义的构建系统(重复发明轮子),耗时费力,结果也不一定很好。当然,你可以享受从无到有的乐趣,但恐怕实际项目中无法给你那么多的时间。使用Maven省时省力,并能够得到成熟的构建系统,还能得到来自于Maven社区的大量支持。Maven是开源的,你无须为此付费。如果你有兴趣,你还能去了解Maven是如何工作的。

(二)为什么不是IDE

使用简单的文本编辑器和命令行也能够完成绝大部分的开发工作,但很少有人愿意一直这样做。

虽然,我们无法否认优秀的IDE能够大大的提高开发效率。主流的IDE(如eclipse)都提供了强大的文本编辑、调试甚至重构功能。但是,IDE是有天生缺陷的(IDE不是万能的):

  • IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有工作。
  • 很难在项目中统一所有的IDE配置,每个人都有自己的喜好。也正是由于这个原因,一个在机器A的IDE上可以运行的任务,到了机器B的IDE中可能就会失败。

我们应该合理的利用IDE,而不是过多的依赖它。对于构建这样的任务,在IDE中一次次地点击鼠标是愚蠢的行为。Maven是这方面的专家,而且主流的IDE都集成了Maven,我们可以在IDE中方便地运行Maven执行构建。

(三)为什么不是Make

Make也许是最早的构建工具,它是由Stuart Feldman于1977年在Bell实验室创建。目前Make有很多衍生实现,包括最流行的GUN Make 和BSD Make,还有Windows平台的Microsoft nmake等。

Make由一个名为Makefile的脚本文件驱动,该文件使用Make自己定义的语法格式。Make通过一系列的目标(Target)和依赖(Prerequisite)将整个构建过程串联起来,同时利用本地命令(Command)完成每个目标的实际行为。Make的强大之处在于它利用所有系统的本地命令,尤其是UNIX/Linux系统,丰富的功能、强大的命令能够帮助Make快速高效地完成任务。

但是,Make将自己和操作系统绑定在一起。也就是说,使用Make很难实现跨平台的构建,这对于Java来说是非常的不友好的。此外,Makefile的语法也成问题,很多人抱怨Make构建失败的原因往往是一个很难发现的空格或者Tab使用错误。

(三)为什么不是Ant

Ant意指“另一个简洁的工具”(Another Neat Tool),它最早用来构建著名的Tomcat,其作者James Duncan Davidson创建它的动机就是因为受不了Makefile的语法格式。我们可以将Ant看成是一个Java版本的Make,也正因为使用了Java,Ant是跨平台的。此外,Ant使用XML定义构建脚本,相对于Makefile来说,这也更加友好。Ant有大量内置的用Java实现的任务,这保证了其跨平台的特质,同时,Ant也有特殊的任务exec来执行本地命令。

和Make一样,Ant也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务,针对每一个项目,开发者都需要重新编写这一过程这里其实隐含着很大的重复(重复发明轮子)。Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需声明项目的基本元素,Maven就指定内置的、完整的构建过程,这在很大程度上消除了重复。

Ant是没有依赖管理的,所以很长一段时间Ant用户都不得不手工管理依赖,这是一个令人头疼的问题。幸运的是,Ant用户现在可以借助Ivy管理依赖。对于Maven来说,依赖管理是理所当然的,Maven不仅内置了依赖管理,更有一个可能拥有全世界最多Java开源软件包的中央仓库,Maven用户无须进行任何配置就可以直接享用。

(四)不要重复发明轮子

不要重复发明轮子,Maven已经有一大把现成的插件,全世界都在用,你自己不用写任何代码!为什么没有人说“我自己写的代码最灵活,所以我不用Spring,我自己实现IoC;我不用Hibernate,我自己封装JDBC”?

【END】

(一)《Maven实战》读书笔记 —— Maven简介的更多相关文章

  1. maven实战读书笔记(二)

    一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...

  2. maven实战读书笔记(一)

    环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...

  3. Maven实战读书笔记(一):Maven概述

    1.1 Maven是什么,能做什么 Maven是一个跨平台的项目管理工具,主要服务于Java平台的项目构建.依赖管理和项目信息管理. Maven的用途之一是项目构建,能够自动化构建过程,从清理.编译. ...

  4. maven实战读书笔记(三)

    maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行

  5. Maven实战读书笔记(五):聚合与继承

    Maven的聚合特性能够把项目的各个模块聚合在一起构建,而继承特性则能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 5.1 聚合 Maven聚合也称多模块 ...

  6. Maven实战读书笔记(六):Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...

  7. Maven实战读书笔记(七):Maven常用功能

    7.1.资源排除 <resources> <!-- 启动过滤,包含的文件会被过滤掉 --> <resource> <directory>src/main ...

  8. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  9. Maven实战读书笔记(三):Maven依赖

    3.1 依赖的配置 一个依赖声明可以包含下面元素: <dependencies> <dependency> <groupId></groupId> &l ...

  10. Maven实战读书笔记(四):Maven生命周期与插件

    Maven的生命周期是对所有构建过程的抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤. Maven的生命周期是抽象的,其实际行为是由插件来完成 ...

随机推荐

  1. ngRx 官方示例分析 - 3. reducers

    上一篇:ngRx 官方示例分析 - 2. Action 管理 这里我们讨论 reducer. 如果你注意的话,会看到在不同的 Action 定义文件中,导出的 Action 类型名称都是 Action ...

  2. block一点也不神秘————如何利用block进行回调

    我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...

  3. UILabel的顶对齐解决方法

    对于有多行文字的UILabel而言,需要设置UILabel的numberoflines属性,此属性默认是1,也就是只显示一行,多余的会以尾部,中间的方式进行截断,具体要看你的初始设置. 在这里可以将其 ...

  4. maven项目生成war包

    配置 你的pom.xml文件,在你的overview视窗里 配置 packaging为 war 然后添加 <plugin> <groupId>org.apache.maven. ...

  5. canvas实现倒计时效果示例(vue组件内编写)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...

  6. Win2003 设置远程连接限制数

    在开发过程中,很多同事需要连接到一台Win2003服务器,但是连接人数超过了10个,就连接不上了.想设置一下连接限制数,可以如下操作: 1:在运行里面输入gpedit.msc后,弹出"本地计 ...

  7. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  8. PHP错误杂记

    Notice: Only variables should be passed by reference in-- 原因:The problem is, that end requires a ref ...

  9. 101490E Charles in Charge

    题目连接 http://codeforces.com/gym/101490 题目大意 你有一张图,每两点之间有一定距离,计算出比最短路大x%之内的路径中最长边的最小值 分析 先跑一遍最短路,然后二分答 ...

  10. 03_Linux文件和目录

    一.Linux目录结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录.所有的东西都是从这里开始.当你在终端里输入"/home",你其实是在告诉电脑,先从/( ...