Maven 依赖范围(scope) 和 可选依赖(optional)

内容分享9个月前发布
37 0 0

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> 子元素有:

  1. 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>

→ 用来解决依赖冲突。

  1. classifier(区分构建产物)
<dependency>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0</version>
    <classifier>sources</classifier>
</dependency>

→ 表明依赖源码包、测试包等。

  1. type(依赖类型,默认 jar)
<dependency>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0</version>
    <type>pom</type>
</dependency>

→ 常见用法是依赖一个 pom(列如 BOM)。

  1. version(版本号)

一般直接指定,或者交给 <dependencyManagement> 控制。

© 版权声明

相关文章

暂无评论

none
暂无评论...