【JavaEE】Maven配置
一、Maven简介
什么是Maven?
Maven是一个基于项目对象模型(POM)构建的自动化工具,主要用于Java项目构建、依赖管理和项目信息管理
我理解的Maven:自动下载和管理“代码零件”(比如别人写好的工具包)。其实就是把别人写好的工具包拿过来自己使用,会比较方便
核心优势:
·标准化构建:通过pox.xml定义项目结构、依赖和构建流程
·依赖管理:自动下载和管理项目依赖(JAR包)
·多模块支持:轻松管理多模块项目
·插件机制:通过插件扩展功能(如编译、打包、测试)
二、创建Maven项目
社区版创建
我们这里以IDEA2021.3.2版本为例
1.新建项目
File->New->Project->Maven,勾选Create from archetype(可选),然后点击Next
注意:前提是项目SDK已正确配置(如JDK17或更高版本)
2.配置坐标
填写GroupId(组织标识)、ArtifactId(项目名)、Version(版本号)、Name(项目名)、Location(项目路径)
然后点击Finish即可创建成功
专业版创建
我们这里以IDEA2021.1版本为例
专业版与社区版在Maven项目创建上流程一致,但专业版支持更多框架集成(如Spring Boot),可直接选择框架模板生成项目。(我们后续在讲解Spring Boot时,就是使用的专业版)
三、Maven核心功能
接下来,我们结合项目,介绍Maven在项目开发中的作用
项目构建
Maven提供了标准的,跨平台(Linux、Windows、MacOS等)的自动化项目构建方式
当我们开发了一个项目之后,代码需要经过编译、测试、打包、发布等流程。每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得特别麻烦,而Maven给我们提供了一套简单的命令来完成项目的构建
Maven通过生命周期阶段(Lifecycle Phases)构建项目,常用命令:
·clean :清除target目录
·compile:编译源码
·test:运行单元测试
·package:打包项目(如JAR/WAR)
·install:安装到本地仓库
比如,点击package,就可以完成项目的打包操作
我们之前学习过一个java代码要经过以下过程,才能保证“Write once,Run anywhere”
打包就是把所有的class文件,全部放在一起,打成jar包或者war包
jar包和war包都是一种压缩文件
jar包就是把开发人员已经写好的一些代码进行打包。打好的jar包就可以引入到其他项目中,也可以直接使用这些jar包中的类和属性。另外也可以打成可执行jar包,这样的包就可以通过java -jar命令来执行
war包可以理解为是一个web项目,里面是项目的所有东西,通常用于网站
依赖管理
上面说到,Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不用手动去添加jar包
获取的jar包,其实就是依赖
pom.xml就是maven的配置文件,用以描述项目的各种信息
依赖配置
依赖:指当前项目运行所需要的jar包
比如前面学习JDBC时,我们需要手动下载mysql-connector-java的包,并且添加到项目中
如果使用Maven,我们只需要在pom.xml中引入mysql-connector-java的依赖就可以了
<dependencies><!--里面放置项目的依赖坐标,可以为多个-->
</dependencies>
1.在pom文件<dependencies>标签内,添加依赖坐标
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>4 <version>8.0.30</version>
</dependency>
2.点击刷新按钮,引入新加入的依赖jar包
后续有添加新的jar包,或者修改jar包版本,都需要通过该方式在项目中添加依赖
3.刷新完之后,就可以在项目中看到新加入的jar包了
依赖传递
定义:Maven会自动解析依赖的依赖(传递性依赖)。例如,引入spring-boot-starter-web会自动引入其依赖的Tomcat、Spring MVC等
早期我们没有使用maven时,向项目中添加依赖的jar包,需要把所有的jar包都复制到项目工程下。比如A依赖B,B依赖C,那么A项目引入B的同时,也需要引入C,如果我们手动管理这个依赖,这个过程就会比较麻烦,我们需要知道每个库都依赖哪些库,以及这些依赖之间的版本是如何关联的
比如我们要吃火锅,需要有锅,有调料,有食材,以及确认什么样的锅,什么样的食材
比如去医院看病,需要带上以往的病历,检查结果,处方等,并且要确认带的资料是正确的,如果日期错了,或者患者错了,带少了,就需要回去重新拿
但使用maven的话,就可以避免管理所需依赖的关系。我们只需要在pox文件中,定义直接依赖就可以了,由于maven的依赖具有传递性,所以会自动把所依赖的其他jar包也一起导入
比如吃火锅,现在我们可以点一个海底捞外卖,直接就把所有食材都送过来了,包括什么锅,配什么菜。
比如去医院看病,借助“互联网”,实现了信息共享,只需要带上身份证,以往的病历和检查结果就可以都看到了
如上图,项目A通过Maven引入JarA时,会自动引入Jar B和Jar C
Jar A和项目B就是项目A的直接依赖
Jar B和Jar C是项目A的间接依赖
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖排除
定义:指主动断开依赖的资源(被排除的资源无需指定版本)
比如,我下了一个快递单子,默认会有一个服务,就是快递小哥会上门取件,但是我刚好要出门,而且顺路经过站点,也可以选择自己送过去
当前阶段我们需要依赖的库并不多,但随着项目越来越复杂,库之间的依赖关系也会变得越来越复杂
如上图中,如果项目A不需要JarB,也可以通过排除依赖的方式来实现
通过<exclusions>排除特定传递性依赖:
xml
<dependency><groupId>com.example</groupId><artifactId>example-lib</artifactId><version>1.0</version><!--排除依赖--><exclusions><exclusion><groupId>unwanted-group</groupId><artifactId>unwanted-artifact</artifactId></exclusion></exclusions>
</dependency>
maven还有一些功能是依赖调解,可选依赖等
依赖调解:
当项目中的依赖存在依赖冲突时,例如:存在这样的依赖:
A->B->C->X(1.0)
A->D->X(2.0)
Maven会采用最短路径优先的原则去选择依赖,这里2的依赖路径更短,所以会选择X(2.0),当然我们也可以选择指定某个依赖的版本
四、Maven Help插件
当项目比较复杂时,我们就有jar包冲突的问题,这时候就需要去解决依赖冲突。解决冲突之前,需要先找到冲突,我们可以使用Maven Help插件来观察包和包之间的依赖关系
理解“插件”(plugin)
像IDEA这样的程序虽然功能强大,但是也无法做到面面俱到。对于一些特定场景的功能,开发者就可以开发一些“插件”。如果需要这个插件,就单独安装
插件就是对程序的一些特定场景,做出一些特定的功能的扩展
安装插件
File->Settings->Plugins->搜索“Maven Help”->找到对应插件,点击 Install安装即可,安装后需要重启下 idea,才能生效
安装之后,打开pom文件,就可以看到Jar包之间的依赖关系
也可以右键排除掉一些依赖。右键后选择Exclude即可
五、Maven仓库
我们通过短短几行代码,就把依赖jar包放在了项目里,具体是如何做的呢?
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>4 <version>8.0.30</version>
</dependency>
这个代码,我们称之为“坐标”,也就是唯一的
在Maven中,根据groupId(组织标识)、artifactId(项目名)、version(版本)的配置,来唯一识别一个jar包,缺一不可。
还记得不:我们在创建Maven项目时,就是用这三个参数配置坐标的
当我们在pom文件中配置完依赖之后,点击刷新,Maven会根据坐标(<dependency>)的配置,去仓库里寻找Jar包,并把她下载下来,添加到项目中。这个Jar包下载的地方就成为仓库
仓库:用于存储资源,管理各种Jar包
Maven仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(jar包、插件等)
Maven仓库分为两大类:本地仓库和远程仓库。其中远程仓库又分为中央仓库,私服和其他公共库
本地仓库
定义:自己计算机上的一个目录(用来存储jar包)
当项目中引入对应依赖的jar包后,首先会查找本地仓库中是否有对应的jar包
·如果有,则在项目中直接引用
·如果没有,则去中央仓库中下载对应的jar包到本地仓库
本地仓库地址可以通过Maven配置查看:
File->Settings->搜索maven->Local reposi的地址即为本地仓库
查看该仓库目录,可以看到该目录下有很多的jar(最开始是空的,随着Maven的使用,该仓库下文件会越来越多)
中央仓库
定义:Maven软件中内置一个远程仓库地址,就是中央仓库,服务于整个互联网。由Maven团队维护,全球唯一
仓库地址:https://repo1.maven.org/maven2/
我们可以看到仓库里的jar包,但是并不方便使用。
我们可以通过https://mvnrepository.com 这个网站来查询并下载
我们可以把自己写好的Jar包上传到中央仓库(具备一定的要求),也可以从中央仓库下载Jar包
查找Jar的坐标
1.访问https://mvnrepository.com
2.进行查找,比如mysql
3.选择要添加的Jar包版本
4.查看Jar包对应坐标
我们只需要复制后,到pom文件下,粘贴即可
私有服务器(私服)
私服:一般由公司团队搭建的私有仓库
私服属于某个公司,或者某个部门,往往需要一定权限
有了私服之后,Maven依赖下载的顺序又发生了变化
当Maven需要下载资源的时候
1.先从本地仓库获取,本地仓库存在,则直接返回
2.如果本地仓库没有,就从私服请求,私服存在该资源,就直接返回
3.如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在,就报错了
4.如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库里,再为Maven的下载请求提供服务
私服是很多人在使用的,所以只需要第一个使用者下载一次就可以了
Maven设置国内源
因为中央仓库在国外,所以下载起来会比较慢,所以咱们选择借助国内一些公开的远程仓库来下载资源
接下来介绍,如何设置国内源
配置当前项目Settings
File->Settings->搜索maven->找到User setting file
1.查看配置文件的地址,如上图所示,Maven配置文件地址为:D:\Maven\.m2\settings.xml
不同电脑设置的Maven路径不同
User settings file和Local repository可以修改设置为其他路径,但两个路径中不要有中文
2.配置国内源
Maven仓库默认在国外 https://mvnrepository.com/ ,国内使用时会比较慢,我们可以更换为阿里云的仓库,当然也可以选择别的仓库,我们这里参考:Maven 镜像地址大全 - 知乎
打开settings.xml(上述配置文件的地址),在mirrors节点上,添加内容如下:
settings.xml内的字符很多,我们下滑找到<!--mirrors ,然后把从 Maven 镜像地址大全 - 知乎 中复制的阿里云镜像地址添加到<!--mirrors 中即可
设置新项目的setting
上述配置的内容,只对当前项目生效,为了让后续新建的项目也生效,需要重新设置一下新项目的Settings
只需要保证:当前项目和新项目共用一个settings文件即可,所以新项目的设置,只需要确认一下settings文件的路径即可
步骤:File->New Projects Setup->Settings for New Projects
只需要新项目的User settings file和Local repository如下即可: