第二十二章 Maven

本文全面介绍了Maven,包括其组成、下载安装、配置环境变量等。阐述了Maven仓库原理,如本地仓库作为缓存存放Jar包。还介绍了Maven中央仓库地址,标准项目目录,以及构件、坐标、依赖等知识,最后讲解了多模块工程的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Maven

1. Maven 简介
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 世界项目管理工具中的王者。
     
1.1 Maven 的组成
Maven 是一个项目管理工具,它包含了:项目对象模型 (POM,Project Object Model),项目生命周期(Project Lifecycle),依赖管理系统(Dependency Management System)和各种插件。插件主要用来实现生命周期各个阶段(phase)的目标(goal)。Maven 的组成如下所示:

     
1.2 什么是项目构建?
构建是什么呢?简单地说,构建就是软件项目生产的整个过程,这个过程应该包括:
(1)文档和代码的生成(有些项目会使用代码自动生成工具,比如数据库访问代码的逆向工程)。
(2)代码的编译、测试和打包。
(3)打包好的代码进行分发或者部署。
     
由此可见,项目的构建可绝不仅仅是编译软件这件事情。除了写代码,在项目层面做的大部分工作,都包含在构建的过程中。
有了 Maven 这个开源利器,构建中的这些过程都能够进行良好的定义,而且 Maven 能够帮我们串起来形成一个自动构建过程,这样比我们手动执行要高效得多。
   
1.3 项目依赖管理的噩梦
Java 最大的一个优势就是有非常强大的生态,整个生态中有无数的框架和 API 供人使用。我们在创建实际的项目过程中不可避免地需要用到这些框架和 API,而它们通常都是以 Jar 包的形式提供。 相信很多人都经历过 Jar Hell 的问题吧。事实上,让一个项目所依赖的外部 Jar 包保持正确的版本和最新的状态,是件非常苦逼的事情。我们编译项目的时候,需要在 ClassPath 上存放依赖的 Jar 包,而这些 Jar 包还会有其他依赖。你一定经历过递归地一个个去下载所有外部依赖的痛苦过程吧,并且还要确保下载的版本都是正确的,当项目越来越复杂的时候,这是件极其麻烦的事情。
Maven 的出现让我们获得了解脱,Maven 可以自动帮我们做依赖管理,我们需要做的就是在 POM 文件里指定依赖 Jar 包的名称、版本号,Maven 会自动下载,并递归地去下载依赖的进一步依赖。
另外,Maven 还提供一个非常方便的功能---快照依赖。快照依赖指的是那些还在开发中的内部依赖包。与其你经常地更新版本号来获取最新版本,不如直接依赖项目的快照版本。快照版本的每一个 Build 版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。使用快照依赖可以确保本地仓库中的每一个 Build 版本都是最新的,这对我们快速迭代开发是一个非常酷的特性。
   
1.4 Maven 学习要求
Maven 是 Java 项目构建工具,可以用于管理 Java 依赖,还可以用于编译、打包以及发布 Java 项目,类似于 JavaScript 生态系统中的 NPM。因此,每一位高级工程师或软件架构师,都应该至少具备以下两项 Maven 技能:
(1)熟练使用 Maven 构建项目;
(2)排查并调解项目依赖冲突;
   
2. Maven 的下载与安装
2.1 Maven 下载
Maven 官网地址是:https://maven.apache.org/index.html,如下图所示,重点关注图中红框的位置。

  
安装 Maven 3.3+ 需要 JDK 1.7 或者更高版本。
   
安装 Maven 对内存没有特殊要求,大约需要 10M 的硬盘空间即可。
   
当前版本是:Apache Maven 3.8.6,发布于 2022-06-06。
   
Maven的历史发布请移步这个页面:https://maven.apache.org/docs/history.html
   

    
Maven 官网下载地址是:https://maven.apache.org/download.cgi
   
Maven 官方下载地址:http://maven.apache.org/download.cgi,进入下载页面,找到下载文件,如下所示:

   
2.2 Maven 安装
下载完 Maven 之后,解压即可,如下图所示:

    
2.3 Maven 配置环境变量
环境变量,顾名思义,是一种变量,用于提供环境信息。它是给谁提供环境信息呢?答案是:命令行程序。
我们在命令行程序中执行某个命令的时候,操作系统是如何知道这个命令所对应的程序呢?这个时候,环境变量就被派上了用场。命令行程序从环境变量中找到这个命令所对应的程序,然后执行此程序。
接下来,我们需要配置 Maven 的环境变量。
第一步,新建第一个环境变量 MAVEN_HOME,如下所示:

   
变量名:MAVEN_HOME
变量值:D:\apache-maven-3.8.6
提醒:变量值部分根据自己的情况,自行设置即可,也就是 Maven 的解压文件目录。
第二步,编辑 Path 变量,新增:%MAVEN_HOME%\bin,如下所示:

   
提醒:
当项目比较大时,使用 Maven 生成项目需要占用大量内存,如果超过 Java 默认的最大可用内存,则会报 java.lang.OutOfMemeoryError。 解决此问题为设置 MAVEN_OPTS 环境变量,此方法一次设定,一劳永逸,为推荐方法。
MAVEN_OPTS 环境变量设置方法:在环境变量中添加一个新变量名为 MAVEN_OPTS,值为-Xms128m -Xmx512m(数值可以自定义,Xms 为初始内存,即最小内存,Xmx 为最大内存)

   
最后,验证是否安装成功。现在我们打开 cmd,输入:
mvn -v
  
会看到一些信息,如下图所示:

     
恭喜你,Maven 安装成功!
   
3. Maven 仓库
在 Maven 的术语中,仓库是一个位置。软件开发中不可避免的需要引入大量的第三方库,这些库所在的位置在 Maven 中被称为 "仓库"。 在 Maven 中任何一个依赖、插件或者项目构建的输出,都可以称之为 "构件"。Maven 仓库能帮助我们管理构件(主要是 JAR)。
   
Maven 仓库有三种类型:
- 本地仓库(local):顾名思义就是本地本机放置构件的地方。Maven 从远程仓库下载下来的构件都存放在本地仓库中,项目可以从本地 Maven 仓库中获取自己所依赖的文件。
- 中央仓库(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。中央仓库是 Maven 官方提供的,可通过 http://search.maven.org/ 来访问。
- 远程私服(remote):私服一般是指公司内部使用的仓库。运行 Maven 时,Maven 所需要的任何构件都是从本地仓库获取的,但是如果本地仓库没有,它就会尝试
从远程仓库中下载构件到本地仓库。如果 Maven 无法连接到远程仓库,将无法正常构建项目。
    
3.1 Maven 仓库原理介绍
使用 Maven 给我们带来的最直接的好处就是统一管理 Jar 包。那么这些 Jar 包存放在哪里呢?它们就在你的本地仓库中,默认地址位于 C:\Users\用户名 \.m2 目录下(当然也可以修改这个默认地址)。

实际上,我们可以将本地仓库理解为 "缓存",目的是存放 Jar 包。开发项目时首先会从本地仓库中获取 Jar 包,当无法获取指定 Jar 包的时候,本地仓库会从远程仓库(或中央仓库)中下载 Jar 包,并 "缓存" 到本地仓库中以备将来使用。这样一来,本地仓库会随着项目的积累越变越大。

通过下面这张图可以清晰地表达项目、本地仓库、远程仓库之间的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸之间不太闲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值