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> 控制。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
