Maven 实战

本文已收录至 GitHub,推荐阅读 👉 Java随想录
微信公众号:Java 随想录
Maven 实战
一、Maven 介绍
1.1 现存问题
jar 包问题
jar 包需要在本地保存,而且在使用的时候需要将 jar 复制到项目中,再 build 才可以生效。
jar 包的体量不小,一个项目中可能需要上百的 jar 的支持,这样一个项目就太大了。
如果 jar 包的版本需要升级,需要重新去搜集新版本的 jar 包,重新去 build,时间成本太高了。
做一些功能时,可能需要因为几个,甚至十几个 jar 包,才能完成一个功能,都需要自己维护,甚至记住。
项目结构的问题
之前开发工具很多,有 Eclipse,MyEclipse,IDEA,VSCode 等等……不同的开发工具的项目的结构会有一些不同,多人协同开发时,就会造成冲突,甚至还需要统一开发工具。
整体项目的生命流程
整个项目从立项开发,到最后的发布上线到生产环境,没有一套统一的流程来控制。
1.2 Maven
Maven 可以帮助我们更好地去管理 jar 包,只需要指定好 jar 的一些基本的标识,就可以让 jar 包支持我们的项目。而且 Maven 可以帮助咱们导入一个 jar 包后,自动将和它绑定好的其他 jar 包引入。
Maven 可以提供一个统一的项目结构。
Maven 也对整体项目的生命周期有响应的管理,从开始的编译、测试、打包、部署等操作,都提供了相应的支持。
Maven 还提供了分模块开发的功能。
Maven 是 apache 组织的一个顶级开源项目。 http://maven.apache.org
二、Maven 安装 &环境变量配置
2.1 Maven 的安装
首先下载 Maven,直接去官网即可
在点击 Download 之后,需要注意看一下对 JDK 版本的支持。
Maven 需要 JDK 的环境变量支持,一定要看一下自己又没有设置上 JAVA_HOME

需要根据自己的环境变量,下载对应的压缩包。
Linux、Mac 选择.tar.gz 的压缩包
Windows 选择 zip 的压缩包

下载好之后,得到一个压缩包。
解压的目录最好没有任何的中文和空格等特殊字符。推荐放到磁盘的根目录下即可。

bin:含有 mvn 运行的脚本。
boot:含有类加载器框架,Maven 使用这个框架来加载自己的类库。
conf:含有非常核心的 settings.xml 文件。
lib:含有 Maven 运行时需要的一些类库。
2.2 Maven 的环境变量的配置
首先配置 Maven 的环境变量前,必须先查看一下 JDK 环境变量配置。

其次,查看一下前面说过的 JAVA_HOME。
上述两点都 ok 的话,直接开始配置环境变量
配置 MAVEN_HOME

配置到 path

配置完毕后,记得重新打开一下 cmd 窗口。别直接在之前的 cmd 窗口测试。
在 cmd 窗口执行 mvn -v

Ps:常见错误,没有配置正确的 JAVA_HOME

三、仓库 &settings.xml 配置(重要)
3.1 仓库
Maven 可以帮助咱们管理 jar 文件,但是,jar 包是需要从网上下载下来的。
仓库很多,有官方的中央仓库,还有国内公司的仓库,还有公司内部会搭建的私服

咱们后面需要配置好国内公司的一些仓库。
3.2 settings.xml 配置(重要)
在 MAVEN_HOME 目录下,有一个 conf 目录。在 conf 目录下就有需要修改的 settings.xml 文件。
需要修改三点内容
3.2.1 本地仓库地址
默认情况下,本地仓库在 C 盘。
Default: ${user.home}/.m2/repository
根据配置文件中的注释,默认是仍在用户目录下的.m2 目录下的 repository 目录中。
这个本地仓库会随着项目越来越多,这个仓库也会越来越大。可能会占用 10 多个 G,甚至更多。
所以推荐放在系统盘之外。(如果就 C 盘,那就用默认的吧…………)

3.2.2 配置阿里云/华为云……仓库
配置阿里云仓库

华为云的仓库地址:https://repo.huaweicloud.com/repository/maven/
3.2.3 JDK 编译版本配置
Maven 默认采用 JDK1.5 的编译方式去编译项目。为了让 Maven 支持现在 JDK 的编译版本,可以指定一下现在采用 JDK1.8

四、IDEA 配置 Maven
先看老版本的,再看新版本的!!!
4.1 2019.1.3 IDEA 配置 Maven
打开 IDEA 的初始窗口

右下角的 Configure 的位置打开 settings,点开后,在左上角可以看到是 Settings for New Projects

因为 IDEA 版本的原因,对 Maven 的版本也是有要求的。
比如现在的 2019.1.3 的 IDEA 版本,无法支撑 3.6.1 以上的 Maven 版本

一定要记得,点击 Apply,然后 ok,确认生效。
4.2 2024.1 IDEA 配置 Maven
首先一定要记住,选择 Settings for new projects



五、IDEA 构建 Maven 项目
先看老版本的,再看新版本的!!!
5.1 2019.1.3 IDEA 构建 Maven 项目
点击 Create New Project

next 后,指定当前项目的三围,包名,项目名,版本号

指定好项目名和存放地址。这里对存放地址修改一下就 ok。

指定好之后,点击 Finish 即可。

进来后,可以看到右下角的进度条,在下载一些 Maven 必要的插件
在下载插件时,可能需要一定的时间,等插件下载好,为了确认咱们阿里云私服的配置是否生效,随便复制下面内容到当前位置。 一定一定一定记得点击右下角的 import Changes

快速地点击右下角的进度条,查看下载的链接地址,确认一下是否是阿里云的地址

再次查看右侧的 Maven 栏,确认 profiles 中的 JDK1.8 编译版本已经生效

最后查看完毕后,要对 Maven 项目的目录结构有个了解

5.2 2014.1 IDEA 构建 Maven 项目

5.3 IDEA 构建 Maven 的 Web 项目
这个新老版本是一致的!!!
这里是先构建 Maven 的基础项目,然后将基础项目修改为 Web 项目。

正常,构建的基础 maven 项目,打包的方式是 jar 文件。需要将当前 web 项目的打包方式修改为 war 的形式。
需要修改 pom.xml 文件指定打包方式。
默认情况下,这个 packaging 是 jar 的打包形式。需要指定好 war 的形式,一定一定一定记得 import Changes

然后选中项目,点击左上角的 file,选择 Project Structure


选择左侧导航栏中的 facets 选项,如果你的 Facets 界面没有这个 Web,说明之前的 war 没配置好!!

然后点击右上角的+,追加一个 web.xml 文件,记得一定要放到 webapp 资源目录下

点击 ok,就会自动生成 webapp 目录,以及目录下的 web.xml 文件

六、导入依赖 jar(重要)
创建好 Maven 项目之后,需要导入具体的 jar 包时,要通过 坐标 导入
每个 jar 都需要三个内容形成一个唯一的坐标,需要 groupId + artifactId + version 导入一个具体的 jar。
在 maven 项目中,只需要导入配置的坐标,Maven 便会自动地去网上下载 jar 文件,并且添加到项目中。
当需要使用某个 jar 时,知道大概的名字,但是不会背下来具体的坐标信息,可以去一个地方搜索
可以去这个地址搜索具体的 jar 包坐标

进入具体的依赖内部后,选择对应的版本

找到需要导入的 dependency

复制好之后,扔到项目的 pom.xml 文件中

如果本地仓库出现了.lastUpdated 后缀的文件,可能有两个情况
这个坐标的 jar 文件不存在
因为网络原因下载失败了
这种.lastUpdated 后缀的文件,会导致后续依赖下载失败,记得如果出现了依赖失败,检查坐标都没问题,并且也是走阿里云或者华为云去下载的,依然失败。记得去本地仓库看一下,是不是有.lastUpdated 后缀的文件导致无法下载成功!
七、依赖的作用域
所谓的依赖作用域就是当前这个 jar 文件在什么情况下,项目会使用到。
这个所谓的情况,可以分成三点来聊:
编译阶段
测试阶段
运行阶段
Maven 中给予依赖五种作用域:
compile(默认作用域):编译,测试,运行都会提供当前依赖的功能
provided:编译,测试会提供当前依赖的功能。 一般 Servlet,JSP 会涉及。
runtime:测试,运行会提供当前依赖的功能。一般 MySQL 会涉及。
test:测试会提供当前依赖的功能。
system:不是在什么情况下用,这个比较特殊,是将一些本地仓库没有的 jar 文件,引入到当前项目。
system,不推荐用,哪怕一些依赖,本地仓库无法下载,也别用 system 去引入。这种引入方式会导致后期打包还是更换了环境之后,无法使用。(后面咱们会根据 maven 的命令,可以将本地的 jar 包安装到本地仓库)
搞定后,本地仓库可以看到 install 的 jar 文件和路径

然后就可以在项目中引用了。
八、依赖冲突
首先,咱们要先了解一下 Maven 依赖的传递特性。
当咱们导入一个 jar 包后,如果这个 jar 为了完成一些功能,还需要其他的 jar 的功能。
比如有 A,有 B,其中 A 依赖了 B。
咱们只需要导入 A 包,B 会自动被依赖过来。优点大大的:
不需要刻意的去记导入 A 之后,还需要导入什么其他的依赖。
关于某个版本的 A 需要哪个版本的 B 也不需要关注。
上面是优点,但是也存在着一些问题。
当前项目 -> A -> B(1.0.0)
当前项目 -> C -> B(2.0.0)
此时,当前项目会出现相同的依赖,有两个,但是版本不一样,此时就会产生依赖冲突问题。
一般依赖冲突会在启动或者测试项目时,直接给你甩异常。而且这个依赖不太好处理。需要解决这种依赖冲突。
8.1 就近原则

明显,当前项目通过 D 依赖 C 的路径最近,基于就近原则,会使用 2.0.0 的版本

8.2 优先声明原则
当出现依赖传递导致相同 jar 包版本不一致时,此时会根据优先声明原则来决定使用谁。


如果是你主动导入的依赖,此时会根据你最后引用的版本决定


8.3 手动排除依赖
可以手动的形式,在引入 A 依赖时,将 B 依赖中 A 依赖排除掉


8.4 声明依赖版本
可以通过 dependencyManagement 标签,提前声明依赖的版本。
dependencyManagement 标签只会声明版本,不会将依赖导入,导入依赖依然需要借助 dependencies
配置完下面的内容后,再导入 spring-beans、spring-core 无论什么方式,都使用 dependencyManagement 中声明的版本。
如果前面已经声明好了依赖的版本。
但是你在 pom.xml 文件中,直接引入了一个具体的版本的依赖,和 dependencyManagement 不一致,那么会使用你指定好的版本。这种依赖传递的版本会严格遵循 dependencyManagement。
其次,如果基于 dependencyManagement 声明好了版本,在 dependencies 中导入依赖时,是可以不写版本号的,可以直接基于 dependencyManagement 中的版本导入。

九、Maven 指令
Maven 为整个项目生命周期的各个阶段,提供了各种各样的指令。
先了解常用的几个:
compile:这里是将 main 目录下的内容编译,生成一个 target 目录,将编译后的内容全部放到 target 目录下,java 和 resources 都可以称为 classpath,因为编译后的内容都是放在 classes 目录下的。

clean:就是将编译后的内容全部清除掉。
test:测试会优先进行编译,并且会针对 test 目录下以 Test 结尾的类中追加了 @Test 注解的方法运行测试,如果报错,控制台会有显示。直接 Build 失败。

package:将项目进行打包,但是打包会经历 compile 以及 test,并且成功后,才会将项目打包成具体的 jar 或者是 war。打包后的具体文件,会存放在 target 目录下。项目打包无法跳过编译过程的,但是可以跳过测试的过程,需要自行敲命令


install:将当前项目做好编译,测试,打包,并且将项目安装到本地仓库。如果安装到本地仓库的是一个 jar 包,其他项目就可以将这个 jar 依赖过来使用。!


十、聚合工程
在项目打包的方式中,前面聊过 jar,还有 war 的形式。
除此之外,还有一个打包的形式,叫做 pom。pom 就是所谓的聚合工程。

构建最外层的电商聚合工程,聚合工程不需要写任何的业务代码,它的目的就是管理其他的子工程

构建好聚合工程后,可以再构建子工程,流程如下。





好处是可以在聚合工程内去管理依赖的版本。同时可以基于聚合工程做统一的多个项目的打包或者其他操作。而且拆分模块去写项目。
十一、Maven 私服
11.1 Maven 私服的概念
私服是搭建在局域网的一种特殊的远程仓库,目的是代理远程仓库,让下载依赖的效率更高。
有了私服之后,使用 Maven 需要下载依赖时,直接请求私服下载依赖,将私服中的依赖下载到本地仓库中。如果私服中没有具体依赖,私服会去外部的远程仓库下载。
私服可以解决在业务做开发时,有一些内部的依赖,是中央仓库没有提供的,是公司开发人员自行封装的一些依赖。可以将公司自研的一些框架和依赖上传到私服中,让公司内部人员可以通过私服将这种依赖下载到本地仓库。

搭建私服的方式非常多,Apache Archiva,Sonatype Nexus。 一般都会采用后者。
11.2 搭建 Nexus 私服
去官网下载最新的安装包。
但是在官网想找到 Download 挺麻烦的,下载的话,直接进入到下面这个地址
https://help.sonatype.com/en/download.html

下载完毕是一个 zip 的压缩包,最好解压到非系统盘的位置,路径不要带 中文和空格 !!!!
解压后,有两个目录

进入到 nexus-3.67.1-01 目录下,再进入 bin 目录下。

启动时,需要基于 doc 窗口去运行 Nexus 私服,但是一定要以 超级管理员 的身份打开 cmd。


在 bin 目录下执行指定,访问外网慢的话,可能需要至少 9~10 分钟左右甚至更多。

启动成功后,直接访问 http://localhost:8081/
进入首页后,需要加载一小会,可以访问到首页,第一个要做的事情是登录

登录即可,默认用户名是 admin,密码在下面图中的文件里

登录成功后,第二步需要重新设置密码

设置私服下载依赖的权限信息

关注前四个即可

11.3 Nexus 私服配置 &下载依赖

将私服仓库的代理,设置为国内的仓库镜像源


配置完,拉到最下面,记得 Save 保存一下。
接下来配置好私服的地址,让项目基于私服下载依赖



因为初始化 Nexus 时,选择的是下载依赖不需要认证信息。
如果选择的是需要,要如何配置。

11.4 上传依赖到私服
首先在 Maven 私服的位置,找到 release 和 snapshot 的仓库地址


然后在 pom.xml 文件中配置相应的信息

准备好之后,直接在项目右侧,点击 deploy 上传当前项目的 jar 到私服

上传成功后,可以在私服中找到

其他的项目在配置没问题的情况下,就可以使用私服中的各种依赖了。
评论