一、Maven的简介和安装
1、什么是Maven?
Maven 是apache软件基金会组织中唯一的一个自动化构建工具,专注于java平台项目的构建和依赖管理。
依赖管理:就是对jar包的管理。通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中。
项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。
2、为什么要使用Maven?*四个特点
- 添加第三方依赖(jar包):以前添加各种jar包采取复制粘贴到项目中的方式,每次创建一个新的项目,如果需要使用第三方的jar包,都要放到项目中,会造成项目中jar包占了大部分内容。会造成工作空间中jar包占据了很大的地方。maven通过第三方仓库来解决jar包重复的问题。将所有的jar包都放到仓库中,项目要使用jar包只需要做依赖。
- 解决jar之间的依赖关系:一般使用的第三方jar包,有的jar包在使用过程中对其他的jar包有依赖关系。比如c3p0jar包,在使用的时候必须同时添加mc...,如果忘记添加,项目启动就会出现异常。在maven中,需要导入对应的一个依赖(jar包),该jar包依赖包就会自动导入。
- 获取第三方依赖:maven如果在本地仓库中引入的依赖是不存在的,会自动去官方仓库去下载对应的jar包。官方网站地址:https://mvnrepository.com
- 可以将项目拆分开发:如果在大型项目中通过多人配置来做项目,每个人负责开发一部分,怎么划分项目,如果在一个中小型的公司,可以将项目安装package的方式拆分,如果项目开发人太多,通过package拆分就不合适,maven就可以将一个项目拆分成多个。
3、什么是构建?
项目的构建就是将我们开发的项目(java代码、配置文件、静态资源,jsp)作为“原材料”去生产一个可以运行的项目的过程。
一般的项目构建分为下面几个阶段:
- 清理:将原来生成的编译结果删除,为重新编译做准备工作
- 编译:将JAVA源程序编译为字节码文件
- 测试:针对项目的关键点进行测试,确保项目在迭代开发中关键点正确。
- 报告:在每次测试后以标准的格式记录和展示测试结果
- 打包:将一个包含多个文件的项目加工成对应的压缩包,java项目打包成jar,web项目打包成war;
- 安装:在maven中独有的,将一个项目打包后安装到本地仓库。
- 部署:将jar包部署到远程仓库或者将war包部署到服务器。
而通过 Maven,开发人员可以简化项目的构建流程,统一管理项目的依赖库、编译、测试和打包等操作,提高项目构建的效率和可维护性,所谓自动化构建。
4、Maven的安装和配置*
① Maven的下载
官网地址:Maven – Welcome to Apache Maven
② Maven的安装
在安装前确保java安装是没有问题的:
①解压缩:
解压后的根目录:
bin:可执行文件
boot:引导目录
conf:配置文件 我们如果要修改maven的配置 都在改目录下
lib:jar包
打开conf:
logging:日志 maven的运行日志 如果maven启动出现问题 可以在日志中查找
setting:maven的配置文件 所有的配置都在该文件中
②配置环境变量
和java配置环境变量一样
配置 MAVEN_HOME ,变量值就是你的 maven 安装 的路径(bin 目录之前一级目录)
配置后使用cmd查看是否配置成功:
③Maven的配置settings.xml
1、修改本地仓库地址
默认是放在系统盘:
在系统中创建一个文件夹,用来做maven的本地仓库,建议大家叫repository
打开根目录下conf文件夹中的setting.xml文件:
2、修改中央仓库地址,为了加快下载的速度,配置阿里镜像或者华为镜像
3、配置jdk的版本号
二、Maven的工程的认识
1、Maven工程的目录结构
作为一个 maven 工程,它的 src 目录和 pom.xml 是必备的。 进入 src 目录后,我们发现它里面的目录结构如下:
src/main/java —— 存放项目的.java 文件
src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的 class 文件会输出到此目录
pom.xml——maven 项目核心配置文件
注意:如果是普通的 java 项目,那么就没有 webapp 目录。
2、Maven的生命周期
Maven 的生命周期是指一系列相互关联的构建阶段,它定义了项目构建过程中的不同阶段和顺序。Maven 的生命周期由一组预定义的阶段(Phase)组成,每个阶段都与特定的构建任务相关联。以下是 Maven 的三个标准生命周期:
- Clean 生命周期:
-
- clean:清理项目,删除生成的构建输出目录。
- Default 生命周期:
-
- validate:验证项目是否正确且所有必需的信息可用。
- compile:将项目的源代码编译为可执行的字节码。
- test:运行项目的单元测试。
- package:将编译后的代码打包到可分发的格式中,如 JAR 或 WAR。
- verify:对集成测试的结果进行检查,以保证质量标准。
- install:将项目打包安装到本地 Maven 仓库,供其他项目使用。
- deploy:将项目打包部署到远程仓库或服务器。
- Site 生命周期:
-
- site:生成项目的站点文档。
- site-deploy:将生成的站点文档部署到远程服务器。
Maven 的生命周期是依次执行的,例如执行 mvn install 命令时,Maven 将按照 Clean 生命周期、Default 生命周期和 Site 生命周期的顺序依次执行相应的阶段。每个生命周期都由一系列插件目标(Goal)组成,这些目标定义了具体的构建任务。
除了默认的生命周期,Maven 还允许用户自定义生命周期和插件目标,以满足特定项目的需求。通过配置项目的 pom.xml 文件,可以添加自定义的生命周期和插件目标,或者覆盖默认生命周期中的某些阶段。
三、Maven的依赖管理*
1、Maven的核心概念
maven能够自动化部署项目,和核心概念是分不开的,我们从核心概念入手来查看mavne如何自动化部署的。
① pom.xml
POM(project Object Model)项目对象模型 ,在maven中使用管理对象的方法来管理项目。将所有的项目信息都封装到pom.xml文件中。pom文件就是maven的核心。我们学习maven就是学习pom文件是怎么配置的。
② 约定的目录结构
约定的目录结构对于maven来说是实现自动化部署不可缺的一步,,我们如果想让maven自动化进行对应的步骤,首先需要告诉maven我们的java文件、静态资源在哪个文件下存放,告诉系统存放文件位置有两种方式:配置和约定,maven使用的约定,提前定义好文件存放的位置:
③ maven的仓库 *
maven的仓库分两种:
(1)本地仓库
maven在当前电脑中存放jar包的或者插件的地方。
(2)远程仓库
如果maven本地仓库没有的jar包 会去远程仓库去查找:
①中央仓库 --官方创建的仓库 里面包含了几乎所有的jar包
②中央仓库镜像 在各大洲都创建中央仓库镜像--作用:提高用户的访问速度
③私服 局域网中创建一个仓库 让局域网中所有人都在私服中下载资源,如果私服也没有对应的资源,就会去中央仓库去下载。
④ maven的坐标
在日常生活中的坐标:
使用经纬度 x,y两个向量就可以表示平面的一个点
使用三个向量x,y,z来表示有高度的一个点
mavne中使用三个向量来表示一个jar包的位置:
groupid 组id
artifactid 项目或者组件id
version 版本号
2、Maven的常用命令
(1)清理 mvn clean
(2)编译命令 mvn compile
(3)测试 mvn test
(4)打包命令 mvn package
(5)安装命令 mvn install 将jar包安装到本地仓库
3、Maven的依赖传递
1、什么是maven的依赖?*
当一个项目配置了对应的jar包 该jar包就叫做当前项目的依赖
2、什么是依赖的传递?*
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
通过上面的图可以看到,我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。
3、依赖的范围scope*
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,maven仓库之外的类库 |
4、什么是依赖冲突?
由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-4.2.4,spring-aop 依赖 spring-beans-5.0.2,但是发现 spirng-beans-4.2.4 加入到了工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突。
5、如何解决依赖冲突?
①依赖调节原则---第一声明者优先原则
在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。
结论:通过上图可以看到,spring-aop和spring-webmvc都传递过来了spring-beans,但是因为spring-aop在前面,所以最终使用的spring-beans是由spring-aop传递过来的,而spring-webmvc传递过来的spring-beans则被忽略了。
②排除依赖
可以使用exclusions标签将传递过来的依赖排除出去。
③版本锁定
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。
版本锁定的使用方式:
第一步:在dependencyManagement标签中锁定依赖的版本
第二步:在dependencies标签中声明需要导入的maven坐标
①在dependencyManagement标签中锁定依赖的版本
②在dependencies标签中声明需要导入的maven坐标