Maven 介绍
Maven 是一款为 Java 项目
构建管理、依赖管理的工具(软件
),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
总结:Maven就是一个软件,掌握软件安装、配置、以及基本功能**(项目构建
、依赖管理
)**使用就是本课程的主要目标!
场景概念
场景1:例如我们项目需要第三方库(依赖),如Druid连接池、MySQL数据库驱动和Jackson等。那么我们可以将需要的依赖项的信息编写到Maven工程的配置文件,Maven软件就会自动下载并复制这些依赖项到项目中,也会自动下载依赖需要的依赖!确保依赖版本正确无冲突和依赖完整!
场景2:项目开发完成后,想要将项目打成.war文件,并部署到服务器中运行,使用Maven软件,我们可以通过一行构建命令(mvn package)快速项目构建和打包!节省大量时间!
依赖管理:
Maven
可以管理项目
的依赖
,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理
等。通过 Maven,我们可以方便地维护项目所依赖的外部库,而我们仅仅需要编写配置即可。
构建管理:
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程!
Maven
可以管理项目的编译、测试、打包、部署等构建过程
。通过实现标准的构建生命周期,Maven 可以确保每一个构建过程都遵循同样的规则和最佳实践。同时,Maven 的插件机制也使得开发者可以对构建过程进行扩展和定制。主动触发构建,只需要简单的命令操作即可。
Maven 下载
mvn -v
# 输出版本信息即可,如果错误,请仔细检查环境变量即可!
# 友好提示,如果此处错误,绝大部分原因都是java_home变量的事,请仔细检查!!
需要修改的
有三个配置
:本地仓库位置
)下载镜像
选用编译项目的jdk版本
a. 配置本地仓库地址
<localRepository>D:\repositorylocalRepository>
b. 配置国内阿里镜像
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
c. 配置jdk17版本项目构建
jdk-17
true
17
17
17
17
将配置好的maven软件,配置到idea开发工具中
即可! 注意:idea工具默认自带maven配置软件,但是因为没有修改配置,建议替换成本地配置好的maven!a. 打开idea配置文件,构建工具配置
依次点击 file / settings / build / build tool / maven
c. 测试是否配置成功
注意:如果本地仓库地址不变化,只有一个原因,就是maven/conf/settings.xml配置文件编写错误!仔细检查即可!
Maven工程相对之前的工程,多出一组gavp属性,gav需要
我们在创建项目的时候指定
,p有默认值,后期通过配置文件修改。既然要填写的属性,我们先行了解下这组属性的含义!
Maven 中的 GAVP
是指 GroupId
、ArtifactId
、Version
、Packaging
等四个属性的缩写,其中前三个是必要的
,而 Packaging
属性为可选项
。这四个属性主要为每个项目在maven仓库总做一个标识,类似人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用.
GAV遵循以下规则:
GroupID 格式:com.{公司/BU }.业务线.[子业务线]
,最多 4 级
。
说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。
正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang
ArtifactID 格式:产品线名-模块名
。语义不重复不遗漏,先到仓库中心去查证一下。
正例:tc-client / uic-api / tair-tool / bookstore
Version 版本号格式推荐:主版本号.次版本号.修订号
(1.0.0)
主版本号
:当做了不兼容的 API 修改
,或
者增加了能改变产品方向
的新功能
。
次版本号
:当做了向下兼容的功能性新增
(新增类、接口
等)。
修订号
:修复 bug
,没有修改方法签名的功能加强,保持 API 兼容性。
例如: 初始→1.0.0 修改bug → 1.0.1 功能调整 → 1.1.1等
Packaging定义规则:
指示将项目打包为什么类型的文件,idea根据packaging值
,识别
maven项目类型
:
packaging 属性为 jar
(默认值),代表普通的Java工程
,打包以后是.jar结尾的文件。
packaging 属性为 war
,代表Java的web工程
,打包以后.war结尾的文件。
packaging 属性为 pom
,代表不会打包
,用来做继承的父工程
。
注意:此处省略了version
,直接给了一个默认值
自己后期可以在项目中随意修改!
手动创建:
a. 创建一个 javase maven 工程
b. 手动添加web项目结构文件
注意:结构和命名固定
c. 修改pom.xml文件打包方式(修改位置:项目下/pom.xml)
com.gues
maven-javase-project-01
1.0-SNAPSHOT
war
d. 刷新和校验
项目的webapp文件夹出现小蓝点,代表成功
插件方式创建
:
a. 安装
插件 JBLJavaToWeb
file / settings / plugins / marketplace
b. 创建一个 javase maven 工程
c. 右键、使用插件快速补全web项目
Maven 是一个强大的构建工具,它提供一种标准化的项目结构,可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。以下是 Maven Web 程序的文件结构及每个文件的作用
:
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | `-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | `-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | `-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | `-- images # 存放图片资源的目录
| `-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | `-- classes # 存放编译后的 class 文件
| `-- index.html # Web 应用入口页面
`-- test # 项目测试代码
|-- java # 单元测试目录
`-- resources # 测试资源目录
Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
我们通过定义 POM 文件
,Maven
能够自动解析
项目的依赖关系
,并通过
Maven 仓库自动下载和管理依赖
,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。
重点: 编写pom.xml文件
maven项目信息属性配置和读取:
4.0.0
com.companyname.project-group
project
1.0.0
jar/pom/war
依赖管理和添加:
log4j
log4j
1.2.17
runtime
依赖版本提取和维护:
4.11
UTF-8
UTF-8
junit
junit
${junit.version}
依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。
依赖传递的作用
是:
减少重复依赖
:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。自动管理依赖
: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。确保依赖版本正确性
:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!依赖传递
演示:
项目中,需要导入jackson相关的依赖,通过之前导入经验,jackson需要导入三个依赖,分别为:
通过查看网站介绍的依赖传递特性:data-bind中,依赖其他两个依赖
最佳导入:直接可以导入data-bind,自动依赖传递需要的依赖
com.fasterxml.jackson.core
jackson-databind
2.15.0
依赖冲突
演示:
当直接引用或者间接引用出现了相同的jar包,这时一个项目就会出现相同的重复jar包,这就算作冲突,依赖冲突避免出现重复依赖,并且终止依赖传递。
maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!
解决依赖冲突
(如何选择重复依赖)方式:
自动选择原则
短路优先
原则(第一原则)
A—>B—>C—>D—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
则A依赖于X(version 0.0.2)。
依赖路径长度相同
情况下,则“先声明优先
”(第二原则)
A—>E—>X(version 0.0.1)
A—>F—>X(version 0.0.2)
在
中,先声明的,路径相同,会优先选择
小思考:
前提:
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
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
解决方案:
检查网络连接
和 Maven 仓库服务器状态
。
确保依赖项的版本号与项目对应的版本号匹配
,并检查 POM 文件中的依赖项
是否正确
。
清除
本地 Maven 仓库缓存
(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!
例如: pom.xml依赖
com.alibaba
druid
1.2.8
脚本使用(清理maven错误缓存.bat):
@echo off
rem 这里写你的仓库路径
set REPOSITORY_PATH=D:\repository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
使用记事本编写,set REPOSITORY_PATH=D:\repository 改成你本地仓库地址即可! 保存时将文件后缀名改为.bat,点击运行脚本,即可自动清理本地错误缓存文件
构建概念:
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
主动触发场景:
命令方式构建:
语法: mvn 构建命令 构建命令....
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构,删除target文件夹 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 (测试) |
mvn site | 生成一个项目依赖信息的展示页面 |
mvn package | 打包项目,生成war / jar 文件 |
mvn install | 打包后上传到maven本地仓库(本地部署) |
mvn deploy | 只打包,上传到maven私服仓库(私服部署) |
可视化方式构建:
构建命令周期:
构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令,也是一种简化构建的思路.
清理周期:主要是对项目编译生成文件进行清理
包含命令:clean
默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分
包含命令:compile - test - package - install / deploy
报告周期
包含命令:site
打包: mvn clean package 本地仓库: mvn clean install
最佳使用方案:
打包: mvn clean package
重新编译: mvn clean compile
本地部署: mvn clean install
周期,命令和插件:
周期 → 包含若干命令 → 包含若干插件
使用周期命令构建,简化构建过程
最终进行构建的是插件
插件配置:
org.apache.maven.plugins
maven-war-plugin
3.2.2
继承概念
Maven 继承
是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息
的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
继承作用
作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!
它的背景是:
它背后的需求是:
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
继承语法
a.父工程
com.gues.maven
pro03-maven-parent
1.0-SNAPSHOT
pom
b.子工程
com.gues.maven
pro03-maven-parent
1.0-SNAPSHOT
pro04-maven-module
父工程依赖统一管理
a.父工程声明版本
org.springframework
spring-core
4.0.0.RELEASE
org.springframework
spring-beans
4.0.0.RELEASE
org.springframework
spring-context
4.0.0.RELEASE
org.springframework
spring-expression
4.0.0.RELEASE
org.springframework
spring-aop
4.0.0.RELEASE
b.子工程引用版本
org.springframework
spring-core
org.springframework
spring-beans
org.springframework
spring-context
org.springframework
spring-expression
org.springframework
spring-aop
聚合概念
Maven 聚合
是指将多个项目组织到一个父级项目中
,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!
聚合作用
聚合语法
父项目中包含的子项目列表。
com.example
parent-project
pom
1.0.0
child-project1
child-project2