在 Maven 项目中,依赖范围(Dependency Scopes)用于指定依赖项的可见性及其生命周期。Maven 为我们提供了六种不同的依赖范围。下面我们将结合 pom.xml 文件,逐一为您解释这些范围的具体用法。
- Compile Scope(编译范围)
- Provided Scope(已提供范围)
- Runtime Scope(运行时范围)
- Test Scope(测试范围)
- System Scope(系统范围)
- Import Scope(导入范围)
Compile Scope(编译范围)
这是 Maven 中的默认范围。具有此范围的依赖项在所有类路径(如编译、测试和运行时)中均可用,并且会被打包到最终的构建产物(如 JAR、 WAR 等)中。
示例:
org.apache.commons
commons-lang3
3.12.0
Provided Scope(已提供范围)
具有此范围的依赖项在编译项目代码时是必需的,但我们预期由运行时环境(如 JDK 或 Web 容器)来提供它们。因此,这些依赖项不会被包含在最终的构建产物中。
示例:
javax.servlet
javax.servlet-api
4.0.1
provided
Runtime Scope(运行时范围)
具有此范围的依赖项仅在执行源代码时需要,而在编译代码时则不需要。这些依赖项不会包含在编译类路径中,但会包含在运行时类路径中,并且也会被打包到最终的构建产物里。
示例:
org.postgresql
postgresql
42.2.24
runtime
Test Scope(测试范围)
具有此范围的依赖项仅在编译和运行测试代码时需要,对于正式的生产代码是不需要的。
junit
junit
4.13.2
test
System Scope(系统范围)
具有此范围的依赖项不会从 Maven 仓库中获取,而是引用本地系统中的文件。通常我们不推荐使用此范围,因为它绕过了 Maven 的依赖管理机制,可能导致项目的可移植性降低。
示例:
com.example
custom-jar
1.0
system
${project.basedir}/lib/custom-jar.jar
Import Scope(导入范围)
此范围仅适用于 Maven 2.0.9 及更高版本。它通常用在 pom 文件的 dependencyManagement 部分,允许您将其他 POM 文件中的依赖管理配置导入到当前项目中。
示例:
org.springframework
spring-core
5.3.9
org.springframework
spring-web
5.3.9
工具与技术
- Java 编程语言
- Maven 构建工具
- Spring Tool Suite (STS)
- 命令行提示符
> 注意: 在阅读本文之前,建议您最好先了解 Maven 项目的创建方式及其构建生命周期,这样才能正确理解本文所述的概念。此外,您的本地系统中必须已经安装了 Maven。
Maven 依赖范围示例
在这里,我们创建了一个简单的 Maven 项目,并编写了所需的源代码。之后,我们将在这个创建好的 Maven 项目上运行上述命令。
依赖配置:
org.apache.commons
commons-lang3
3.12.0
javax.servlet
javax.servlet-api
4.0.1
provided
org.postgresql
postgresql
42.2.24
runtime
junit
junit
4.13.2
test
com.example
custom-jar
1.0
system
${project.basedir}/lib/custom-jar.jar
项目文件夹结构:
![Project Folder Structure](h