解决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)遇到此问题,需联系平台方确认兼容版本。

相关推荐
小灰灰搞电子6 分钟前
Python 信号量详解:并发控制实战
python·信号量
新时代牛马15 分钟前
cyclictest 毛刺从哪来?从ftrace、latencytop、perf到IRQ/调度延迟定位
android·开发语言·python·kotlin
三84427 分钟前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
Dxy123931021640 分钟前
Python如何结合AI解决数据分析问题
人工智能·python·数据分析
IvanCodes1 小时前
Python 基础语法(七):推导式与常见遍历写法
开发语言·python
暮雨哀尘1 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言
zhangzeyuaaa1 小时前
Python requests:raise_for_status() 与 4xx/5xx 异常层次详解
开发语言·python
泡海椒1 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python
余槐i1 小时前
Firecrawl 实战:将网站转换为大模型可用数据
人工智能·python·工具·firecrawl
shirsl1 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法