Appearance
在 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。