Maven最全使用指南,都在这里了
张三最近完成了一个项目,但这个项目的规模相当庞大,涉及超过30个jar包.由于缺乏相应的技术支持,他不得不一个个地从网络上下载这些jar包,并花费大量时间进行手动整合.
整整花费了一天时间才完成后续工作。但随后发现存在一些 jar 包版本之间存在兼容性问题,导致工作陷入僵局。然而经过一天的努力后仍未能彻底解决这一棘手问题,真是'豆腐拌腐乳'-越搞越糊涂了!
在经历了长达一个月的高强度工作之后,在经历了长达一个月的高强度工作之后
张三暗下决心要彻底摆脱网课学习模式, 谁曾想李四对待工作极度投入, 不一会儿就被发现了若干个软件缺陷
张三必须立即修正这个bug,并在完成之后还需完成后续的编译与打包步骤。
更需完成后续的编译与打包步骤。
最忙的时候一天完成了近二十次打包。
这确实让张三十分疲劳。
那如何避免上面的场景呢?Maven 闪亮登场。
1. Maven 简介
Maven 作为 Apache 软件基金会下的一款自动化构建工具,在 Java 平台上的项目构建与依赖管理方面具有显著的作用。
概述:Maven 是一个非常有用的工具。过去做项目时需要自行下载 jar 包包以满足项目需求,在采用 Maven 工具后,则只需配置依赖项的位置即可实现自动化管理流程。Maven 软件会自动下载并放置在指定位置上相应的软件包资源。
除了管理 jar 包,它还能帮我们干很多事情:
1.自动下载需要的 jar 包,管理 jar 包的版本以及它们之间的依赖关系。
2.帮你编译程序
3.帮你打包程序
4.帮你部署程序
5.帮你管理项目中各个模块的关系
名词解释:
在项目中,举个例子来说,在我们的项目中需要 servlet.jar这个 jar 包就可以叫做依赖关系也可称为 servlet.jar 依存于我们的项目体系。当我们导入 a.jar 时发现还需要导入 b.jar 这表明 a.jar 依存于 b.jar。
项目构建: 项目构建描述的是代码的编译、运行、打包、部署等一系列过程。
1.项目清理:清理之前编译的代码。
2.Compilation: 将源代码经由编译器转换为虚拟机可执行文件, 即即class文件. Maven则能够帮助我们对多份代码进行批量处理.
3.测试:maven 可以执行测试程序代码,验证你的功能是否正确。
打包操作:用于整合各类 class 文件、配置文件等资源到一个专门的压缩包中。其中 Java 程序的打包结果以 .jar 格式保存,而 web 应用则采用 .war 扩展名。
5.安装:将 jar 文件或者 war 文件安装到本机仓库中。
6.部署:将程序部署到服务器上,我们可以通过网址进行访问。
2. Maven 的安装和配置
2.1 下载安装
注: Maven 是使用 Java 开发的,所以必须先安装配置 JDK。
Maven 官网:
https://archive.apache.org/dist/maven/maven-3/ 复制代码


将下载完的压缩包解压到一个非中文无空格的目录下:

2.2 配置环境变量
1.新增变量
变量名:MAVEN_HOME
变量值:maven 的安装路径

2.修改 path
增加变量值:%MAVEN_HOME%\bin


3.验证
同时按下 window+R 键,输入 cmd,按下回车键。 然后命令行输入: mvn -v

4.修改配置本地仓库
为什么要修改本地仓库?
由于Maven默认设置的本地仓库位于C/用户/.m2文件夹中,在安装越来越多的Java包时,系统硬盘空间可能会逐渐占据较多的空间资源;这可能导致电脑运行速度变慢或响应迟钝;因此,在C盘以外建立一个本地仓库是值得考虑的选择。

打开 Maven 的核心配置文件 settings.xml

添加如下标签:
例如:
5.配置阿里云镜像下载地址
因为国外远程仓库下载 jar 包速度慢,国内阿里云下载速度快。
在 setting.xml 文件里面添加:
完整的 setting.xml
3. IDEA 中使用 Maven
3.1 IDEA 中配置 Maven
File -> Settings:


3.2 创建 JAVA 工程
File -> New -> Project



3.3 创建 WEB 工程
File -> New -> Project
这里我们需要使用 Maven 自带的 web 项目模板。



由于基于 Maven 的 Web 项目模板生成的项目的目录不够完整,在 main 目录中必须构建 Java 和 Resources 目录。


3.4 使用 Maven 工具
当我们的 IDEA 配置完成后,在IDEA窗口右侧显示出了Maven按钮:


Maven 窗口图标的作用:


4. Maven 的核心概念
4.1 目录结构
maven 中规定的目录结构:

1.sms:项目名,也是项目的根路径
2.src:项目的源代码
3.main:主程序
4.java:项目源代码
5.rsources:主程序的配置文件
6.test:测试代码
7.rsources:测试代码的配置文件
8.pom.xml:Maven 项目的配置文件
4.2 pom 文件
pom 全称:Project Object Model,即项目对象模型。
Maven通过抽象技术将项目的模块化架构概括出来,并将其详细说明在pom.xml文件中;值得注意的是这一核心配置文件对于Maven的整体运作至关重要
完整的 pom.xml 文件:
1.modelVersion: Maven 模型的版本,默认配置。
groupId 代表的是公司的标识符或组织标识;通常采用公司域名的逆序结构表示 groupId ,例如 com.alibaba 这样的结构;或者是在公司域名后加上项目名称进行倒置 ,例如 com阿里云tao这样的形式
3.artifactId:项目名称。
4.version:项目采用的版本号通常以三位数字表示(如 2.2.5)。若项目仍处于开发阶段,则在其后标注SNAPSHOT;若项目已稳定且已发布,则会附加RELEASE。
5.parent:用来声明要继承的父工程的 pom 配置。
6.packaging:应用打包的不同格式,默认采用 jar 格式。常见用于将 Java 程序打包为 jar 文件,而 Web 应用程序则通常被配置为 war 格式。
7.properties:用来定义项目中一些配置,例如编码格式等。
在 Maven 项目的构建过程中,我们需要的 jar 包称为依赖项。通过指定 dependencies 标签中的内容来配置这些依赖项。每个依赖项的配置由 groupId、artifactId 和 version 这三个字段组成。其中 groupId 表示软件包所属的组织机构,artifactId 是软件包的独特标识符,version 则表示软件包的具体版本。
9.modules:在 Maven 多模块开发中,设置本模块和其他模块的关系。
10.build:构建过程主要涉及与项目相关联的各种配置项, 如指定编译插件所使用的JDK版本参数
4.3 依赖
在 Maven 项目的构建过程中,我们所需的 JAR 文件被称为 '依赖'。我们会在 dependencies 标签设置这些 '依赖' 的坐标后, Maven 自动地从本地仓库库中搜索并一旦发现符合条件的 JAR 文件, 就会 AUTOMATICAL引入到我们的构建环境中。
如果未能找到所需的依赖项,Maven会依据依赖项的位置从中央仓库将 jar 包移动至本地存储位置
依存关系应在 dependency 标签中进行标注,并涉及 groupId、artifactId 和 version 三个要素
<dependents) <dependentsOf) <group.id=mysql><artifact.id=mysql-connector-java><version号=8.0.27></version号> </artefact.id></group.id> </dependents
在技术上而言而言, 我们可以把依赖项(dependency)看作是JAR包的独特身份标识符。 在POM.xml文件中设置了这些依赖项,Maven会基于这些身份标识符先检查本地repository。 如果本地repository中没有找到对应的JAR包,它会前往中央仓库下载该JAR文件并将其保存到本地repository目录下。 然后将它整合到项目的构建过程中。



4.4 依赖的范围
我们在配置依赖时,其实还有一个依赖的范围 scope:
该依赖项由 groupId mysql 以及 artifactId mysql-connector-java 组成;其 groupId 为 mysql , artifactId 为 mysql-connector-java , version 为 8.0.27 , scope 设置为 compile;该构建模块将被编译
依赖的范围:compile、test、provided,默认是 compile。

例如junit依赖的范围即为test仅限于测试用例而servlet其依赖关系则为provided并不参与打包与部署这一原因是因为tomcat服务器已内置了servlet对应的jar包文件
4.5 坐标
Maven 将每一个 jar 包视为仓库中的独立项目进行管理,并通过由三个向量构成的坐标系来进行表示。这些坐标能够唯一标识出 Maven 项目在仓库中的位置。
坐标体系即由 groupId、artifactId 以及 version 组合而成的参数集合。其中 groupId、artifactId 和 version 负责确定项目在仓库中的位置路径;而 artifactId 和 version 则决定了 JAR 包文件的具体名称。
4.6 仓库
我们已经在pom.xml文件内设置了依赖项(Java应用程序包)的具体坐标位置,在这种情况下,Maven系统就能够自动地将这个Java应用程序包加载至项目环境中去,而它是从哪里获取了这个Java应用程序包呢?答案就是:Maven系统本身的仓库.
我们都知道仓库是用来存放东西的,那 Maven 仓库用来存放什么?jar 包。
根据仓库存储的位置,我们把 Maven 仓库分为本地仓库和远程仓库。
本地仓库:即是指将 jar 包安装到你的电脑上某个特定的位置下;而 Maven 的默认设置会将 jar 包安装到 C 盘的 .m2\repository 目录中。
远程仓库: 远程仓库又分为中央仓库、中央仓库的镜像、私服。
中央仓库存储了所有通用的 jar 包,并为所有程序员提供了便捷访问这些 jar 包的方式。作为 Maven 的默认远程存储库,在线获取资源方面处于领先地位。
中央仓库官网地址:
https://mvnrepository.com/ 复制代码
我们需要的所有的依赖都能在上面找到:

该系统的缓存中心由分布在不同地区的多个数据中心构成。这些数据中心负责将大量数据存储在亚洲、欧洲及其他地区,并以此来缓解中央缓存系统的负载压力。通过这种方式能够优化整体性能并提高响应速度。对于处于特定地区的用户而言本地数据中心会优先处理他们的请求从而减少延迟问题。其中一项案例是我们部署了阿里云 Maven 仓库存储中心作为其中一部分缓存资源以进一步提升系统效率
私服: 在局域网环境中部署的服务器,一般公司中会使用私服。

4.7 Maven 生命周期
Maven的构建过程:其核心流程包括清除旧版本、构建项目的依赖关系、执行单元测试和集成测试步骤、生成详细的错误日志和分析报告信息、生成可执行文件和JAR包文件,并完成应用的部署和环境配置任务。
5. Maven 常用设置
5.1 定义全局变量
在 properties 中定义全局变量后,在使用 ${variable_name} 进行统一配置时,默认会同步设置所有相关坐标。例如:
5.2 指定资源位置
所有位于src目录中的Java源文件会在comile阶段和test-comiple阶段分别进行编译;然而,在这两个目录中的其他非目标文件则会被跳过;如果希望将位于src目录下的非目标文件包含到最终打包生成的JAR包中,则必须明确指定这些资源的位置路径。
我们需要在 build 标签中指定那个资源的位置:
构建模块在资源管理下创建了两个关键组件:一个是用于扫描位于该位置下的.properties文件的集合;另一个是用于扫描.xml文件的集合。
6. Maven 管理多模块应用
通常会将一个项目分割为若干模块进行管理。其中 common 模块主要包括工具类以及常量信息等基础组件;而 service 模块主要用于业务处理;web 模块则负责整个系统的前端展示与交互操作。
Maven 可以很方便地帮我们维护不同模块之间的关系。
6.1 使用 Maven 创建多模块项目
创建 Maven 父工程 sms
File -> new -> Module -> Maven


删除父工程 src 目录,pom 文件打包方式改为 pom

创建子工程 sms-web
File -> new -> Module -> Maven


创建子工程 sms-service
File -> new -> Module -> Maven


创建子工程 sms-dao
File -> new -> Module -> Maven


创建子工程 sms-model
File -> new -> Module -> Maven


创建子工程 sms-common
File -> new -> Module -> Maven


父工程 pom 文件:

6.2 引入依赖
1. 模块之间的依赖:
众所周知,在依赖传递机制中,如果一个模块(如B)引入了另一个模块(如A),而另一个不同的模块(如C)又引入了前者(如B),那么后者(即C)实际上也间接地包含了或依赖于前者(即A)。
在项目环境中,我们可以观察到 service 需要依赖于 dao 的存在。这些关键组件包括 model 实体类作为基础架构。其中 dao 和 service 都需要用到 common 这一核心组件。尽管如此,在项目架构中我们无法为这三个组件中的每一个都增加 model 的额外依赖关系;然而,在服务层(如 dao 和 service)中添加 common 这一公共组件则是可行的。
基于依赖的传递特性,在 common 模块中为 model 类型提供必要的依存关系;同时为 DAO 模块指定 common 类型作为必要参数;此外,在 service 层面整合 DAO 相关功能,并将其作为服务输入;最后,在 controller 层次上合理配置 service 依存项以确保完整的系统架构设计

sms-common 的 pom.xml:

sms-dao 的 pom.xml:

sms-service 的 pom.xml:

sms-web 的 pom.xml:

然后再用 Maven 工具打包、安装之后,各模块之间就可以相互调用了。

2. 第三方依赖:
通常,在父工程的pom.xml文件中我们会配置dependencyManagement标签以管理依赖版本。当子模块需要引用该依赖时,在其dependencies标签中进行添加即可完成配置。

从图中可以看到,在查看相关资料时发现该功能无法实现真正的引用。
如果 module named sms-web 需要引用 commons-io 库,在它的 pom.xml 文件中的 dependencies 属性中添加该库的位置信息即可。

由于在父模块中利用 properties 标签明确了依赖的版本信息, 因此子模块无需额外添加版本号以实现统一管理
