解决flink 1.7项目 找不到org.apache.flink.table.descriptors.TableDescriptor
flink版本1.7的项目代码如下:
StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
executionEnvironment.setParallelism(1);
// 设置 Flink SQL 环境
EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().build();
StreamTableEnvironment tableEnvironment = StreamTableEnvironment.create(executionEnvironment, settings);
运行报错找不到org.apache.flink.table.descriptors.TableDescriptor。
问题分析
- 依赖冲突或缺失:
- Flink 1.17.2 中
TableDescriptor
类已被废弃。Flink 1.13 开始引入了TableDescriptor
的新概念,用于定义表源和表目标,而旧版依赖中的org.apache.flink.table.descriptors
相关类在后续版本中被逐步移除。 - 如果代码中还有引用
org.apache.flink.table.descriptors
包下的类(如连接器或格式描述符),可能导致运行时报错。
- Flink 1.17.2 中
- API 版本不匹配:
- 在 Flink 1.17.2 中,推荐使用
Table API
的新方式(TableDescriptor
不再使用)。这可能意味着您正在使用旧版本的 API,或者您的代码依赖了不兼容的旧包。
- 在 Flink 1.17.2 中,推荐使用
解决方案
1. 检查代码中是否仍在使用旧版 API
移除任何对 org.apache.flink.table.descriptors
的直接依赖。使用以下代码替换旧方法:
// 创建 Flink 流执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 创建 Flink SQL 表执行环境
EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().build();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env, settings);
// 定义表源或目标时,使用 Table API 的新方式
TableDescriptor descriptor = TableDescriptor.forConnector("kafka") // 替换为实际使用的连接器
.schema(Schema.newBuilder()
.column("field1", DataTypes.STRING())
.column("field2", DataTypes.INT())
.build())
.format("json") // 替换为实际使用的格式
.option("property.key", "value") // 替换为实际连接器选项
.build();
tableEnv.createTemporaryTable("my_table", descriptor);
2. 更新依赖
确保项目使用的依赖与 Flink 1.17.2 版本兼容。在 pom.xml
或 build.gradle
文件中明确声明以下依赖:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_2.12</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_2.12</artifactId>
<version>1.17.2</version>
<scope>provided</scope>
</dependency>
3. 清理旧依赖
如果仍需要使用 TableDescriptor
类,请确认没有混用老旧版本的连接器或额外库,例如 flink-connector-kafka
等。检查项目中是否存在以下老依赖,并替换为新版依赖:
旧版依赖示例:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.12.x</version>
</dependency>