Java 21集成Flink 1.20.0报错NoClassDefFoundError: Closer类缺失
问题解决:Flink 1.20.0 Kafka Sink 出现 NoClassDefFoundError (Guava30 Closer)
核心原因
错误提示找不到org.apache.flink.shaded.guava30.com.google.common.io.Closer,本质是依赖版本不匹配:你添加的flink-shaded-guava版本(31.1-jre-17.0)和Flink 1.20.0内部依赖的Guava shaded版本不一致,Flink 1.20.0绑定的是Guava 30.x系列的shaded包。
分步解决方案
1. 替换为Flink 1.20.0匹配的shaded Guava依赖
将pom.xml中的flink-shaded-guava依赖替换为对应版本:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-shaded-guava</artifactId> <version>30.1.1-jre-17.0</version> <scope>compile</scope> </dependency>
2. 排查并排除依赖冲突
执行Maven命令查看依赖树,确认是否存在其他Guava版本干扰:
mvn dependency:tree | grep guava
如果发现非shaded的Guava或其他版本的shaded Guava,在对应依赖中排除冲突:
<dependency> <!-- 替换为你的实际依赖 --> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> <exclusion> <groupId>org.apache.flink</groupId> <artifactId>flink-shaded-guava</artifactId> </exclusion> </exclusions> </dependency>
3. 用Flink官方Maven插件打包(可选但推荐)
使用flink-maven-plugin构建Fat Jar,它会自动处理Flink shaded依赖的打包逻辑,避免类路径冲突:
<build> <plugins> <plugin> <groupId>org.apache.flink</groupId> <artifactId>flink-maven-plugin</artifactId> <version>1.20.0</version> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
4. 验证Java 21兼容性
Flink 1.20.0官方支持Java 21,确保你的项目编译和运行环境统一使用Java 21,避免跨版本的字节码问题。
内容的提问来源于stack exchange,提问作者Paulo Alves
相关产品推荐
相关产品推荐

