Maven是什么?
简单来说Maven是java中的一种项目管理、项目构建、依赖管理的工具。
为什么使用Maven?
因为Maven让我们的项目带来更多的方便,我们把所有的依赖放在Maven的依赖管理文件中(pom),这样Maven帮我们管理依赖。
Maven的作用是什么?
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven是一站式的项目的管理软件,主要的功能:项目的创建、jar包管理、项目打包、发布、部署等功能。
Maven的优点和缺点
优点:
- 简化了项目依赖管理
- 便于项目升级,无论是项目本身升级还是项目使用的依赖升级
- maven有很多插件,便于功能扩展,eg:生产站点、自动发布版本
缺点:
- maven是一个庞大的构建系统,学习难度大
- 虽然上手容易,但是一旦出了问题,难于调试
- 当依赖很多时,m2eclipse老是搞得Eclipse很卡
什么是Maven的坐标?
普通的坐标:
普通的坐标是在平面几何中坐标(x,y)可以标识平面中唯一的一点。
Maven坐标:
就是把我们引入依赖的具体地址,把坐标引入到Maven的pom文件后Maven立刻根据坐标帮我们引入jar包,推荐Maven坐标查询网站:http://mvnrepository.com/
Maven的坐标基本形式?
<!-- junit(单元测试) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
这个是一个简单的Maven坐标形式。
groupId—创建项目的组织或团体的唯一id(可视为公司名)
artifactId—项目的唯一id(可视为项目名)
version—产品的版本号
scope—为jar包作用范围
关于Maven jar包管理机制
Java的编译过程
IDEA中Maven的常用命令
- clean—清空maven中的target目录…
- compile—通过命令maven将
.java
文件转化为.class
文件。 - install—将项目打包,将项目动态的在target和本地仓库中进行存储。
项目坐标和jar包的关系
中央仓库
Maven下载的包都在中央仓库中,我们把坐标放到pom文件后,maven在中央仓库中根据坐标找我们需要的依赖,也引入到项目中,下载好的依赖存入到我们的本地仓库中(中央仓库默认配置)
阿里仓库
中央仓库是国外的访问速度相当慢,我们可以配置把依赖的下载地址改成阿里的仓库(灵活的选择从中央、阿里去下载依赖),同样是下载好的依赖存入到本地仓库中(需要手动配置)
本地仓库
本地仓库是我们从中央仓库或者阿里仓库中下载的依赖直接存入到本地仓库中,然后交给项目,下次我们需要同样的依赖后,Maven先找本地仓库中的,如果没有的话,在阿里仓库中下载,如果没配置阿里仓库的话,直接在中央仓库中找然后下载到本地仓库,本地仓库就是一个文件夹而已,里面存依赖的。
FAQ:中央仓库如何管理我们的jar包?
通过maven坐标进行有效管理。
坐标与本地仓库关系?
- 第三方jar包,一般通过坐标在本地仓库中进行jar包文件的依赖,如果本地仓库中有,但是依赖失败,则需要手动删除原包之后,更新pom.xml重新下载。
- 自己的jar包,当项目打包时会在指定的位置生成
.jar
包文件。
maven中jar包依赖的传递性的原理
说明:
在Maven中,如果A依赖B,B依赖C,当在pom.xml文件中添加A jar包时,B、C都会自动的添加依赖。将这种现象称为maven jar依赖的传递性。
1.jar包传递性的案例
2. 如何实现的?
项目通过依赖项进行jar包文件加载时,根据maven规则,会去本地库中查找该jar包文件,之后解析该jar包文件的.pom
文件,如果该文件中有依赖项,则重复执行上述的过程,直到依赖完成为止结束。
如何保证jar包文件安全性?
- SHA1算法说明:
SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)
SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
一个字节8个bit(0|1)
- 消息摘要说明:
40位16进制数重复的概率是多少?? (2的4次方)40=2^160
SpringBoot相关说明
pom.xml说明
- 历史遗留问题
在之前旧项目中,需要手动的依赖jar包文件,并且格外的注意jar包版本问题,以防版本重复,但凡涉及到jar包的升级或多多少都会有版本问题。 - parent标签的作用
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
SpringBoot官方将自身所有用到的jar包的文件进行了统一的管理定义(冲突问题最大程度上进行了解决),防止内部jar包文件冲突。
- 关于依赖项说明:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
按照需要的jar包进行依赖,但是不需要指定版本号,因为在父级项目中进行统一的定义。