1、Maven是什么
简单来说就是 统一管理jar包的工具
2、Maven的坐标
那maven是如何来帮我们统一管理jar包的呢,和传统的导入jar包不同,maven项目在pom.xml中通过依赖和坐标帮我们进行jar包管理。
坐标的组成:公司名加组织名+项目名+版本号
- GroupId: 依赖的组织或项目的唯一标识符。
- ArtifactId: 依赖项目的唯一标识符。
- Version: 依赖项目的版本号。
3、Maven的仓库和镜像
maven的仓库则存储了我们通过坐标获取到的jar包(maven获取jar包时首先在本地仓库找,没找到再去远程仓库找)
仓库:
本地仓库:位于本地机器上的项目仓库。默认情况下,Maven会将下载的依赖项存储在本地仓库中,并在后续构建过程中重用它们。
配置本地仓库:在maven的安装目录下创建repositorys文件夹,在idea的设置中找到构建工具修改路径
远程仓库:位于远程服务器上的仓库。Maven可以从远程仓库下载项目的依赖项。Maven中央仓库是一个广泛使用的远程仓库,包含了大量的开源Java库。
ps:也可以搭建隐秘的私服:maven私服搭建详细教程(看完必会)_想养一只萨摩耶~的博客-CSDN博客
镜像:解决从远程仓库获取jar包速度慢的问题
- 镜像:mirros
- 国内使用阿里云
- <mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4、Maven的常用命令
什么是 Maven 的生命周期?
Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。
- Clean:会将target目录删除
- site:生成项目的站点文档
- validate:验证工程是否正确,所有需要的资源是否可用。
- compile:编译项目的源代码。
- test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
- package:把已编译的代码打包成可发布的格式,比如 jar、war 等。
- integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
- verify:运行所有检查,验证包是否有效且达到质量标准。
- install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
- deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享
详情请阅读:Maven基础(2):Maven详解_mvn 命令_CodingALife的博客-CSDN博客
5、Maven的插件
- Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的
- 每个插件都能实现多个功能,每个功能就是一个插件目标
- Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务
6、Maven的依赖声明
①依赖声明
GroupId: 依赖的组织或项目的唯一标识符。
ArtifactId: 依赖项目的唯一标识符。
Version: 依赖项目的版本号。
②依赖的范围
Maven还提供了依赖范围(Scope)的概念,用于控制依赖在项目构建过程中的使用范围。常用的依赖范围包括:
- compile: 默认的依赖范围,依赖在编译、测试和运行时均可用。
- test: 仅在测试阶段可用,不会包含在最终的构建产物中。
- provided: 在编译和测试阶段可用,但在运行时由容器或其他外部配置提供。
- runtime: 在运行时可用,不参与编译和测试。
- system: 类似于provided范围,但需要显式指定依赖的路径。
- import: 仅用于管理依赖的版本,不会实际引入依赖。
③传递性依赖
Maven还支持传递性依赖(Transitive Dependency)。当一个模块依赖于另一个模块时,Maven会自动解析并引入被依赖模块的依赖项。这种传递性依赖的机制简化了依赖管理过程。
例如,如果模块A依赖于模块B,而模块B又依赖于模块C,那么当我们在模块A中声明对模块B的依赖时,Maven将会自动解析并引入模块C的依赖项。
④Maven依赖冲突解决
在使用Maven进行依赖管理时,有时会出现依赖冲突的情况,即多个依赖项引入了相同的类或资源,导致编译或运行时的冲突。
- 优先级规则:Maven将选择使用优先级更高的依赖项,可以通过在pom.xml文件中显式声明依赖项的顺序来调整优先级。
- 排除依赖:可以通过在依赖声明中排除特定的传递性依赖项来解决冲突:
在exclusions放入冲突的依赖
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.x.x</version>
<exclusions>xxx</exclusions>
</dependency>
- 版本锁定:使用dependencyManagement指定版本