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

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

编程文章jaq1232025-10-19 6:08:024A+A-

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> 控制。

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21