Maven 中的 scope(作用域) 用于控制依赖在项目生命周期不同阶段(编译、测试、运行等)的可见性和传递性。它会影响依赖是否被打包、是否参与编译、是否在测试中可用等行为。
Maven 的 scope 有以下几种取值:
1. compile(默认值)
含义:该依赖在项目的所有阶段(编译、测试、运行)都有效。
是否传递:是(会被传递给依赖本项目的其他项目)。
是否打包:是(会被包含在最终的构建产物中,如 JAR/WAR)。
典型用途:核心依赖,如 Spring Core、Log4j 等。
示例:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.21</version> <!-- scope 默认就是 compile,可省略 --> </dependency>
2. provided
含义:依赖在编译和测试阶段有效,但在运行时由 JDK 或容器提供(如 Servlet API 在 Tomcat 中已存在)。
是否传递:否(不会传递给依赖本项目的其他项目)。
是否打包:否(不会被打入最终的 JAR/WAR)。
典型用途:Servlet API、JSP API、Lombok(编译期注解处理器)等。
示例:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
3. runtime
含义:依赖不需要参与编译,但在测试和运行时需要。
是否传递:是。
是否打包:是。
典型用途:JDBC 驱动(代码只依赖接口,具体实现由运行时提供)、日志实现(如 Logback)。
示例:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>runtime</scope> </dependency>
4. test
含义:依赖仅在测试编译和执行阶段有效(如 JUnit、Mockito)。
是否传递:否。
是否打包:否。
典型用途:单元测试、集成测试框架。
示例:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
5. system
含义:类似于
provided,但依赖必须显式指定本地路径(通过<systemPath>),不从 Maven 仓库获取。是否传递:否。
是否打包:否。
注意:不推荐使用,破坏了构建的可移植性。
示例:
<dependency> <groupId>com.example</groupId> <artifactId>my-lib</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/my-lib.jar</systemPath> </dependency>
6. import(仅用于 <dependencyManagement>)
含义:用于导入另一个 POM 的
<dependencyManagement>配置,通常在 BOM(Bill of Materials)中使用。不能用于普通依赖声明,只能在
<type>pom</type>且位于<dependencyManagement>中使用。典型用途:Spring Boot、Spring Cloud 的版本管理。
示例:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.2.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
总结表
表格
✅ 表示有效,❌ 表示无效,— 表示不适用。
评论