maven笔记
maven笔记
maven介绍和作用
Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
主要作用的理解:
依赖管理:
在编写项目时我们需要许多第三方依赖,有
maven
后子需要将依赖项的信息编写到
Maven
工程的配置文件,
Maven
软件会自动下载并复制这些依赖到项目中,也会自动下载依赖所需要的依赖(确保依赖版本无误)
构建管理:
项目开发后想要将项目打包成
.war
文件,并部署到服务器中运行;使用
maven
可以通过一行构建命令(
mvn package
)快速构建和打包
idea 也可以构建项目,为什么要使用 maven 呢?
原因1:maven构建触发方便
原因2:开发项目的软件有很多,每个软件的项目结构都不相同,使用maven构建可以统一结构
Packaging定义规则:
指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!
packaging 属性为 jar(默认值),代表普通的Java工程(
Java
类文件,资源文件),打包以后是.jar结尾的文件。
packaging 属性为 war,代表Java的web工程(
Java
文件,
jsp
文件,
html/cssjs
文件,配置文件),打包以后.war结尾的文件。
packaging 属性为 pom,代表不会打包,用来做继承的父工程。
依赖管理
<project xmlns=“ xmlns:xsi=“ xsi:schemaLocation=“ “>
4.0.0
com.atguigu
maven-javase-project-02
1.0-SNAPSHOT
war <jackson.version>2.18.2</jackson.version>
com.fasterxml.jackson.core
jackson-core
${jackson.version}
compile
junit
junit
4.13.2
test
依赖传递与依赖冲突
依赖传递 指的是当一个模块或库
A
依赖于另一个模块或库
B
,而
B
又依赖于模块或库
C
,那么
A
会间接依赖于
C 。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会 自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用 。
依赖传递:导入依赖会自动导入依赖的依赖!(compile dependenices)
简化依赖的导入,确保依赖的版本无冲突
依赖冲突:发现要导入已经存在的依赖(重复依赖)会终止依赖传递!避免循环依赖和重复依赖问题
依赖冲突发生场景:重复依赖
例如
A——需要 B 1.0
C——需要 B 2.0
现要导入A与C依赖那么B应该是那个版本
依赖冲突解决原则:
第一原则:谁短谁优先(看应用的路径长度)
A-C-B1.0
F-B2.0
那么导入的应该是 A C F B2.0
第二原则:谁上谁优先(看dependencies声明的先后顺序)
A-B1.0
F-B2.0
那么导入应该是A,F,B1.0
注意:只要发生冲突了,后续的依赖传递全部终止
前提:
A 1.1 -> B 1.1 -> C 1.1
F 2.2 -> B 2.2
pom声明:
F 2.2
A 1.1
B 2.2
那么会得到F2.2,B2.2,A1.1 (不会引入C1.1,只要发生冲突了,后续的依赖传递全部终止!)
依赖传递的作用是: ——————————— 自动导入依赖的依赖
减少重复依赖:当多个项目依赖同一个库时,
Maven
可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。
- 自动管理依赖
Maven
可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。
确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性
依赖冲突 ————————- 当发生重复依赖导入会终止依赖传递
maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择
依赖下载失败解决方案
解决方案:
检查网络连接和 Maven 仓库服务器状态。
确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
3.清除本地 Maven 仓库缓存 (lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
构建管理
构建概念 :
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
主动触发场景:
重新编译 : 编译不充分, 部分文件没有被编译!
打包 : 独立部署到外部服务器软件,打包部署
部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用
构建步骤
命令方式构建:
语法: mvn 构建命令 构建命令….
注意:
1
命令执行需要我们进入到项目的根路径
2
部署必须时
jar
包形式
可视化方式构建 .
构建命令周期:触发周期后的命令会自动触发同一周期前的命令!
作用:是一种简化触发构建命令过程
是一个有序的构建命令容器
清理周期:
clean
构建周期:
compile test package install/deploy
报告周期:
site
例如:想要打包,就直接
package
即可,不需要
compile test package (
因为会自动触发执行
compile
与
test
但不会触发
clean )
故而打包的最佳方案应是
mvn clean package
我们执行的是周期命令
继承与聚合
继承特性的理解
继承概念:
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
继承作用
作用: 在父工程中统一管理项目中的依赖信息,进行统一版本管理!
它的背景是:
对一个比较大型的项目进行了模块拆分。
一个 project 下面,创建了很多个 module。
每一个 module 都需要配置自己的依赖信息。
它背后的需求是:
- 多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
例如:
在一个父工程下不同子工程需要同一个依赖的版本不同;可以在父工程中声明版本,
思路一:直接在父工程中引入依赖
<dependenies <denpendency gav
(会出现子工程会将不需要的依赖也导入进来)
思路二:父工程引入依赖,只做依赖版本的声明
<dependeniesManagement <dependenies <denpendency gav
(专门为版本管理声明,不会正真导入依赖,只会做一个配置的声明)
在子工程中导入依赖时就只需要写
ga
即可不需要再声明版本了
聚合关系实现和作用
1. 聚合概念————————————(统一构建 : 在父工程中构建就可以触发子工程)
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
2. 聚合作用
统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。