在 Maven 的 `pom.xml` 文件中,`<scope>` 标签用于定义依赖项的作用域。作用域决定了依赖项的生命周期、可见性和使用范围。`<scope>` 标签的常用值包括:
1. **compile**(默认值):编译依赖在所有 classpath 中都可用,同时也会被传递到依赖的项目中。适用于编译、测试和运行时。
2. **provided**:编译和测试时需要这个依赖,但在运行时由 JDK 或者容器来提供。例如,Servlet API 在编译和测试时需要,但在运行时由 Servlet 容器提供。
3. **runtime**:在运行和测试系统时需要,但在编译时不需要。例如,JDBC 驱动实现仅在运行时需要。
4. **test**:仅在测试时需要,用于编译和运行测试代码。不会随项目发布。
5. **system**:与 `provided` 类似,但是你必须显式提供一个对于本地系统中 JAR 文件的路径。这么做是为了允许基于本地路径的依赖,但是不推荐使用。
6. **import**(Maven 2.0.9 之后可用):用于 `dependencyManagement` 中,它将指定的 POM 文件中的依赖管理信息导入并合并到当前 POM 文件中。
使用示例:
```xml
<dependencies>
<!-- compile scope -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>compile</scope>
</dependency>
<!-- provided scope -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
<scope>provided</scope>
</dependency>
<!-- runtime scope -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>runtime</scope>
</dependency>
<!-- test scope -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
```
在实际使用中,正确选择依赖的作用域可以提高项目的可维护性,避免不必要的依赖传递,减少潜在的版本冲突,并优化构建过程。