写在前面的话,该文档是本人在学习 Maven 过程中学习笔记,所以在这里不再重复讲 Maven 的演进历程等等各种背景问题。只是单纯的记录一下自己在学习过程中遇到的各种问题,或者说是各个阶段中,遇到的各种问题,是怎么解决的。很多同学可能会因为和我的系统不一致、ide 版本不一致、maven 版本不一致而出现各种问题。这里我说一下,请自行百度。要知道这只是一个学习笔记。
Maven 快速入门
既然是快速入门肯定要从部署开始讲起
Windows 环境上安装 Maven
Maven 依赖于 JDK ,如果想要安装 Maven 必须在本地已经安装了 JDK,我手头的开放电脑有一台 Windows10、一台 iMac,所以这里我简单分享一下在这两个系统上如何安装 JDK 和 Maven
Windows 环境下部署 JDK
- 首先第一步肯定是去下载jdk,直到我写这篇学习笔记位置,jdk 已经更新到了 12 版本,但是由于我们的服务器上还是用的 jdk1.8,为了保证一致性,我这里也是安装 1.8。其实我相信绝大部分公司用的也是 jdk1.8。下载地址:jdk1.8下载地址。点击选择
Accept License Agreement
后,我的电脑是 Windows10 64 位,所以我选择Windows x64。点击下载即可。 - 双击下载完成的 jdk 安装包,然后执行安装操作,制定 jdk 和 jre 的安装路径,我个人是直接安装在了 c 盘的默认路径下。
- 配置环境变量,右键我的电脑选择属性,然后选择高级系统设置选择环境变量设置。
- 新建一个系统变量命名为 JAVA_HOME,变量值设置为刚才安装 jdk 的路径,点击确定。
- 在 Path 中新增一个路径,值为%JAVA_HOME%\bin,点击确定按钮
- 使用 win+r 呼出运行界面,输入 cmd ,呼出操作cmd.exe 操作页面。输入 java -version 如果有正确的返回结果,返回结果中至少包含
java version "1.8.***"
字样,则说明安装成功了。 - 关闭 cmd 操作页面。如果不关闭的话,等配置完 mvn 之后也需要关闭再重新开一个,容易出现明明配置已经配置上了但是找不到这个命令的情况。
好了,到目前为止 jdk 已经部署成功。
Windows 环境下部署 Maven
- 不用想,第一步肯定还是去下载。maven 官网下载页面。这里因为大家用的 maven 版本肯定不一样,我直接把官网粘贴出来,可以在这个页面上选择要下载的版本。需要下载的朋友,在下方 Link'中选择 apache-maven-版本号-bin.zip。这个是 Windows 版本的
- 下载下来的是一个 zip 文件,双击打开,随便你解压什么位置。只要在你本机而且你自己能找到就可以了。
- 配置环境变量,右键我的电脑选择属性,然后选择高级系统设置选择环境变量设置。
- 新建一个环境变量 M2_HOME,变量值设置为你maven 所在地址。包含 maven 本身文件夹
- 这里补充一下,前面说过了 Maven 也是基于 jdk 的,所以部分时候也需要设置的他的堆内存大小,这个看情况,不设置也行,这里简单说一下我是怎么设置的。新增一个环境变量 MAVEN_OPTS,值设置为-Xms=128m -Xmx=521m
- 在 Path 中新增%M2_HOME%/bin
- 呼出运行页面执行 cmd,运行 mvn -v,如果可以正确打印出 maven 版本信息就是对的
- 关闭 cmd 窗口
Mac 环境上安装 Maven
Mac 上部署 jdk
下载和 Windows 系统上差不多,但是选择的下载文件不是 Windows X86 了,而是Mac OS X
部署到某个位置
执行 vim .base_profile
编辑内容为
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH:. CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export JAVA_HOME export PATH export CLASSPATH
:wq 保存并推出后执行source .bash_profile 使其生效,执行 java -version,如果可以正确返回 jdk 版本号,则说明安装成功
Mac 上部署 Maven
下载和 Windows 系统上差不多,但是选择的下载文件是apache-maven-3.6.3-bin.tar.gz
部署到某个位置
执行 vim .base_profile
新增内容为
export M2_HOME=/Users/qiqi/Jason/software/apache-maven-3.6.1 export PATH=$PATH:$M2_HOME/bin
:wq 保存并推出后执行source .bash_profile 使其生效,执行 mvn -v,如果可以正确返回maven版本号,则说明安装成功
如果想要设置其内容使用大小和 Windows 命令是一样的。这里不再重复了
这里简单提一下,如果你在使用 vim 修改文件的时候,不小心搞坏了,我建议直接放弃保存重新修改。放弃本次编辑并推出的命令是:q!
Maven 的体系结构
Maven 安装之后是怎么运行的?或者是 Maven 是怎么帮助我们拉去代码的。这里分享一张图片。
我这里简单解释一下,我们的 maven 肯定是部署在自己的电脑上的嘛。然后 maven 有自己的 setting.xml 文件,里面默认是没有声明远程仓库的地址的。但是他仍然可以从远程仓库中获取jar 包,这是因为 M2_HOME/lib/下的 maven-model-bulider jar 包中有一个超级 pom,这里声明了 Maven 中的中央仓库地址。说到这里,那我们再简单来说说这种情况下,我们拉去包的时候,maven 体系结构都干了什么。
- 解析 setting.xml 中的配置文件
- 解析项目中的 pom.xml 查看需要哪些依赖
- 去本地 maven 仓库中查看这些依赖的 jar 包是否存在,如果不存在则去远程仓库拉取
- 将拉取下来的jar 包保存到本地依赖中方便下次使用
这里再多说一嘴,由于Maven 的这个远程仓库是部署在国外的,所以我们在国内访问起来特别费劲,速度特别慢。所以大部分软件工程师会再不使用私服的前提下(因为私服一般都会自动帮你配置好国内的中央镜像仓库访问地址)直接只用国内的镜像仓库,比如 aliyun 的镜像仓库。可以再 setting.xml 文件中mirrors 元素下新增
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
依赖管理
坐标
什么是坐标
简单来说就是 Maven 通过给定的坐标地址可以从仓库中唯一的获取的地址。
Maven 中坐标的主要组成部分
Maven 中的坐标主要是由四个部分组成的 groupId artifactId version packaging 。
简单解释这四个部分
名称 | 说明 |
---|---|
groupId | 声明当前 maven 隶属的项目 |
artifactId | 声明实际项目的模块名称 |
version | 声明版本 |
packaging | 声明该项目的打包方式(pom/jar/war,默认为jar) |
classifier | 声明统一 POM 构建的不同内容的构建 |
groupId、artifactId、version简称为GAV。
classifier这个用的比较少,所以这里特别说明一下,有些 jar 包的配置是又不同组成部分的,比如说源代码、javadoc 、甚至支持不同的 jdk 版本等等,这里我们举一个最简单的例子来看一下,假设我现在需要引用 net.sf.json 包。
如果我想要的是 jdk15 版本的,我可以这么声明。
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15</classifier>
</dependency>
去哪里获取 Maven 的坐标
方法有两个,第一个就是对去对应的官网上找,大的框架一般都有自己的官方网站吗,而官方网站上通常都会声明其 Maven 坐标地址。
而如果你引用的 jar 没有官方网站,你可以去 maven 坐标查询网站 自行搜索关键词查找。
依赖管理机制
依赖范围
Maven 使用scope
用来控制依赖和编译、测试、运行的 classpath 的关系。具体的依赖包含以下四种:
- compile:默认选项,对编译、测试、运行三种 classpath 都有效
- test:测试依赖范围,只对测试 classpath 有效,比如 junit
- provided:对于编译、测试 classpath 有效,但是对运行无效,因为容器已经提供,比如 servlet-api
- runtime:运行时提供,比如 jdbc 驱动
- system:系统范围,自定义构件,指定systemPath;跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
- import:只使用在
中,表示从其它的pom中导入dependency的配置。