在 Maven 的 pom.xml
文件中,<scope>
元素用于定义依赖的范围。常见的依赖范围包括:
compile
(默认):该依赖在项目的编译、测试和运行时都有效。test
:只在测试阶段有效,例如用于单元测试的依赖,如 JUnit 等。provided
:期望在运行时由 JDK 或者容器提供,例如 Servlet API 。在编译和测试时有效,但在运行时不需要包含在打包的构件中。runtime
:在运行时有效,但在编译时不需要。例如某些数据库驱动,只在运行时连接数据库时需要。
通过正确设置依赖的范围,可以更精确地管理项目的依赖,避免不必要的依赖被包含在最终的构建产物中,从而减小构建产物的大小和复杂性。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<!-- compile 范围(默认) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- test 范围 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- provided 范围 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- runtime 范围 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
commons-lang3
依赖的范围是默认的compile
,在编译、测试和运行时都可用。junit
依赖的范围是test
,仅在测试阶段可用。javax.servlet-api
依赖的范围是provided
,期望在运行环境中提供。mysql-connector-java
依赖的范围是runtime
,在运行时需要,但编译时不需要