Maven 依赖坐标的 Scope各枚举值 取值含义、示例、完整解析!

Maven 依赖 Scope 完整解析

Maven 的完整生命周期包括:validate、compile、test、package、verify、install 和 deploy。

Maven 的 <scope> 决定了依赖在项目构建生命周期中的可见性和作用范围。以下是所有 <scope> 取值的详细说明、示例及解释。

Scope 类型及含义

Scope 值 含义与功能 生命周期中的作用
compile 默认值。表示依赖在编译、测试、运行阶段都可用。 编译时、测试时、运行时均可用,最终会被打包到产物(jar/war)中。
provided 表示依赖由 JDK 或容器提供,不随项目打包。 编译时可用,测试时可用,但运行时不会被包含在最终包中(例如 Servlet API)。
runtime 表示依赖仅在运行测试时可用,不用于编译。 编译阶段不可用运行时和测试阶段可用,最终会被打包。
test 表示依赖只在测试代码中使用。 仅在测试阶段(如 mvn test)可用,编译运行阶段不可用,不打包到产物中。
system 与 provided 类似,但依赖必须显式指定本地路径。 编译测试阶段可用,不会自动下载依赖,需要手动指定 <systemPath>,不推荐使用。
import 仅用于 dependencyManagement 中,引入其他 POM 的依赖管理。 不直接作为依赖使用,而是导入一个 BOM(Bill of Materials)进行版本管理。

各 Scope 示例及解释

1. compile

示例:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
    <scope>compile</scope>
</dependency>

解释: compile 是默认 scope,表示依赖(如 Apache Commons Lang)在编译、测试和运行时都可用。最终会被打包到项目的 jar/war 文件中,适用于项目核心功能所需的库。

2. provided

示例:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

解释: provided 表示依赖由 JDK 或运行时容器(如 Tomcat)提供,仅在编译和测试阶段需要。例如,Servlet API 在开发 Web 应用时用于编译,但运行时由容器提供,因此不会打包到最终产物中。

3. runtime

示例:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
    <scope>runtime</scope>
</dependency>

解释: runtime 表示依赖仅在运行和测试时需要,不参与编译。例如,MySQL 驱动在运行时连接数据库时使用,但编译时不需要,因此会被打包到最终产物中。

4. test

示例:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

解释: test 表示依赖仅用于测试阶段(如运行 mvn test)。JUnit 依赖用于单元测试,编译和运行主代码时不可用,也不会打包到最终产物中。

5. system

示例:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>custom-lib</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/custom-lib.jar</systemPath>
</dependency>

解释: system 表示依赖是本地文件,需通过 <systemPath> 指定路径。仅在编译和测试时可用,不会从 Maven 仓库下载。由于维护复杂,不推荐使用。

6. import

示例:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

解释: import 仅用于 <dependencyManagement> 部分,用于导入其他 POM 文件(如 Spring Boot 的 BOM)中的依赖版本管理。它不直接引入依赖,而是统一管理版本号,方便项目中依赖版本一致性。

posted @ 2025-09-13 10:25  AlphaGeek  阅读(14)  评论(0)    收藏  举报