Skip to content

在 Maven 中,scope 用于定义依赖的使用范围和生命周期。它决定了依赖在项目的各个阶段(编译、测试、运行等)中的可用性和可见性。Maven 中常见的 scope 以及它们的生命周期如下:

1. compile(默认)

  • 生命周期:编译、测试、打包、运行时均可用。

  • 特点:这是默认范围,通常用于项目的核心依赖项,比如核心库或工具类。

  • 适用场景:大多数项目的主要依赖。

  • 示例:

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

2. provided

  • 生命周期:编译和测试时可用,但打包和运行时不可用。

  • 特点:表明依赖会由运行环境(如应用服务器或容器)提供,不会打包到最终的可部署包中。

  • 适用场景:如 Servlet API、JDK 中的扩展库、应用服务器中提供的库等。

  • 示例:

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

3. runtime

  • 生命周期:测试、运行时可用,但编译时不可用。

  • 特点:仅在运行时需要的依赖,例如 JDBC 驱动等。

  • 适用场景:如数据库驱动、日志框架。

  • 示例:

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

4. test

  • 生命周期:仅在测试阶段可用。

  • 特点:只用于测试的依赖,不会打包到最终产物中。

  • 适用场景:如 JUnit、Mockito 等测试框架。

  • 示例:

    xml
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

5. system

  • 生命周期:编译和测试时可用。

  • 特点:依赖项必须手动提供路径,通过 systemPath 指定。适用于没有在远程仓库中可用的依赖。

  • 适用场景:本地的第三方库(不推荐)。

  • 示例:

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

6. import(仅用于 <dependencyManagement>

  • 生命周期:用于导入依赖管理,不直接用于编译、测试或运行。

  • 特点:常用于导入 BOM(Bill of Materials)来管理依赖的版本,特别是 Spring Boot、Spring Cloud 等项目。

  • 适用场景:在父项目或 dependencyManagement 中使用。

  • 示例:

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

总结

  • compile:编译、测试、运行和打包全生命周期可用。
  • provided:编译和测试阶段可用,不打包。
  • runtime:测试和运行时可用,不编译。
  • test:仅测试时可用。
  • system:本地手动指定依赖路径,仅编译和测试时可用。
  • import:仅在依赖管理中使用,用于导入 BOM。