先说一个烧菜的例子,我要做一盘红烧排骨,需要下列材料:
·小排500克
· 酱油20克
· 盐5克
· 糖20克
· 茴香5克
· 姜一个
那么,我就要先去菜市场买小排,去超市买酱油,去南北货店买茴香,而且我还要自己去记,麻烦吗?
这个时候,有个超市,卖一个红烧排骨的一个包,把这些材料打包好,放在橱柜里卖。你要做的就是:去超市买这个红烧排骨包,里面包含了小排和所有要用到的材料。
然后,你就可以开始烧红烧小排了。至于这个红烧小排的配料怎么配,不用你操心,这个是超市做个包的配菜师傅的事情。当然,你要宫保鸡丁的配料,这个师傅也会给你配好。
Maven就是这个超市,只是它卖的不是红烧排骨,而是一个jar包已经和它有依赖关系的其他jar包。
这样,你就不用在写Java代码前,去各个网站下载各种不同的jar包了,也不用考虑它们之间的依赖关系。
主要通过三点书面说明。
Maven的哲学
Maven通常被认为是一个构建工具,与Ant类似。
不过,Maven的创建者们可不这么认为,在Maven的哲学里,Maven是通过采用各种模式来创建的一个具有可视性、复用性、可维护性和完整性等特征的基础设施。
这么说有点太高大上了,接地气一点来说吧:
Maven希望把软件开发中的一些最佳实践和模式都整合和固化下来,这样使用Maven来进行开发时,开发过程更爽,生产出来的软件更棒,具有以上所罗列的各种特性。
这几种特性对于一个团队一起高效的开发协作的确是非常重要的。
Maven最初的诞生就是希望Apache的一些项目能够以相同的方式来开发和构建,这样一个开发者从一个项目转到另外一个项目工作的时候能够更加轻松地切换。
因为项目的开发、测试、文档生成、报表和部署,都具有一些共同的特征,这些特征就可以认为是软件开发过程中的一些最佳实践,当这些最佳实践成为共识,开发的协作必然会更加高效。
那么Maven要做的就是把这些最佳实践固化成一个通用的项目管理方法。尽管对于不同的项目,开发中各个阶段会有所不同,但是确实可以找到一条普遍适用的路径,Maven将这条路径以非常清晰的方式结合各种实践模式提供给开发者。
至于模式,学术上一般简单定义为针对一种类型的特性问题的解决方案。
小到一个项目的目录模式,比如代码放到哪、测试代码放到哪、资源放到哪等,再大到如项目的依赖如何管理,到整个项目构建的生命周期模式(比如通用的构建过程包含哪些阶段),都是Maven这个基础设施要提供给大家的,是Maven强制大家形成共同的认知,这样大家就能更快速地生产出棒棒的软件。
以上,便是Maven的哲学,学习过软件工程的人可能会比较有感觉。
项目构建
Maven这个基础设施落地下来,最重要的还是一个构建工具(虽然Maven创建者们不屑和Ant这样的构建工具相提并论),所以介绍Maven,必然还是需要先了解构建。
构建是什么呢?简单地说,构建就是软件项目生产的整个过程,比如这个过程应该包括:
文档和代码的生成(有些项目会使用代码自动生成工具,比如数据库访问代码的逆向工程)
代码的编译、测试和打包
打包好的代码进行分发或者部署
大家看看,项目的构建可绝不仅仅是编译软件这件事情,除了写代码,在项目层面做的大部分工作,都包含在构建的过程中。
有了Maven,构建中的这些过程都能够进行良好的定义(模式、固化、共识),而且Maven能够帮我们串起来形成一个自动构建过程,这样比我们手动执行要高效得多。
项目依赖管理
Java最大的一个优势之一应该是整个生态中无数的框架和API,我们创建实际的项目不可避免的都需要用到这些框架和API,而它们通常都是以jar包的形式提供。
相信很多人都经历过JAR Hell的问题吧,事实上让一个项目所依赖的依赖的外部jar包保持正确的版本和最新的状态,是意见非常苦逼的事情。
我们编译项目的时候,需要在classpath上存放依赖的jar包(不管直接使用Eclipse还是手动维护Ant),而且这些外部的jar包还会有其他依赖。
你一定经历过递归地一个个去下载所有这些外部依赖,并且要确保下载的版本都是正确的,当项目越来越复杂的时候,这是意见极其麻烦的事情。
Maven现在来拯救我们了,Maven可以自动帮我们做依赖管理,我们需要做的就是在pom文件里指定依赖jar包的名称、版本号,Maven会自动下载,递归地去下载依赖的进一步依赖这件事情我们也不需要管了。
Maven还提供一个非常方便的功能:快照依赖。
快照依赖指的是那些还在开发中的内部依赖包,与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。
快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。总是下载快照依赖可以确保本地仓库中的每一个build版本都是最新的。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理