一小时速成Maven
maven简介
pom.xml
定义了项目的配置、依赖、插件、以及构建的过程
Maven仓库
就是存放jiar包的地方,按照作用范围可以分为
本地仓库
就是电脑上的本地目录,默认在
一定要是一个没有中文的路径下。
远程仓库
- 一般是一个公司或者组织内部搭建的一个仓库,用来给内部的项目提供统一的依赖管理,避免jar包的重复下载
- 也可以通过中央仓库下载,是Maven官方维护的一个仓库 ,开源jar包都可以在这里找到
私服
maven安装和下载
Maven官网:https://maven.apache.org/
Maven下载地址:https://maven.apache.org/download.cgi
Nexus下载地址:https://help.sonatype.com/en/download.html
环境变量:
再在path里添加%MAVEN_HOME%\bin
在cmd里输入mvn -v出现就成功
然后找到
配置本地仓库
这个是maven的配置文件,先找到localRepository也就是本地仓库这个标签
1 | <!-- localRepository |
配置中央仓库
由于中央仓库的镜像都是在国外,所以需要一个国内的镜像加速下载
找到结束标签,将以下代码贴在其前面。
1 | <mirror> |
配置JDK属性
在
21就全改成21
1 | <profile> |
初识Maven
这是一个官方提供的快速开始模板创建指令
1 | mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false |
DgroupId:项目的组织id,一般是一个公司或者组织的唯一标识,比较常用的是域名反过来写
DartifactId:是项目的唯一标识,一般是项目的工程名字
DarchetypeArtifactId:maven为我们提供的各种不同类型的项目结构,保持默认就行
windows这几个配置信息需要加双引号,否则可能会报错
在idea中使用maven
打开idea2023,具体步骤如下:
- File—>settings—>Build,Execution,Depolyment—>Build Tools—>Maven
Maven home path(Maven工具所在的目录,bin的上一级目录): D:\apache-maven-3.9.6
勾选Override选项
User settings file(Maven工具的核心配置文件): D:\apache-maven-3.9.2\conf\settings.xml
Local repository(本地仓库,antlr的上一级目录): D:\repository(只要在settings.xml里面写上了本地的路径,就会自动配置)
- Maven—>Importing—>配置JDK的版本
- Runner
VM Options:-DarchetypeCatalog=internal (在新建模块时使用本地模板)
JRE: 17
- Repositories(刷新本地仓库的索引): 选中本地仓库,点Update
生命周期和插件
在右侧可以打开maven界面,在lifecycle里就是生命周期的插件
- 双击clean可以清理一些东西
- validate:用来验证项目是否正确,并且所有必要信息是可用的,如果有问题就会报错
- compile:用来编译原项目的代码,也就是把java的源码文件编译成字节码文件
- test就是单元测试,把单元测试用例都执行一遍
- package的作用是打包项目和其他的资源文件,生成一个jar包或者war包,但也会先编译执行一下看看有没有问题
- verify是用来验证打包的结果,也就是检查生成的jar包是否正确,不常用
- install把项目打包后生成的jar包或者war安装到本地仓库中,也就是配置文件里的那个路径
- site是用来生成项目的站点文档,生成一个静态网站
- deploy的作用是把打包的jar上传到远程仓库里,一般是发布到公司内部的私服仓库
maven的坐标和本地仓库的存储位置
maven的坐标是唯一标识,由三部分组成
1 | <goupId>junit</goupId>公司组织唯一标识 |
找到本地仓库的位置,然后会有junit,里面找到版本,再找到jar包,通过有个网站叫mvnrepository,里面收录了几乎所有的jar包,搜索想要的jar包,里面会有很多的版本,选择稳定的版本,在下方就可以看到jar包的坐标,点击一下就可以复制,然后粘贴到dependency标签里就可以了,如果爆红了就说明本地仓库没有这个jar包,只需要下载到这里就可以,方法是点击右上Maven的刷新按钮就可以了
依赖管理
依赖范围
scope标签可以 指定依赖的范围,常见的范围有compile,provided,runtime,test等等
compile就是指这个依赖是编译和运行时都需要的,也是默认范围可以省略不写,比如jdbc
provided是指定这个依赖是编译时需要但是运行时不需要的,比如经常使用的lombok
runtime是指定这个依赖是运行时需要的但编译时不需要,比如jdbc驱动的jar包
test指在测试的时候需要,在正式的业务代码中并不需要,也无法使用相关的类和方法,不会被打包到最终的jar包中,比如junit的测试框架
还有一个system的依赖范围是表示这个依赖是在本地的文件系统中提供的,如果依赖范围指定为system的话,必须要同时提供一个systempath的标签,用来指定这个依赖的具体位置,这个不推荐使用因为可移植性差
1
2
3<scope>system</scope>
<systemPath>${basedir}/lib/junit-3.8.1.jar</systemPath>
lib目录专门存放本地的jar包,然后加上junit这个包的文件全名import范围,一般是在dependdencyManagement中使用,作用是导入其他pom文件中的依赖,但是并不会实际引入依赖,只是用来管理依赖的版本号
添加依赖
在mvnrepository这个网站上搜索并找到这些依赖的坐标,再添加到pom.xml就可以了
依赖传递
直接写在pom.xml文件中的依赖叫做直接依赖,而当这个直接依赖又依赖了其他的jar包的时候,这些依赖的jar包被叫做间接依赖
maven会自动解析这些依赖关系,并下载相关jar包,只需要告诉maven直接依赖是什么,他会自动下载间接依赖,这就是依赖传递
另外只有依赖范围是compile的依赖才会被传递,其他的依赖范围是不会传递的
依赖冲突
依赖传递是非常方便的,但也会有个问题是依赖冲突,比如在项目里面添加了两个不同的依赖,它们又依赖了不同版本的同一个jar包的话,就会出现依赖冲突的问题,也就是到底应该使用哪一个版本的jar包的问题。
Maven会根据一定的规则来解决这个冲突
- 第一个规则是最短路径优先,也就是当依赖中出现相同的资源时,路径最短的那个依赖会被优先使用
- 第二个规则是先声明优先,也就是当路径层级相同时,在pom.xml里面配置顺序靠前的依赖,就会被优先使用
父子工程
新建一个maven,在pom.xml找到
1 | <packaging>jar</packaging> |
这也就是打包方式,可以是jar、war、pom,jar打包java,war打包web,pom不会生成jar和war包,而是用来管理其他子工程的
我们创建一个module文件,发现里面多了一个
1 | <parent> |
这个标签就是指定了它的父工程坐标
在
点击可以直接定位到父工程坐标,在父工程的pom里也多了一些这个,里面列出了所有子模块,我们叫做聚合,通过聚合的方式管理多个子模块,通过父工程一次性管理子模块,也可以点击父工程的m去定位到子模块
1 | <modules> |
手动解决依赖冲突
大概意思是不同的模块去使用相同的jar但版本号不一样,通过最短路径和先声明原则会被使用其中一个,而我们就想用不一样的版本就需要手动解决
第一种是在模块a里排除模块b的依赖,在模块a的pom.xml文件里面找到模块b的依赖,添加
1 | <exclusions> |
添加完后再重启一下看看
第二种是在模块b的pom文件里面找到那个jar包比如jdbc的依赖位置,添加
1 | <dependencies> |
依赖继承
在父工程添加一下公共依赖,这样子模块不需要添加依赖就可以继承,并且不会被依赖范围是compile以外的选项影响,就是不管怎么样都会被继承
但在实际开发中很少这样做,因为耦合性太高,就可以在父模块用依赖管理标签,这样子模块不会自动继承父模块的依赖了
1 | <dependencyManggement> |
然后再去子模块添加想要用的依赖
properties标签可以定义一些公共的属性,比如版本号,需要后续修改的话也是修改这里
然后在对应版本的位置写${spring.version}就可以使用
1 | <properties> |












