Maven中optional的作用

目的:

  • 控制依赖传递 :将依赖标记为可选,这样当其他模块依赖common-component时,不会自动继承Elasticsearch依赖。这遵循了"依赖最小化"原则,避免不必要的库被引入到不需要它们的模块中。
  • 模块化设计 :jetlinks框架采用模块化设计,common-component作为通用基础组件,不应该强制所有使用它的模块都引入Elasticsearch相关功能。通过optional配置,实现了功能的可选性和灵活性。
  • 避免版本冲突 :防止多个模块引入不同版本的Elasticsearch库导致冲突,让实际需要Elasticsearch的模块自行管理其依赖版本。

示例:

common 模块有这么个依赖

xml 复制代码
<dependency>
	<groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <optional>true</optional>
</dependency>

模块A引入了 common模块

xml 复制代码
  <dependency>
     <groupId>org.jetlinks.pro</groupId>
     <artifactId>common-component</artifactId>
     <version>${project.version}</version>
 </dependency>

此时 common的 elasticsearch 依赖不会传递给 A,也就是说 A 是没有 elasticsearch 依赖的,想要这个依赖需要自己单独再引入 elasticsearch,如果想要继承 common 的 elasticsearch,那就去掉 optional 标签即可

【另一种情况】

common 模块的 elasticsearch 去掉了 optional 标签,模块 A 引入了 common,同时模块A自己又单独引入了 elasticsearch ,此时会发生依赖冲突吗?

  • 如果两处的 elasticsearch 版本一致,则不会,maven会优先使用模块A自己的 elasticsearch 依赖
  • 如果两处的版本不一致,则会发生依赖冲突

如果发生了冲突,又不能修改 common 的 pom 文件,我们想用自己引入的依赖,可以选择在引入 common 时排除 common 模块的elasticsearch

xml 复制代码
<dependency>
     <groupId>org.jetlinks.pro</groupId>
     <artifactId>common-component</artifactId>
     <version>${project.version}</version>
     <exclusions>
         <!-- 排除common-component中的r2dbc-spi依赖,使用本模块中直接声明的版本 -->
         <exclusion>
             <groupId>org.elasticsearch</groupId>
    		 <artifactId>elasticsearch</artifactId>
         </exclusion>
     </exclusions>
 </dependency>
相关推荐
企业数字化笔记2 分钟前
多租户系统从哪里开始设计?租户身份、数据隔离、权限与套餐的整体方案
java·spring boot·后端·junit
tiger从容淡定是人生9 分钟前
从 Gemini 的任务示例出发:AI 能否从知识中推导工作流?
java·人工智能·aigc·知识图谱·创业创新·零知识证明
Nebula_g13 分钟前
JavaSE高级:动态代理
java·开发语言·算法·javase
高级程序源20 分钟前
springboot校园外卖平台13676-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·tomcat·maven·课程设计
怦然丶心动28 分钟前
用 Java 把干支历法算清楚:从节气切年到可读摘要
java·算法·vue·独立开发·spring boot / spring
青春逝如流水33 分钟前
Java 线程与操作系统、硬件的关系:状态、映射与差异
java·开发语言·多线程·ai文章
深入云栈35 分钟前
Netty 4.2.x 源码深度解析 (十八):ChannelOutboundBuffer 写缓冲区 —— 发送队列与流量控制
java·后端·架构
我是人✓38 分钟前
Java核心术语与内存机制深度解析
java
xuxigifxfh41 分钟前
面试记录2026
java·mysql·面试·职场和发展
liangbo741 分钟前
04-List 到底该用哪个?ArrayList、LinkedList、Vector、CopyOnWriteArrayList 选型实战
java