maven知识回顾
1. maven仓库类型
maven存储库有三种类型:
- 本地
本地仓库存储的是你项目的所有依赖,当你运行maven构建时,会自动将所有依赖项下载到本地仓库中,有助于避免每次构建项目时引用远程仓库上的依赖项。 - 中央
中央仓库由maven社区提供,它包含了大量常用的库。当你本地仓库中找不到你的依赖时,就会去中央仓库搜索下载。 - 远程
远程仓库是在中央仓库也找不到时,就会去远程仓库中查找依赖。它是由开发人员自己定制的存储库。
![image]()
maven存储库的搜索优先级:
当我们执行maven构建命令时,maven按照如下顺序查找依赖库。
本地 ——> 中央仓库 ————> 远程仓库
2. 项目的生命周期

3. 依赖范围
maven的依赖范围是用来决定依赖在项目的不同阶段(编译、测试、打包、运行等)以及不同模块之间的可见性和传递性。
- 编译:main/java及其子包下能引用他的包。就是我们写代码时能使用相关对象。
- 测试:main/test及其子包下能引用他的包。
- 打包:就是这个程序打包时需要这个依赖。
- 运行:就是这个程序打包后,运行时需要这个依赖。
常见依赖范围:
- compile(默认)
范围:在编译、测试、打包、运行时可用。
传递性:对依赖的子模块可以传递。
- test
范围:在测试时可用。常见场景:JUnit、Mockito、测试工具、测试数据生成器等。
传递性:对依赖的子模块不可传递。
- provided
范围:仅在编译、测试时可用。但在运行时由外部容器提供,不会打包到产物中。servlet-api、是运行在 JEE/Servlet 容器中的库,容器自带。
传递性:对依赖的子模块不可传递。
- system
范围:类似 provided,但你需要显式指定一个本地系统路径来加载依赖,而不是通过 Maven 的仓库解析。
传递性:对依赖的子模块不可传递。
<dependency>
<groupId>com.example</groupId>
<artifactId>special-lib</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/special-lib.jar</systemPath>
</dependency>
- runtime
范围:仅在运行时时可以。
传递性:对依赖的子模块可以传递。常见场景:仅在应用运行时才用到的实现、数据库驱动等(如 jdbc 驱动、某些代理库)。
- import
范围:仅在 dependencyManagement 的 imports 机制中使用,用来引入一个具有 type pom 的依赖,以便将其定义的依赖范围合并到当前 POM 的 dependencyManagement依赖集合中。
典型场景:从父级父 POM 或 BOM(Bill of Materials)中导入一组依赖版本信息。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.3.28</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 随后直接按需声明依赖,版本由 BOM 管理 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
4. 依赖的排除
示例1:在依赖 A 下排除某个传递依赖 B
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-a</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>com.example</groupId>
<artifactId>demo-b</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
5. maven聚合
为什么要聚合:
一个项目拆分成了多个工程,切换起来开发太麻烦。
编译时,不需要每个模块去编译,可以直接点击到父工程点编译即可。
方便管理依赖版本。
聚合项目的定级父工程需要怎么做?
1. 设置 <packaging>pom</packaging> 默认打包方式是jar,需要改成pom。
意思是:这是一个“聚合(POM)/父项目”或“没有实际可打包产物的项目”。
2. 将子工程管理起来 <modules><module>child-a</module></modules>
意思是:在执行 mvn 的构建时,父 POM 会触发对所有注册的子模块的构建,确保整体一致性与依赖关系的正确解析。
3. 子工程需要设置直接的父项目。

浙公网安备 33010602011771号