1.背景
问题引入:为什么要使用 Maven?
1.1 添加第三方 jar 包
在 JavaEE 开发领域,有大量的第三方框架和工具可以供我们使用。使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF 目录中的 lib 目录下。但是会导致每次创建一个新工程就需要将 jar 包重复复制到 lib 目录下,从而造成工作区中存在大量重复的文件。而使用 Maven 后每个 jar 包只在本地仓库中保存一份,需要 jar 包的工程只需要维护一个文本形式的 jar 包的引用——我们称之为**“坐标”**。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。
1.2 jar 包之间的依赖关系
jar 包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,称之为jar包之间的依赖关系。最典型的例子是:commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar,如果没有 io 包,FileUpload 包就不能正常工作。那么问题来了,你知道你所使用的所有jar包的依赖关系吗?答案是否定的。而引入 Maven 后,Maven 就可以自动将当前 jar 包所依赖的其他所有jar包全部导入进来,无需人工参与,节约了我们大量的时间和精力。用实际例子来说明就是:通过Maven导入 commons-fileupload-1.3.jar 后,commons-io-2.0.1.jar 会被自动导入,程序员不必了解这个依赖关系。
1.3 处理 jar 包之间的冲突
jar 包不足项目无法正常工作,但有时 jar 包多了项目仍然无法正常工作,这就是 ja包之间的冲突。举个例子:现在有三个工程 MakeFriend、HelloFriend、和 Hello。MakeFriend 依赖HelloFriend,HelloFriend 依赖 Hello。而 Hello 依赖 log4j.1.2.17.jar,HelloFriend 依赖 log4j.1.2.14.jar。如下图所示:
那么 MakeFriend 工程的运行时环境中该导入 log4j.1.2.14.jar 还是 log4j.1.2.17.jar 呢?使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。
1.4 获取第三方 jar 包
JavaEE开发中需要使用到的jar包种类繁多,几乎每个jar包在其本身的官网上的获取方式都不尽相同。为了查找一个jar包找遍互联网,身心俱疲,没有经历过的人或许体会不到这种折磨。不仅如此,费劲心血找的jar包里有的时候并没有你需要的那个类,又或者有同名的类没有你要的方法——以不规范的方式获取的jar包也往往是不规范的。**使用Maven可以享受到一个完全统一规范的jar包管理体系。**只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载,并同时下载这个jar包所依赖的其他jar包——规范、完整、准确!一次性解决所有问题!
1.5 将项目拆分成多个工程模块
随着JavaEE项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于JavaEE项目来说再正常不过。想象一下:几百上千的人开发的项目是同一个Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是Java工程,有的是Web工程。Maven的依赖管理机制可以解决该问题:
1.6 实现项目的分布式部署
在实际生产环境中,项目规模增加到一定程度后,可能每个模块都需要运行在独立的服务器上,我们称之为分布式部署,这里同样需要用到Maven。
2.Maven是什么?
2.1 自动化构建工具
- Maven这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn],不要读作“妈文”。
- Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。
2.2 构建的概念
从三个层面看构建:
-
纯 Java代码
- Java是一门编译型语言,.java扩展名的源文件需要编译成.class扩展名的字节码文件才能够执行。
-
Web 工程
-
当需要通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。“拿”的过程我们叫部署。
我们可以将未编译的Web工程比喻为一只生的鸡,编译好的Web工程是一只煮熟的鸡,编译部署的过程就是将鸡炖熟。
Web工程和其编译结果的目录结构对比见下图:
-
-
实际项目
- 在实际项目中整合第三方框架,Web工程中除了Java程序和JSP页面、图片等静态资源之外,还包括第三方框架的jar包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。
综上所述:构建就是以编写的Java代码、框架配置文件等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去 “生产” 出一个可以运行的项目的过程。
2.3 构建的环节
-
- 清理:删除以前的编译结果,为重新编译做好准备。
-
- 编译:将Java源程序编译为字节码文件。
-
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
-
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
-
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
-
- 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
或部署。Java工程对应jar包,Web工程对应war包。
- 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
-
- 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
-
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
3. 总结
- Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。
- Maven 可以解决 Jar包以及依赖Jar的引入以及解决Jar 包之间的冲突。