1.为什么需要学习Maven?
:::info
①为了帮助我们管理 项目中的Jar包,如果要在项目中使用第三方包,那么就需要去下载jar包,再将jar包添加到当前项目的目录中,再去将jar包选择添加为当前项目的依赖
:::
:::danger
该方式的弊端:
1.寻找jar包: 官网网站提供的地址进行下载 -> 相对比较麻烦
解决: -> 提供一个中央的下载方式,所有第三方的jar都可以在该路径中下载
2.下载完成后需要在当前项目路径中创建目录,再添加到项目依赖中
-> 1.当创建的项目较多时,每个项目中都有存放依赖的目录 会导致项目的文件过大,依赖会重复保存
-> 2.当项目发送给其他开发者使用时,需要手动添加 jar 包到项目路径中 比较麻烦
解决方式: -> 提供一个本地当前开发环境(WIN)的仓库,所有的项目jar包,都可以通过某种方式直接使用该仓库中所有jar包
可以达到多个项目共享同一个 jar包
-> 可以提供一个 jar包 的识别路径,包括jar包的名称 版本 等信息 可以自动去外部的中央仓库进行下载
下载到本地当前开发环境(WIN)的仓库中 实现自动下载
-> 该方式可以和IDEA进行互通,作为IDEA中的一个插件,当项目打开后,该插件根据给定的jar包信息,自动进行识别
从本地开发环境中进行寻找(WIN),如果寻找不到,那么自动下载,寻找到,那么添加到当前IDEA中
:::
:::info
② 当一个大项目中包含有多个小项目,那么每个项目之间的Jar包管理,可能会存在有冲突问题
冲突问题:
当A子项目使用的Mysql版本是 5.1.49版本,但是在B子项目中使用的Mysql版本 8.1.12版本
可能两个版本的Jar包中对于Driver类路径不一样,那么后续代码运行过程中,对于的类加载不到
需要将多个版本进行统一
:::
上述问题: MAVEN都可以解决
2.依赖管理
jar之间的依赖关系,jar包管理问题统称为依赖管理
比如:对于Mysql来说,其内部也使用了其他的第三方Jar包 根据当前import关键字从其他jar包中获取所需要的类
3.Maven安装及配置
下载:
Maven – Download Apache Maven
下载时避免选择最新版本,Maven版本已提供教学安装包 apache-maven-3.5.2.zip
配置:
Maven配置
- 解压 apache-maven-3.5.2.zip 之后跳转目录层级,如下图所示:
-
配置远程仓库镜像
在conf/settings目录中的mirrors标签中配置阿里云镜像仓库:
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
- 配置本地仓库
本地仓库路径根据自己当前路径配置
<localRepository>D:\software\apache-maven-3.5.2\repo</localRepository>
- 配置环境变量
在当前系统环境变量中新建系统变量
- 配置Path路径
- 测试
idea配置
:::info
1.项目配置: 只在当前项目中有效 file -> settings
2.默认配置: 在所有当前idea创建的项目中,都使用该配置作为其默认配置
:::
默认配置步骤:
- 在Idea的欢迎页面选择:
- 配置IDEA中的Maven设置
创建Maven项目
点击创建新项目,参数选择如下:
创建后,第一次使用会下载插件,需要等待一段时间
插件功能解释
- clean 清除 是将所有编译后的target目录文件进行清除
- compile 编译 是将项目中所有代码进行编译,生成的文件保存在target目录中,代码有错误,则编译失败,同时编译时也会下载依赖
- test 测试 可以对代码进行运行测试
- package 打包 对当前项目所有代码进行编译,将编译后的文件按照包路径保存到到以.jar结尾的文件中
- install 安装 将当前项目进行编译,打包,再将jar包按照一定的目录层级保存到本地仓库中
:::warning
注意:功能按键出错了,日志内容解释如下
:::
jar包寻找路径
在本地仓库中,jar包按照一定的规则进行保存,规则如下:
Maven项目开发目录层级
项目创建好后,会自动生成一些目录层级,每个目录层级中保存的文件类型不一致,所以需要按规范使用目录
:::warning
注意:其中External Libraries 中保存了当前项目所添加的第三方依赖
:::
Maven项目添加外部依赖
注意:添加外部依赖需要在当前Pom文件中添加如下内容:
其中标签只能出现一次,在该标签中,每添加一个第三方依赖就编写一个的标签内容,标签内容由依赖的坐标(GAV)组成
坐标由g-a-v组成
[1]groupId:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
当依赖添加完成后,需要重载当前项目
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>
重载项目
重载项目的时机:
1.当Pom文件中内容被修改需要生效时
2.当前项目第一次打开时,如果没有自动加载依赖,那么需要重载项目,可以通过 External Libraries 查看依赖是否被加载成功
4.Maven依赖使用
junit依赖及Scope范围
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
junit依赖的作用:
可以在给定的类中 某个方法上添加一些测试的注释 可以直接运行代码
- scope:
- 用于限定其作用范围,当给定的是Test那么其范围只能在Test类型的目录中使用该依赖
- compile【默认值】:在main、test、Tomcat【服务器】下均有效
- provided:在main、test下均有效,Tomcat【服务器】无效
对于当前类中如果添加了Test注释标记,那么整个类都可以直接运行,运行时所有的Test标记的方法都会被执行
依赖继承
在大项目中创建子项目
注意:
①子项目可以继承父项目中的依赖,但是子项目中也可以添加对相同名称版本不同的依赖,根据就近原则,选择当前依赖最近的jar包版本
② 子项目之间默认是没有相互的依赖关系的,获取不到内部定义的类信息
③ 如果子项目之间存在由需求关系,那么可以在pom中添加其他子项目相关的依赖信息(GAV)并且添加后,需要再重载当前项目
④ 当前项目需要获取其他非公共项目时,需要将项目通过install安装到本地仓库中,再对当前项目添加依赖信息,再重载项目,当要添加的项目是同属一个大项目中的子项目时,此时不需要再通过install进行安装
父子项目中依赖文件信息描述
<parent>
<groupId>com.shujia</groupId>
<artifactId>MvnPro</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>nextSonMvnPro2</artifactId>
在子项目中通过parent标签可以其父项目 父项目中的 groupId和version会被当前子项目所使用所以对于当前子项目的描述 只有 artifactId
<groupId>com.shujia</groupId>
<artifactId>MvnPro</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>NextSonMvnPro1</module>
<module>nextSonMvnPro2</module>
</modules>
父项目中包含由 GAV 和 packaging 一般情况下选择使用pom作为管理
modules 中表示了当前父项目存在有那些子项目 其项目名称为什么
配置参数信息
<properties>
<junit.version>4.13</junit.version>
<mysql.version.pre>5.</mysql.version.pre>
<mysql.version.next>1.49</mysql.version.next>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version.pre}${mysql.version.next}</version>
</dependency>
</dependencies>
properties中可以添加自定义的变量信息,其格式为<变量名>变量值</变量名>
对于添加的配置信息 可以在当前Pom中的任意位置进行调用其调用格式为${变量名}
应用场景:
当pom文件中所添加的依赖非常多时,那么对于其版本可能经常会更改,那么查找依赖会非常麻烦,于是可以在properties中定义版本,直接进行查看properties修改即可