一、Maven简介
1.1 Maven介绍
https://maven.apache.org/what-is-maven.html
Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
1.2 Maven主要作用
- 依赖管理: Maven 可以管理项目的依赖(第三方jar包),包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有冲突、依赖版本管理等。
- 构建管理:
项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程。
清理 —> 编译 —> 测试 —> 报告 —> 打包 —> 部署
Maven 可以管理项目的编译、测试、打包、部署等构建过程。
二、基于IDEA的Maven工程创建
2.1 GAVP属性
Maven工程相对之前的工程,多出一组gavp属性
Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。
Packaging定义规则:
packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。
packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。可以部署到Tomcat。
packaging 属性为 pom,代表不会打包,用来做继承的父工程。
2.2 javaSE和JavaEE
javaSE: 普通Java工程
JavaEE:JavaWeb工程
2.3 Maven工程项目结构
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 # 测试资源目录
- pom.xml:Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。
- src/main/java:存放项目的 Java 源代码。
- src/main/resources:存放项目的资源文件,如配置文件、静态资源等。
- src/main/webapp/WEB-INF:存放 Web 应用的配置文件。
- src/main/webapp/index.html:Web 应用的入口页面。
- src/test/java:存放项目的测试代码。
- src/test/resources:存放测试相关的资源文件,如测试配置文件等。
三、核心功能:依赖管理和构建管理
3.1 依赖管理和配置
通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖。重点: 编写pom.xml文件!
Maven仓库官网(mvnrepository.com)
3.2依赖传递和冲突
依赖传递
导入依赖,会自动导入依赖的依赖(compile dependences),简化依赖的导入,确保依赖版本无冲突
指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。
依赖传递的作用是:
- 减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。
- 自动管理依赖: 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)
在<depencies></depencies>中,先声明的,路径相同,会优先选择!X(version 0.0.1)
3.3 依赖导入失败场景和解决方案
在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:
- 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。
- 依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。
- 本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!
解决方案:
- 检查网络连接和 Maven 仓库服务器状态。
- 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。
- 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在lastupdated缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的gav属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可。
3.4 扩展构建管理和插件配置
主动触发场景:
- 重新编译 : 编译不充分, 部分文件没有被编译!
- 打包 : 独立部署到外部服务器软件,打包部署
- 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用
命令方式构建:
要进入项目根路径(与pom.xml平级)
语法: 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
四、特性:继承和聚合特性
4.1 继承关系
-
继承概念
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。 -
继承作用
作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理。
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。 -
父工程依赖统一管理
在父工程下新建一个模块即为子工程。- 父工程声明版本
<!-- 使用dependencyManagement标签配置对依赖的管理 --> <!-- 被管理的依赖并没有真正被引入到工程 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
- 子工程引用版本
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 --> <!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 --> <!-- 具体来说是由父工程的dependencyManagement来决定。 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> </dependencies>
- 父工程声明版本
4.2 Maven工程聚合关系
- 聚合概念
Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!
例:在父工程触发clean等命令,在子工程也会触发。 - 聚合作用
- 统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。
- 优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。
- 聚合语法
父项目中包含的子项目列表。<project> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <packaging>pom</packaging> <version>1.0.0</version> <modules> <module>child-project1</module> <module>child-project2</module> </modules> </project>
五、Maven核心掌握总结
核心点 | 掌握目标 |
---|---|
安装 | maven安装、环境变量、maven配置文件修改 |
工程创建 | gavp属性理解、JavaSE/EE工程创建、项目结构 |
依赖管理 | 依赖添加、依赖传递、版本提取、导入依赖错误解决 |
构建管理 | 构建过程、构建场景、构建周期等 |
继承和聚合 | 理解继承和聚合作用、继承语法和实践、聚合语法和实践 |