在 Maven 中,“依赖范围(scope)”用来控制依赖在哪些阶段可用(编译、测试、运行等),以及是否会被传递。常见设置方式如下:
| scope | 说明 | 典型场景 |
|---|---|---|
| compile(默认) | 编译、测试、运行都可用 | 项目核心依赖 |
| test | 只在测试编译和运行阶段可用 | 单元测试(JUnit、Mockito) |
| provided | 编译、测试可用,运行时由容器提供 | Servlet API、JDK、应用服务器 |
| runtime | 编译不可用,测试和运行可用 | JDBC 驱动 |
| system | 类似 provided,但需手动指定路径(不推荐) | 本地 jar |
| import | 只在 <dependencyManagement> 中使用 |
BOM 引入 |
在 pom.xml 中通过 <scope> 标签设置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.30</version>
<scope>compile</scope> <!-- 可省略,默认 -->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
✅ 只在 src/test 中可用
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
✅ 编译期用,运行时由 Tomcat 提供
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
✅ 编译时不需要,运行时才用
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/xxx.jar</systemPath>
</dependency>
⚠ 不利于可移植性
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.18</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
✅ 用于统一版本管理
compile 到处用,test 只测用,
provided 容器给,runtime 跑时用,
system 本地玩,import 管版本。
如果你用的是 Gradle、Ivy,或想了解 依赖冲突 / 传递性依赖,也可以继续问我。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。