Maven 依赖范围(scope) 和 可选依赖(optional)
pom.xml 里主要涉及 Maven 依赖范围(scope) 和 可选依赖(optional)。
1. scope(依赖范围)
Maven 的依赖范围用来控制:
- 编译时是否可见
- 打包时是否被带入
- 运行时是否需要
常见值:
scope | 含义 | 编译可见 | 测试可见 | 打包 | 示例场景 |
compile(默认) | 默认范围,编译、运行、打包都需要 | 绝大部分业务依赖 | |||
provided | 编译需要,运行时由容器(Tomcat、JDK、k8s环境)提供 | Servlet API、JSP、JDK工具类 | |||
runtime | 编译不需要,运行时才需要 | JDBC 驱动、SLF4J 实现 | |||
test | 仅测试用 | JUnit、Mockito | |||
system | 类似 provided,但必须手动指定 systemPath | 几乎不用了 | |||
import | 用于 dependencyManagement 里导入 BOM | - | - | - | Spring Boot BOM |
在你 POM 里:
<dependency>
<groupId>cn.io.cloud</groupId>
<artifactId>corp-spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
意思是:这个 starter 在编译时需要(因为要有 Web 相关的类),但是最终部署时不打进 jar 包,运行时由应用自身的 web starter 提供。
2. optional
optional=true 表示 可选依赖,即这个依赖不会被传递(transitive dependency)。
比如:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
<optional>true</optional>
</dependency>
- 如果你项目 A 引入了这个 starter,并且标了 optional=true
- 那么当别人依赖你的项目 A 时,不会自动传递这个依赖,除非他自己手动加。
常用于:
- 对外提供 starter 时,给使用者留选择权(例如你提供一个“服务保障”模块,用户可以自己选用 Redis、Zookeeper 或 Redisson)。
- 避免强耦合,减少不必要的依赖冲突。
3. 其他依赖配置
除了 scope 和 optional,常见的 <dependency> 子元素有:
- exclusions(排除传递依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
→ 用来解决依赖冲突。
- classifier(区分构建产物)
<dependency>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<classifier>sources</classifier>
</dependency>
→ 表示依赖源码包、测试包等。
- type(依赖类型,默认 jar)
<dependency>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<type>pom</type>
</dependency>
→ 常见用法是依赖一个 pom(比如 BOM)。
- version(版本号)
通常直接指定,或者交给 <dependencyManagement> 控制。
相关文章
- MyBatis如何实现分页查询?_mybatis collection分页查询
- 通过Mybatis Plus实现代码生成器,常见接口实现讲解
- MyBatis-Plus 日常使用指南_mybatis-plus用法
- 聊聊:Mybatis-Plus 新增获取自增列id,这一次帮你总结好
- MyBatis-Plus码之重器 lambda 表达式使用指南,开发效率瞬间提升80%
- Spring Boot整合MybatisPlus和Druid
- mybatis 代码生成插件free-idea-mybatis、mybatisX
- mybatis-plus 团队新作 mybatis-mate 轻松搞定企业级数据处理
- Maven 依赖范围(scope) 和 可选依赖(optional)
- Trace Sql:打通全链路日志最后一里路