Apache Flink java.lang.NoClassDefFoundError问题求助
你遇到的NoClassDefFoundError: org/apache/flink/streaming/api/functions/source/SourceFunction错误,核心原因是Flink核心流式API的依赖没有被正确打包到应用JAR中,或者运行环境无法获取到这个依赖。
具体问题定位
看你的POM配置,flink-streaming-java_${scala.binary.version}依赖的scope被设置为<scope>provided</scope>:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> <version>${flink.version}</version> <scope>provided</scope> </dependency>
provided scope的含义是:该依赖由运行环境(比如Flink集群)提供,Maven打包时不会将其包含到最终JAR里。但如果是本地运行测试,或者Kinesis Data Analytics(KDA)环境没有正确匹配这个依赖版本/未提供该依赖,就会出现类找不到的情况——而SourceFunction正是这个依赖中的核心接口,你的FlinkKinesisConsumer代码直接依赖它。
你提到注释掉使用FlinkKinesisConsumer的代码后程序能正常运行,也验证了这一点:这段代码是触发依赖缺失的直接原因。
解决方案
1. 调整flink-streaming-java的依赖scope
- 如果是本地运行调试:移除
<scope>provided</scope>,让Maven将这个依赖打包到JAR中:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> <version>${flink.version}</version> </dependency>
- 如果是部署到KDA:先确认KDA使用的Flink版本是否和你指定的
1.6.2一致。KDA对Flink版本有特定支持,若版本不匹配,即便设置了provided也会出现依赖缺失。同时,KDA环境通常会提供核心Flink依赖,但如果你的代码依赖特定版本的API,建议调整版本到KDA官方支持的范围。
2. 检查依赖版本兼容性
你的配置中flink.version=1.6.2,kda.version=1.0.1,需要确认这两个版本是否兼容。AWS KDA的aws-kinesisanalytics-flink依赖通常绑定特定的Flink版本,建议参考官方文档使用KDA推荐的Flink版本,避免版本不兼容导致的类缺失或冲突。
3. 验证Maven Shade插件配置
你的Shade插件排除项中没有涉及Flink核心依赖,这部分配置没问题,但重新打包后可以检查JAR包内是否包含org.apache.flink.streaming.api.functions.source.SourceFunction类,确保依赖被正确打包。
额外说明
你提到Kafka相关示例也出现相同错误,原因完全一致:Kafka连接器同样依赖Flink核心流式API,只要确保flink-streaming-java依赖能被运行环境获取到,问题就能解决。
内容的提问来源于stack exchange,提问作者IoT user

