Flink:运行 Table API 查询时出现 NoClassDefFoundError

Flink: NoClassDefFoundError when runnig a Table API query

我有一个流式 Table API 查询,想使用 table.writetoSink(sink) 方法将结果 Table 写入 .csv 文件。

当我运行程序时,出现以下错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/commons/compiler/CompileException
at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:580)
at org.apache.flink.api.table.FlinkPlannerImpl.rel(FlinkPlannerImpl.scala:102)
at org.apache.flink.api.table.BatchTableEnvironment.sql(BatchTableEnvironment.scala:132)
at table_streaming_test.main(table_streaming_test.java:59)
Caused by: java.lang.ClassNotFoundException: org.codehaus.commons.compiler.CompileException
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 4 more

我还在我的项目中包含了 commons-compiler.jar 文件。

Flink 的 Table 和 SQL API 是基于 Apache Calcite 构建的,它依赖于 org.codehaus.janinocommons-compiler

错误消息表明 commons-compiler 依赖项未包含在您的应用程序中。一种方法是构建一个包含应用程序所有依赖项的 fat jar。 Flink 的快速入门 Maven 架构 (Java and Scala) 提供了一个蓝图。另一种方法是将所有必需的依赖项添加到 Flink 设置的 ./lib 文件夹中。