解决Flink中ApacheCommonsCLI版本冲突

flink集群运行checkpoint报错: org.apache.commons.cl i.CommandLine.hasOption(Lorg/apache/commons/cli/ Option;)Z

这个错误通常是由于 Apache Commons CLI 依赖版本冲突引起的。以下是详细的解决步骤:

问题原因

  1. 版本冲突 :Flink 运行时加载了不兼容的 commons-cli 依赖版本
  2. 依赖污染 :用户应用程序或某个依赖引入了冲突的 commons-cli 版本
  3. 类加载问题 :不同版本的 commons-cli 被多个类加载器加载

解决方法

在 Flink 的 lib 目录下检查是否存在多个 commons-cli 版本:

bash 复制代码
ls $FLINK_HOME/lib | grep commons-cli

如果存在多个版本(如 commons-cli-1.3.jarcommons-cli-1.4.jar),删除较旧版本,仅保留一个与 Flink 兼容的版本(推荐使用 Flink 官方发行版默认携带的版本)。

2. 排除用户依赖冲突

若应用程序通过 Maven 引入冲突依赖:

XML 复制代码
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-streaming-java</artifactId>
    <version>${flink.version}</version>
    <exclusions>
        <exclusion>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
        </exclusion>
    </exclusions>
</dependency>
3. 强制统一版本(Maven)

pom.xml 中显式指定版本:

XML 复制代码
<properties>
    <commons-cli.version>1.4.0</commons-cli.version>
</properties>

<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>${commons-cli.version}</version>
</dependency>
4. Hadoop 环境特殊处理

若使用 Flink on YARN,在 flink-conf.yaml 添加:

yaml 复制代码
classloader.parent-first-patterns.additional: org.apache.commons.cli
5. 验证修复

重新启动集群后检查类加载:

java 复制代码
System.out.println(CommandLine.class.getProtectionDomain().getCodeSource().getLocation());

临时解决方案

在作业提交命令中添加显式排除:

bash 复制代码
flink run -c com.example.MainJob \
    -ytj $FLINK_HOME/lib/commons-cli-1.4.0.jar \
    your-job.jar

注意:建议优先采用方法1或2,彻底解决依赖冲突问题。若在云环境(如 EMR)遇到此问题,需联系平台方确认兼容版本。

相关推荐
weixin_4462608533 分钟前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao1 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
人邮异步社区1 小时前
怎么把C语言学到精通?
c语言·开发语言
qetfw1 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
心平气和量大福大2 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai2 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户8356290780512 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
এ慕ོ冬℘゜2 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa2 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
一次旅行2 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化