了解Java项目的管理工具——Maven
1、了解Maven
在推行Maven项目之前,一个大型项目的开发往往会遇到的以下的问题:
- 项目在不同机器上无法正常运行
- 项目在不同机器上无法正常打包
- 项目编译环境配置繁琐,难以给新开发成员讲解配置细节
- 自己项目的jar包该存储在哪里
- 重用性高的jar包会造成内存占用
- jar包在修改了bug后需要进行重新发布
为了解决上述的问题便推出了Maven项目,进行项目的统一管理。
1.1、Maven的介绍
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的项目管理软件。Maven除了程序构建能力出色之外,还提供高级项目管理工具,由于Maven的缺省构建有较强的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目。
1.2、Maven的功能
Maven的主要功能有以下两点:
- 依赖管理:jar包管理
- 项目构建:代码编译
1.3、Maven依赖管理的原理
Maven的依赖管理的原理涉及了三类存储jar包的仓库:
- 本地仓库
- 远程仓库
- 中央仓库
在一个项目中搜索jar包依赖时便是需要访问这三类仓库,访问的过程如下:
- 第一步:项目中pom.xml中添加依赖jar包,便会访问本地仓库寻找相应的依赖jar包,本地仓库中存在相应的jar包则直接返回项目,本地仓库中不存在相应的jar包,就会执行第二步。
- 第二步:如果在Maven中配置了远程仓库,则会访问远程仓库寻找相应的依赖jar包,远程仓库中存在jar包则先下载到本地仓库,最后再返回项目,远程仓库中不存在jar包,则会执行第三步;如果在Maven中没有配置远程仓库,那么就会执行第三步。
- 第三步:访问中央仓库,在中央仓库中如果存在相应的依赖jar包,则会把依赖jar包先下载到远程仓库(没有配置则无效),接着下载到本地仓库,最后再返回项目,如果在中央仓库中没有找到相应的依赖jar包则pom.xm文件中会报错。
以下是图示:
2、Maven的安装与配置
2.1、Maven的安装
进入Maven官网下载Maven软件包,官网链接:Maven下载官网,下载步骤如下:
这个是3.8版本的Maven,如果想要下载其它版本的Maven,可以进行以下操作:
我演示的是3.6.3版本Maven的下载,其他版本的步骤也是一样的,根据自己的需要进行其他版本的下载。
注意:在安装Maven之前,要先确认自己的电脑有没有安装和配置了JDK(最低版本1.8),没有则先进行JDK的安装和配置。Windows系统的JDK的安装和配置可以参考小编的这篇博客:“Java基础介绍”,macOS系统的JDK的安装和配置可以参考这位大佬的博文:“macOS下JDK11安装及环境变量配置总结”。
2.2、Maven的配置
下载好压缩包后将压缩包解压到任意文件夹中,注意解压路径不可以有中文。
解压好以后,需要进环境变量的配置,需要进入高级系统设置中进行配置:此电脑右键 —> 属性 —> 高级系统设置 —> 环境变量 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210411204945279.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyaWVuZF9Y,size_16,color_FFFFFF,t_70)
进入环境变量之后需要对两个变量进行配置:MAVEN_HOME和Path,如图所示:
MAVEN_HOME变量配置图:
Path变量配置图:
配置好以后进行验证进入命令行窗口输入:mvn -version,得到以下结果便是成功,不成功则检查环境变量是否配置正确。成功示意图:
2.3、修改Maven的本地仓库
Maven设置了自身的默认磁盘路径,我们可以通过修改setting.xml文件的内容来修改仓库路径。如图所示:
加上以下自定义的本地仓库的磁盘路径,便可以完成更改本地仓库了。
<localRepository>
E:\Maven3.6\repository <!--根据自己选择而定-->
</localRepository>
2.4、配置阿里云镜像仓库
配置阿里云镜像仓库的目的是:远程下载jar包的速度更快,因为默认的远程下载地址访问的是国外的服务器,下载速度非常慢,所以需要配置国内的服务器:阿里云镜像仓库。配置阿里云镜像仓库也是需要修改setting.xml文件的内容。如图所示:
加上以下阿里云镜像仓库的配置,便可以链接到阿里云镜像仓库了。
<!--注意一定要放在:<mirrors></mirrors> 这对标签之内-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
3、Maven的常用指令
3.1、mvn compile
执行 mvn compile命令,完成编译操作。执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。
3.2、mvn clean
执行 mvn clean命令,执行完毕后,会将target目录删除。
3.3、mvn test
执行 mvn test命令,完成单元测试操作。执行完毕后,会在target目录中生成三个文件夹:surefire、 surefire-reports(测试报告)、test-classes(测试的字节码文件)
3.4、mvn package
执行 mvn package命令,完成打包操作。执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war。
3.5、mvn install
执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用。
3.6、mvn clean compile
组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类。
3.7、mvn clean test
组合指令,先执行clean,再执行test,通常应用于测试环节。
3.8、mvn clean package
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前。该组合命令的执行过程如下:
- 清理————清空环境
- 编译————编译源码
- 测试————测试源码
- 打包————将编译的非测试类打包
3.9、mvn clean install
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前。该组合命令的执行过程如下:
- 清理————清空环境
- 编译————编译源码
- 测试————测试源码
- 打包————将编译的非测试类打包
- 部署————将打好的包发布到资源仓库中
4 、Maven坐标的概念
在Maven中坐标的作用是:确定唯一的jar包,便是pom.xml文件中需要书写的内容。Maven坐标的主要组成有三个部分:
- groupId——定义当前的Maven组织的名称
- artifactId——定义实际项目名称
- version——定义当前项目的当前版本或者是所依赖的jar包的版本
坐标在pom.xml中的编写格式如下:
<!--自己项目的坐标-->
<groupId>自己项目的Maven组织的名称(自定义)</groupId>
<artifactId>自己项目的实际项目名称(自定义)</artifactId>
<version>自己项目的当前项目的当前版本(默认:1.0-SNAPSHOT)</version>
5、Maven的依赖性和传递性
5.1、Maven的依赖性
在添加jar包依赖时会涉及到依赖性的问题,以下是测试类的jar包添加的格式,可以看到多了一个scope标签,该标签内的内容便是jar包的依赖性。
<!--jar包依赖添加格式-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
在scope标签内可以写入以下几种值:
- compile
- provided
- runtime
- test
- system——一般不用,会有兼容性冲突
compile表示的依赖范围是:编译范围,是默认的scope值,在工程环境的 classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。
provided表示的依赖范围是:容器或JDK已提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中 。最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
runtime表示的依赖范围是:一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。
test表示的依赖范围是:测试范围,一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等。
system表示的依赖范围是:系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径,所以该scope是不推荐的。如果是基于组织的,一般会建立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该scope的情况。
5.2、Maven的传递性
在添加jar包依赖时会出现依赖传递的现象,这种传递现象分为两种情况:
- 直接依赖
- 间接依赖
比如说:如果项目B中使用了A依赖,项目C中使用了B依赖,则称B是C的直接依赖,而称A是C的间接依赖。
5.3、Maven的依赖冲突
依赖冲突分为两种:
- 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)
- 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)
5.4、Maven的可选依赖
当发生依赖冲突是可以进行可选依赖的配置,作用是:配置jar包的依赖是否向下传递,在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false。格式如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
5.5、Maven的排除依赖
maven 的传递依赖能自动将间接依赖引入项目中来,这样极大地简化了项目中的依赖管理,但是有时候间接依赖的关联包可能因为版本或其他原因,并不是我们想要的版本,可以进行排除依赖。实现排除依赖的方法便是在直接依赖的配置里面添加exclusions和exclusion 标签对,指定要排除依赖的 groupId 和 artifactId 就行。注意:排除依赖包中所包含的依赖关系,不需要添加版本号。如下面代码所示。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
6、IDEA中搭建Maven项目
6.1、更改IDEA中的Maven版本
在使用IDEA编写Maven项目时,需要先更改IDEA中的Maven版本,因为IDEA会有默认版本的Maven,需要更改成自己本地的Maven。更改的步骤如图所示:
上面是进入了IDEA工程界面的操作,如果是在IDEA的欢迎界面的步骤如下:
6.2、搭建JavaSE类型的Maven项目
搭建JavaSE类型的Maven项目步骤如图所示:
或者是:
最后创建好的工程示意图如下:
6.3、搭建JavaWeb类型的Maven项目
在进行项目搭建之前需要进行runner相关的配置,配置步骤如下:
VM Options的内容如下:
-DarchetypeCatalog=internal
配置好runner之后,便可以进行搭建JavaWeb类型的Maven项目,搭建的步骤图如下:
最后创建好的工程示意图如下:
关于Maven的相关知识就介绍到这了,希望文章可以帮到你们,谢谢阅读。如果觉得文章写得不错,可以关注小编,我将会不定期更新关于Java方面的博文。