Maven 的依赖范围(scope)决定了依赖在项目不同阶段的有效性,主要包括以下几种:
-
compile:默认范围,依赖在编译、测试和运行时都有效。例如:spring-core、commons-lang3 等核心库。
-
provided:依赖在编译和测试时有效,但在运行时由容器或 JDK 提供。例如:servlet-api、jsp-api 等由 Web 容器提供的 API。
-
runtime:依赖在测试和运行时有效,但在编译时不需要。例如:JDBC 驱动(如 mysql-connector-java),编译时只需要 JDBC 接口。
-
test:依赖仅在测试时有效,不会被打包到最终产物中。例如:JUnit、Mockito 等测试框架。
-
system:类似 provided,但需要显式指定本地 jar 包路径,不推荐使用。
-
import:仅在 dependencyManagement 中使用,用于导入其他 POM 的依赖管理配置。
依赖范围还会影响依赖传递性。例如,如果 A 依赖 B(scope=compile),B 依赖 C(scope=test),则 C 不会传递给 A。理解依赖范围对于避免类冲突、减小最终包大小、提高构建效率非常重要。
在实际项目中,合理配置依赖范围可以避免不必要的依赖传递,减少 jar 包冲突,优化项目结构。例如,将 Lombok 配置为 provided 范围,因为它只在编译时需要;将日志实现(如 logback)配置为 runtime,因为编译时只需要日志接口。