Maven 依赖核心标签完整详解
这四个标签是 Maven dependency 节点的核心组成部分,共同定义了依赖的唯一标识、版本、生效范围,下面逐一拆解每个标签的作用、用法和注意事项:
<groupId>:依赖的 "组织 / 公司" 标识(必选)
-
核心作用:定义依赖所属的组织、公司、团队或项目组,相当于依赖的 "命名空间",避免不同组织的依赖重名。
-
命名规范 :遵循 反向域名 规则(如
com.alibaba、org.springframework、mysql),格式为顶级域名.公司名.项目名(可选层级) -
示例:
<groupId>mysql</groupId> <!-- MySQL 官方驱动的组织标识 --> <groupId>org.springframework.boot</groupId> <!-- SpringBoot 所属组织 --> <groupId>com.baomidou</groupId> <!-- MyBatis-Plus 所属组织 --> -
注意 :同一个组织的依赖共用同一个
groupId(如 Spring 全家桶均以org.springframework开头)
<artifactId>:依赖的 "项目 / 模块" 标识(必选)
-
核心作用 :定义依赖的具体项目或模块名称,是依赖的 "唯一名称"(结合
groupId可全局唯一标识一个依赖) -
命名规范 :小写字母 + 短横线,清晰体现模块功能(如
mysql-connector-java、spring-boot-starter-web) -
示例:
<artifactId>mysql-connector-java</artifactId> <!-- MySQL 驱动的模块名 --> <artifactId>junit</artifactId> <!-- JUnit 测试框架的模块名 --> <artifactId>mybatis-plus-boot-starter</artifactId> <!-- MyBatis-Plus 启动器模块名 --> -
关键 :
groupId + artifactId是 Maven 依赖的 "唯一索引",Maven 仓库通过这两个值定位依赖包
<version>:依赖的版本号(必选,除非继承父依赖)
-
核心作用:指定依赖的具体版本,决定项目使用的依赖版本
-
版本号规范 :遵循
主版本.次版本.修订版本规则(如8.0.33、4.12、2.7.15),部分版本会带后缀(如3.5.13-release、2.0.7-beta):SNAPSHOT:快照版本(开发中版本,如2.0.0-SNAPSHOT,会实时更新)RELEASE:正式发布版本(稳定版,可省略后缀)beta/alpha:测试 / 预览版本(非稳定版)
-
使用方式:
- 硬编码版本:
<version>8.0.33</version> - 引用属性(推荐):
<version>${mysql.version}</version>(需提前在<properties>定义)
- 硬编码版本:
-
示例:
<version>8.0.33</version> <!-- MySQL 驱动稳定版 --> <version>4.12</version> <!-- JUnit 4 稳定版 --> <version>${spring.boot.version}</version> <!-- 引用属性统一管理版本 --> -
注意 :版本号不一致是依赖冲突的核心原因之一,建议通过
<properties>统一管理
<scope>:依赖的 "作用域 / 生效范围"(可选,默认 compile)
- 核心作用 :控制依赖在 Maven 构建生命周期(编译、测试、打包、运行)中的生效阶段 和可见范围,以及是否传递给子模块
- 常用取值及对比(重点掌握前 5 个):
| 取值 | 编译主代码 | 编译测试代码 | 运行测试代码 | 打包(jar/war) | 依赖传递 | 典型场景 |
|---|---|---|---|---|---|---|
compile |
✅ | ✅ | ✅ | ✅ | ✅ | 业务核心依赖(如 Spring 核心) |
test |
❌ | ✅ | ✅ | ❌ | ❌ | 测试依赖(如 JUnit、Mockito) |
provided |
✅ | ✅ | ✅ | ❌ | ❌ | 容器提供的依赖(如 Servlet API) |
runtime |
❌ | ✅ | ✅ | ✅ | ✅ | 运行时依赖(如 JDBC 驱动) |
system |
✅ | ✅ | ✅ | ❌ | ❌ | 本地系统依赖(需指定路径,不推荐) |
import |
- | - | - | - | - | 仅用于 <dependencyManagement>,导入依赖管理 |
-
示例:
<!-- JUnit 仅测试用,scope=test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- JDBC 驱动仅运行时需要,scope=runtime --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>runtime</scope> </dependency> <!-- Servlet API 由 Tomcat 提供,scope=provided --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> -
关键注意:
test作用域的依赖仅对src/test/java生效,主代码无法引用,且不会打入最终包(测试依赖的最佳实践)provided作用域适用于 "容器 / 服务器已提供" 的依赖(如 Servlet API),避免打包冲突- 无特殊需求时,业务依赖默认
compile即可,但测试 / 容器类依赖必须显式指定对应 scope
完整依赖示例(综合用法)
<dependencies>
<!-- MySQL 驱动:运行时生效,版本统一管理 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- SpringBoot Web 核心:编译/运行均生效 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<!-- 省略 scope,默认 compile -->
</dependency>
<!-- JUnit 测试:仅测试阶段生效 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 统一管理版本属性 -->
<properties>
<mysql.version>8.0.33</mysql.version>
<spring.boot.version>2.7.15</spring.boot.version>
</properties>
总结
- 核心标识 :
groupId + artifactId唯一确定一个依赖,version指定具体版本(推荐用属性统一管理) - 作用域关键 :
scope控制依赖的生效阶段 ------test仅测试用、provided容器提供、runtime仅运行时用、默认compile - 最佳实践 :测试依赖必设
scope=test,容器类依赖设provided,版本号通过<properties>统一配置,避免硬编码和冲突