Maven 简介
提醒:当前版本是:Apache Maven 3.8.5,发布于 2022-03-05。
Maven 是一个项目管理工具,可以对 Java 项目进行自动化的构建和依赖管理。Maven 在美国是一个口语化的词语,代表专家、内行的意思,约等于北京话中的老炮儿。有老炮儿在身边,项目经理可谓得心应手。
项目管理是一个很抽象的概念,既可以指技术上的管理工具,也可以指 "以人为本" 的管理手段(非技术因素)。无论是技术还是非技术,项目成败最大的责任人其实就是项目经理,而 Maven 就是项目经理的最得力助手。
如果我们抛开人为因素不提,仅从技术方面来说,Maven 提供了一种思想让团队更科学的管理和构建项目。Maven 采用配置文件的方式对项目的名称、版本号、项目依赖等等信息进行描述,使之结构清晰,任何人接手的成本将会变得很低。在项目构建时,利用 Maven 的 "约定大于配置" 的思想,实现自动化的构建,如果读者熟悉 Ant,可以清醒的感知 Maven 比 Ant 脚本构建项目省去不少配置文件的内容。另外,一个项目往往依赖于其他的项目和第三方的组件才能顺利完成,Maven 提供了仓库的功能,让这些依赖项放进仓库中,项目可以随时从仓库中去取,如果其他项目组也需要这些依赖,同样也可以从仓库中去取,不必每个人去开源项目的站点去苦苦搜寻了。如此下来,人员的成本、软件维护的成本、沟通的成本、硬件的成本都降下来了。客户笑了、公司老板也笑了、项目经理笑了、团队里面的人员也笑了、Apache社区看到这么多人在用也笑了。总之,使用 Maven 是件你好、我好、大家好的事情。
Maven 曾是 Jakarta 项目的子项目,后来成为由 Apache 软件基金会主持的独立 Apache 项目。在Java世界里,Jakarta 项目犹如长城一般的存在,铸就了丰功伟业。在Apache建立伊始,源码界犹如混沌未开化的洪荒之地,长满C/C++的杂草,而Java刚刚漏出新芽。 当时Apache组织里面有很多C语言开发的项目,Java还是一门小众语言。为了发展Java Web项目,一群有志之士聚集在一起,启动了Jakarta项目。 后来,Java变得非常的火爆,以至于Jakarta项目囊括了众多基于Java语言的开源软件。最后,不得不把个别项目从Jakarta中独立出来,成为Apache软件基金会的顶级项目,例如:Struts,HttpClient,Tomcat,Ant,Maven,JMeter,Velocity,JMeter,Commons等。一直到2011年12月,在所有子项目都被迁移为独立项目后,Jakarta名称就不再使用了。
Maven诞生之初的目的是为了管理Java项目,后来 Maven 也可被用于构建和管理其他各种项目,例如 C#,Ruby,Scala等语言编写的项目。
在 Maven 出现之前,Java 世界的项目管理工具一直由 Ant 统治着。而在此之后,又有 Gradle 逐渐在 Android 项目中作为配套打包工具流行开来。在目前看来,Maven 依旧是 Java 世界项目管理工具中的王者。
Maven读音
Maven 的正确发音是[ˈmeɪvn](美文),而不是"马文"。Maven 在美国是一个口语化的词语,代表专家、内行的意思,约等于北京话中的老炮儿。
Maven的组成
Maven是一个项目管理工具,它包含了:项目对象模型 (POM,Project Object Model),项目生命周期(Project Lifecycle),依赖管理系统(Dependency Management System)和各种插件。插件主要用来实现生命周期各个阶段(phase)的目标(goal)。Maven的组成如下所示:
不过,上述介绍对于完全没有 Maven 实践经验的人来说,看了等于没看,并没有用处。只有当读者通读本站内容之后,反过头再看,才能豁然开朗。
什么是项目构建?
构建是什么呢?简单地说,构建就是软件项目生产的整个过程,这个过程应该包括:
(1)文档和代码的生成(有些项目会使用代码自动生成工具,比如数据库访问代码的逆向工程)
(2)代码的编译、测试和打包
(3)打包好的代码进行分发或者部署
由此可见,项目的构建可绝不仅仅是编译软件这件事情。除了写代码,在项目层面做的大部分工作,都包含在构建的过程中。
有了 Maven 这个开源利器,构建中的这些过程都能够进行良好的定义,而且 Maven 能够帮我们串起来形成一个自动构建过程,这样比我们手动执行要高效得多。
项目依赖管理的噩梦
Java 最大的一个优势就是有非常强大的生态,整个生态中有无数的框架和API供人使用。我们在创建实际的项目过程中不可避免地需要用到这些框架和API,而它们通常都是以 Jar 包的形式提供。 相信很多人都经历过 Jar Hell 的问题吧。事实上,让一个项目所依赖的外部 Jar 包保持正确的版本和最新的状态,是件非常苦逼的事情。我们编译项目的时候,需要在 ClassPath 上存放依赖的 Jar 包,而这些 Jar 包还会有其他依赖。你一定经历过递归地一个个去下载所有外部依赖的痛苦过程吧,并且还要确保下载的版本都是正确的,当项目越来越复杂的时候,这是件极其麻烦的事情。
Maven 的出现让我们获得了解脱,Maven 可以自动帮我们做依赖管理,我们需要做的就是在 POM 文件里指定依赖 Jar 包的名称、版本号,Maven 会自动下载,并递归地去下载依赖的进一步依赖。
另外,Maven 还提供一个非常方便的功能---快照依赖。快照依赖指的是那些还在开发中的内部依赖包。与其你经常地更新版本号来获取最新版本,不如直接依赖项目的快照版本。快照版本的每一个 Build 版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。使用快照依赖可以确保本地仓库中的每一个 Build 版本都是最新的,这对我们快速迭代开发是一个非常酷的特性。
Maven学习要求
Maven 是 Java 项目构建工具,可以用于管理 Java 依赖,还可以用于编译、打包以及发布 Java 项目,类似于 JavaScript 生态系统中的 NPM。因此,每一位高级工程师或软件架构师,都应该至少具备以下两项 Maven 技能:
(1)熟练使用 Maven 构建项目;
(2)排查并调解项目依赖冲突;