运行本篇中的代码:idea专业版或者idea社区版本(2021.1~2022.1.4)
用Maven构建项目和管理依赖
- 1. 初见maven
- 2. maven在网站项目中的应用
- 3. maven和idea的关系
- 4. maven的使用
- 4.1 项目构建
- 4.11 在idea创建maven项目
- 4.12 利用maven命令打包项目
- 4.2 依赖管理
- 4.21导入依赖
- 4.22 管理依赖:
- 依赖传递
- 用Maven Helper插件查看依赖关系
- 5. maven仓库
- 5.1 本地仓库
- 5.11 如何查看maven本地仓库的位置?
- 5.12 如何查找依赖在本地仓库中的位置?
- 5.2 远程仓库
- 5.21 中央仓库
- 在中央仓库中查找依赖坐标
- 5.22 国内源
- 设置国内源
- 5.23 私服
- 6 再看用maven导入依赖并解决报错:Dependency '依赖:依赖坐标' not found
1. 初见maven
maven的官方网站:https://maven.apache.org/index.html
maven的官方描述:
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
大白话理解官方描述就是:Apache Maven是一个软件项目管理工具。基于项目对象模型(POM)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档。
2. maven在网站项目中的应用
我们写个网站,只用到jdk里面的基础类库是远远不够的,还会用到各种各样的第三方库等等。想要在代码中直接调用第三方库的功能接口,就需要在项目中导入第三库包的依赖。
什么依赖?在一个开发过程项目中,需要用到的所有的外部资源都是依赖。
在一个网站项目中使用maven,maven可以助我们构建,打包项目;简化导依赖的过程;并且帮我们管理依赖。
(ps:maven在网站项目中主要有以上作用,maven在其他场景中还有很多其他功能!)
任何一个java程序,都可以用maven来管理!
3. maven和idea的关系
maven和idea是两个独立的东西,但是idea里面集成了maven。
什么意思呢,我们都用12306订过车票吧,12306是一个订车票系统,但是现在在12306里面还能点外卖。idea里面集成了maven,就相当于12306里面集成了一个外卖系统。
4. maven的使用
在网站项目开发中,maven有两个核心功能,分别是项目构建和管理依赖。
4.1 项目构建
4.11 在idea创建maven项目
由于idea社区版本(2021.1~2022.1.4)在创建maven项目的时候,存在一个不稳定复现的bug,也就是直接通过new创建maven项目,idea可能会卡死:
所以我们通过先Close Project->再New Project的方式创建maven项目。
项目创建成功后,idea的右侧会出现一个maven选项。
项目创建后,如果没有在idea右侧看到maven选项,先鼠标右键->然后在弹出的选择列表中选中AFS->OK。
maven项目创建成功后,会生成一系列的目录结构:
4.12 利用maven命令打包项目
当我们开发了一个项目后,代码需要经过编译,测试,打包,发布等流程。麻烦的是,只要修改代码,都要把上述流程再经历一遍,如果代码反复调试修改,这个流程也要反复进行。但是maven给我们提供了一套简单的命令来帮助我们进行上述流程。
以下都是maven命令:
clean命令:删除target 目录及内容
package命令:打包
install命令:发布包到本地
deploy命令:发布包到远程仓库
maven的package命令:打包。把java工程打成jar包,把web工程打成war包。
什么是jar包?什么是war包?jar包和war包都是一种压缩文件。打成jar包是把项目中的一些代码进行打包,打好的jar包可以引入到其他项目中,直接使用jar包中的类和属性。也可以打成可执行jar包,可执行jar包可以通过java -jar命令执行。打成war包是把项目中的所有东西进行打包,统称用于网站项目。
例如:把maven_demo1项目中的所有class文件打成jar包。
maven的clean命令:删除target 目录及内容。
4.2 依赖管理
依赖通常就是一个jar包。maven的主要功能就是帮我们简化导依赖的过程,并且帮我们管理依赖。
4.21导入依赖
在项目中导入依赖,如果不用maven的话,我们需要先下载jar包->然后手动添加jar包到项目中。
如何用maven导入依赖?
用maven构建项目后,项目中有一个pom.xml文件。pom.xml是Maven的配置文件,用于描述项目的各种信息。
用maven导入依赖,可以通过修改pom.xml文件的配置直接获取到jar包,然后自动下载到本地,并添加搭配项目中。所以我们只做一件事:根据具体需要,修改pom.xml文件的配置即可。
如何根据具体需要,修改pom.xml文件的配置项?导入哪个依赖,就在pom.xml文件内的dependencies双标签内添加该依赖的坐标。
什么是依赖的坐标?依赖在maven仓库中的位置。
不知道依赖坐标的情况下,如何得到要导入的依赖坐标?到maven中央仓库查询界面中搜索寻找该依赖->进一步得到依赖坐标。maven中央仓库查询界面:https://mvnrepository.com/。
<!-- pom.xml文件内没有看到dependencies双标签,就自己写一个-->
<dependencies>
<!--⾥⾯放置项⽬的依赖坐标, 可为多个 -->
</dependencies>
总结:如何用maven在项目中导入依赖?先在pom.xml文件内的dependencies双标签内添加具体的依赖坐标 ->然后点击刷新按钮。
例如,用maven在项目中导入mysql8.0依赖:
4.22 管理依赖:
用maven在项目中导入所需的依赖后,maven是如何帮我们管理依赖的呢?
依赖传递
在上面导mysql8.0.30依赖的时候,我们只在pom.xml文件中添加了mysql依赖的坐标,但是实际导入到项目中的依赖却有两个:
这是因为mysql依赖中还用到了protobuf依赖,maven帮我们导入mysql8.0.30依赖的时候,会自动把mysql.0.30依赖中用到的依赖也帮我们导入到项目中。
如果我们手动导入mysql依赖,意味着我们必须要清楚mysql依赖中用到了哪些依赖,这些依赖版本间又有什么联系,然后再把它们依次手动导入到项目中,显然这是非常麻烦的。
但是由于maven的依赖具有传递性,我们只需要导入直接依赖就行了。
什么是直接依赖?如图,项目A通过maven引入了两个依赖,分别是项目B和JarA。此时,项目B和JarA就是项目A的直接依赖。引入JarA依赖的时候,因为依赖传递,又自动引入了JarB和JarC,JarB和JarC就是项目A的间接依赖。
用Maven Helper插件查看依赖关系
什么是插件:一个插拔式的工具。这个工具把具体某个辅助功能集成在一起。用的时候通过连接就能用,不用的时候断开连接就用不了。比如耳机,U盘,一段代码等都可以理解成一个插件。
下载Maven Helper插件:
插件下载好以后点击ok,然后重启idea。
然后在pom.xml文件的Dependency Analyzer页就可以看到项目的依赖关系了。
5. maven仓库
maven仓库分为本地仓库和远程仓库,远程仓库又分为中央仓库,私有仓库(私服)和其他公开开库。
5.1 本地仓库
maven会在本地创建一个目录,这个目录就是本地仓库的位置。当我们用maven成功把jar包导入到项目中后,意味着在本地下载了这个jar包,并把它保存到在maven本地仓库中。
maven本地仓库本来是空的,随着maven的使用,该仓库下文件会越来越多。
5.11 如何查看maven本地仓库的位置?
5.12 如何查找依赖在本地仓库中的位置?
如果把仓库比喻成菜鸟驿站,那么仓库里存放的依赖就是包裹,依赖坐标就是包裹的取件码。
5.2 远程仓库
远程仓库中包括中央仓库,私有仓库(私服),其他公开库。
5.21 中央仓库
中央仓库中存放着最全的我们在开发过程中可能需要的依赖。maven中央仓库全球只有一个,由maven团队统一维护,服务于整个互联网。
maven中央仓库地址:https:/repo1.maven.org/maven2
maven中央仓库查询界面:https://mvnrepository.com/
查询界面中的依赖虽然具有一定的滞后性,但我们通常还是从查询界面中查询依赖坐标并下载依赖。
在中央仓库中查找依赖坐标
以查找mysql为例:
进入maven中央仓库查询界面:https://mvnrepository.com/,进行搜索查找
选择要添加的jar包版本
查看jar包对应坐标
5.22 国内源
国内源属于一种公开库。因为maven中央仓库在国外,国内访问时比较慢,为了在国内也能快速访问到资源,所以国内有些人/团队就搞了国内版本的中央仓库,内容和maven中央仓库几乎一样,而且也公开,这就是国内源。常见的国内源有阿里云仓库,华为仓库等。
设置国内源
如何使用国内源?为当前项目配置国内源->为新项目配置国内源。
国内源的配置文件是settings.xml,所以我们要在本地maven中找到这个文件。
以下是为我本机的当前项目配置阿里云仓库:
在idea中查找settings.xml文件在本机的位置,不同电脑中settings.xml文件路径不同,以我本机为例:
在文件资源管理器打开settings.xml文件,在mirrors节点上,添加内容如下:
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿⾥云公共仓库</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
如果在文件资源管理器对应路径下没有找到settings.xml文件,可以把别人已经配置好国内源的settings.xml文件直接cv到本机路径下。
以上完成了为本机的当前项目配置阿里云仓库。在之后的项目中,如果依然需要使用阿里云仓库,在新项目中确认一下settings文件的路径即可。
5.23 私服
一般由公司团队搭建的私有仓库。私服属于某个公司,或者某个部⻔,使用时往往需要⼀定权限。
如何使用私服,同使用国内源一样,也是通过settings.xml文件进行配置的。
6 再看用maven导入依赖并解决报错:Dependency ‘依赖:依赖坐标’ not found
从上文可以得知如何用maven在项目中导入依赖:先在pom.xml文件内的dependencies双标签内添加具体的依赖坐标 ->然后点击刷新按钮。
如果机器上能访问本地仓库,中央仓库(国内源),点击刷新按钮后,
maven会(自动)先去本地仓库中查找是否有依赖坐标对应的jar包,如果有,则(自动)导入到项目中。如果没有,则(自动)去中央仓库(/国内源)中下载对应的jar包到本地仓库,然后再(自动)导入到项目中。
如果机器上不但能访问本地仓库,中央仓库(国内源)还能访问私服的话,点击刷新按钮后,
maven会(自动)先去本地仓库中查找是否有依赖坐标对应的jar包,如果有,则(自动)导入到项目中。**如果本地仓库没有,就从私服请求,私服存在该资源,则(自动)导入到项目中。
**如果私服上不存在该资源,则从中央仓库(/国内源)下载,中央仓库不存在,就报错了。
如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库⾥,最后再为Maven的下载请求提供服务。
所以,当用maven导入依赖时,出现报错:Dependency ‘mysql:mysql-connector-java:8.0.32’ not found 的原因是,maven本地仓库(/私服)中不存在依赖mysql:mysql-connector-java:8.0.32,此时短暂的报错意味着maven正在从中央仓库中(或国内源)下载这个依赖到本地仓库,等待片刻后下载完成,报错也会自动消失。
等待片刻后,依赖mysql:mysql-connector-java:8.0.32成功导入到项目中。