本篇笔记参考尚硅谷Maven课程,概括总结了Maven的核心功能
Maven仓库地址:Maven Repository: Search/Browse/Explore
一、Maven简介
1. Maven 是一个依赖管理工具、构建工具
2. Maven介绍
Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
-
依赖管理:管理项目的依赖,下载依赖的依赖,保证以来之间没有冲突
-
构建管理:项目构建是指将源代码、配置文件、资源文件等转化为能够运行或部署的应用程序或库的过程Maven 可以管理项目的编译、测试、打包、部署等构建过程。通过实现标准的构建生命周期,Maven 可以确保每一个构建过程都遵循同样的规则和最佳实践。
-
Maven架构:
二、Maven安装和配置
安装完成后,修改maven/conf/settings.xml配置文件,来修改maven的一些默认配置【本地仓库地址、配置阿里镜像、配置jdk17版本项目构建】
三、基于IDEA创建Maven工程
GAV:GroupID(com.公司.业务线.子业务线), ArtifactID(产品线名-模块名), Version
Packaging定义规则:jar, war, pom(不打包,用来做继承的父工程)
maven项目结构,及各文件的作用:
|-- 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 # 测试资源目录
四、基于IDEA进行Maven工程构建
构建的概念:将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
构建命令:
命令 | 描述 |
---|---|
mvn compile | 编译项目,生成target文件按 |
mvn package | 打包项目,生产jar或者war |
mvn clean | 清理编译或打包后的项目结构 |
mvn install | 打包后上传到maven仓库 |
mvn deploy | 只打包,上传到maven私服仓库 |
mvn site | 生成站点 |
mvn test | 执行测试源码 |
项目生命周期:清理 - 编译 - 测试 - 报告 - 打包 - 部署
- 执行后一周期,前一周期会自动执行
五、基于IDEA 进行Maven依赖管理
依赖管理:能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。
定义pom文件,GAVP,(groupId, artifactId, version, packaging)
配置依赖范围(<scope>
):compile, test, provided, runtime, system, import
-
compile:编译依赖范围,缺省值
-
test:测试依赖范围,如 junit 依赖只有在测试时有效
-
provided:已提供依赖范围,如 servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,已有外部服务提供
-
runtime:运行时依赖范围,如 JDBC
-
system:系统依赖范围,和 provided 类似,只能在当前系统中使用,项目可移植性降低
-
import:导入依赖范围,与
dependencyManagement
配合使用,用于合并 pom.xml
配置依赖插件:build/plugins/plugin标签
下引入插件
六、Maven依赖传递和依赖冲突
1. Maven传递依赖
-
如果Maven有如下依赖关系:C->B->A,则有C->A
-
只有在编译【compile】时起作用的依赖,能够进行传递
-
如果需要停止进行以来传递,则在
<dependency>
下配置<optional>
标签
2. 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>中,先声明的,路径相同,会优先选择!
-
-
-
手动排除
<dependency> <groupId>com.atguigu.maven</groupId> <artifactId>pro01-maven-java</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> <!-- 使用excludes标签配置依赖的排除 --> <exclusions> <!-- 在exclude标签中配置一个具体的排除 --> <exclusion> <!-- 指定要排除的依赖的坐标(不需要写version) --> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
七、Maven工程继承和聚合关系
1. Maven工程继承关系
-
继承概念:Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。
-
继承作用:在父工程中统一管理项目中的依赖信息。
-
使用父工程对子工程中的配置信息进行统一管理
-
父工程中设置的依赖,在子工程中可以使用
-
-
父工程依赖统一管理:父工程pom文件,使用
<dependencyManagement>
标签,子工程需要选择使用的依赖,子工程不会继承父工程所有的依赖,推荐使用!
2. Maven工程聚合关系
-
聚合概念:Maven 聚合是指将多个项目组织到一个父级项目中,以便一起构建和管理的机制。聚合可以帮助我们更好地管理一组相关的子项目,同时简化它们的构建和部署过程。
-
<!-- 父工程中配置, child-project1是一个相对路径 --> <modules> <module>child-project1</module> <module>child-project2</module> </modules>