在 Java(尤其是使用 Maven / Gradle 等构建工具)里,依赖范围(Dependency Scope) 非常重要,因为它直接决定了:
下面用 Maven 常见 scope 来说明为什么重要。
不同代码阶段需要的依赖不一样:
| 阶段 | 例子 |
|---|---|
| 编译主代码 | JDK、Spring |
| 写单元测试 | JUnit |
| 运行时 | 数据库驱动 |
| 容器提供 | Servlet API |
如果范围乱用,会导致:
比如:
<scope>provided</scope>
✅ 编译要用
❌ 不打包(由 Tomcat / JDK 提供)
错误示例:
servlet-api 打进 WARClassNotFoundException / NoSuchMethodErrorscope 会影响依赖是否传递
例如:
<scope>test</scope>
→ 不会传递给其他模块
→ 不会污染别人
否则:
test 依赖不参与打包provided 依赖不参与拷贝| Scope | 编译 | 测试 | 运行 | 打包 | 典型用途 |
|---|---|---|---|---|---|
| compile(默认) | ✅ | ✅ | ✅ | ✅ | Spring、工具类 |
| provided | ✅ | ✅ | ❌ | ❌ | servlet-api、lombok |
| runtime | ❌ | ✅ | ✅ | ✅ | JDBC 驱动 |
| test | ❌ | ✅ | ❌ | ❌ | JUnit、Mockito |
| system | ✅ | ✅ | ❌ | ❌ | 本地 jar(不推荐) |
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
结果:
✅ 正确:
<scope>test</scope>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>compile</scope>
</dependency>
结果:
✅ 正确:
<scope>provided</scope>
依赖范围不是“细节”,而是“架构边界”
它决定了:
如果你愿意,我也可以结合 Spring Boot / 微服务 / 多模块项目 给你讲“实际该怎么配依赖范围”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。