This is an automated email from the ASF dual-hosted git repository.
yuqi1129 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 2fc3388049 [#9710] feat(flink-connector): add Flink 1.19 and 1.20
support (#11071)
2fc3388049 is described below
commit 2fc3388049b3349352a9fab112b333d50a037cae
Author: FANNG <[email protected]>
AuthorDate: Fri May 22 13:23:53 2026 +0800
[#9710] feat(flink-connector): add Flink 1.19 and 1.20 support (#11071)
### What changes were proposed in this pull request?
This PR adds Gravitino Flink connector support for Flink 1.19 and Flink
1.20
on top of the versioned-layout baseline established for Flink 1.18
(#10517).
Main changes:
- Add `flink-connector/v1.19/flink` +
`flink-connector/v1.19/flink-runtime`
modules.
- Add `flink-connector/v1.20/flink` +
`flink-connector/v1.20/flink-runtime`
modules.
- Add version-specific catalog/factory entry classes (`*Flink119` /
`*Flink120`) for Hive, Iceberg, JDBC-MySQL, JDBC-Postgres, and Paimon.
- Reuse `DefaultCatalogCompat` for Flink 1.19 and add
`CatalogCompatFlink120`
that uses `CatalogTable.newBuilder(...)` because `CatalogTable.of(...)`
is
deprecated in Flink 1.20.
- The JDBC catalog for 1.19 / 1.20 uses the relocated
`org.apache.flink.connector.jdbc.core.*` factory packages shipped in
`flink-connector-jdbc 3.3.0-1.19` / `3.3.0-1.20`.
- Add provider-specific integration-test entry classes for each new
minor
version.
- Add Flink 1.20-specific overrides for missing required catalog options
where
Flink 1.20 reports `IllegalArgumentException` rather than the
`ValidationException` thrown by older minor versions.
- Extend the Flink CI job to run embedded and deploy mode integration
tests across 1.18, 1.19, and 1.20.
- Exclude the new Flink modules from unrelated Backend IT and Trino CI
jobs.
No `flink-common` production changes are required; the 1.18 baseline
already
exposes the necessary extension hooks (`BaseCatalog#catalogCompat()`,
the
protected `GravitinoJdbcCatalog(Context, ..., AbstractCatalog)`
constructor,
etc.). The shared Iceberg REST SQL integration test now lives in the
common
abstract IT base so the 1.18 / 1.19 / 1.20 entry classes can remain thin
stubs.
This PR supersedes #11061 (closed) and the now-stale #10501.
### Why are the changes needed?
The Flink 1.18 baseline (#10517) was intentionally limited to one minor
and
deferred 1.19 / 1.20 to follow-up work under parent issue #9710. This PR
is that follow-up, so users can target the two currently-maintained
Flink
minor versions.
Fix: #9710
### Does this PR introduce _any_ user-facing change?
Yes. Two new connector artifacts are produced:
- `gravitino-flink-connector-runtime-1.19_2.12`
- `gravitino-flink-connector-runtime-1.20_2.12`
The user-facing SQL syntax is unchanged.
### How was this patch tested?
Local validations (all green):
- `./gradlew spotlessApply`
- `./gradlew :flink-connector:flink-1.19:test -PskipITs`
- `./gradlew :flink-connector:flink-1.20:test -PskipITs`
- `./gradlew :flink-connector:flink-runtime-1.19:test`
- `./gradlew :flink-connector:flink-runtime-1.20:test`
- `./gradlew :flink-connector:flink-runtime-1.19:shadowJar
:flink-connector:flink-runtime-1.20:shadowJar`
- `./gradlew :spotlessKotlinGradleCheck :flink-connector:flink-1.20:test
-PskipITs`
- `./gradlew :flink-connector:flink-common:compileTestJava
:flink-connector:flink-1.19:compileJava
:flink-connector:flink-1.19:compileTestJava
:flink-connector:flink-1.20:compileTestJava
:flink-connector:flink-common:spotlessJavaCheck
:flink-connector:flink-1.19:spotlessJavaCheck
:flink-connector:flink-1.20:spotlessJavaCheck -PskipITs`
The runtime-jar tests verify that the version-specific SPI descriptors
(`META-INF/services/org.apache.flink.table.factories.Factory`) are
merged
into the shaded uber-jar.
The full Hive / Iceberg / JDBC / Paimon integration tests for both new
minor versions will run in CI via the updated
`.github/workflows/flink-integration-test-action.yml`.
---------
Co-authored-by: fanng <“[email protected]”>
---
.../workflows/backend-integration-test-action.yml | 5 +-
.../workflows/flink-integration-test-action.yml | 18 +-
.github/workflows/trino-integration-test.yml | 4 +
.github/workflows/trino-multi-version-test.yml | 4 +
.../test/iceberg/FlinkIcebergRestCatalogIT.java | 66 +++++++
.../test/iceberg/FlinkIcebergRestCatalogIT118.java | 75 +-------
.../v1.19/flink-runtime/build.gradle.kts | 90 +++++++++
.../flink/runtime/TestRuntimeJarDependencies.java | 80 ++++++++
flink-connector/v1.19/flink/build.gradle.kts | 207 +++++++++++++++++++++
.../hive/GravitinoHiveCatalogFactoryFlink119.java | 50 +++++
.../hive/GravitinoHiveCatalogFlink119.java | 55 ++++++
.../GravitinoIcebergCatalogFactoryFlink119.java | 46 +++++
.../iceberg/GravitinoIcebergCatalogFlink119.java | 59 ++++++
.../jdbc/GravitinoJdbcCatalogFlink119.java | 62 ++++++
.../GravitinoMysqlJdbcCatalogFactoryFlink119.java | 40 ++++
...ravitinoPostgresJdbcCatalogFactoryFlink119.java | 41 ++++
.../GravitinoPaimonCatalogFactoryFlink119.java | 38 ++++
.../paimon/GravitinoPaimonCatalogFlink119.java | 43 +++++
.../org.apache.flink.table.factories.Factory | 24 +++
.../test/catalog/GravitinoCatalogManagerIT119.java | 22 +++
.../test/hive/FlinkHiveCatalogIT119.java | 22 +++
.../test/hive/FlinkHiveKerberosClientIT119.java | 22 +++
.../test/iceberg/FlinkIcebergHiveCatalogIT119.java | 22 +++
.../test/iceberg/FlinkIcebergRestCatalogIT119.java | 22 +++
.../test/jdbc/FlinkJdbcMysqlCatalogIT119.java | 22 +++
.../test/paimon/FlinkPaimonHiveBackendIT119.java | 22 +++
.../test/paimon/FlinkPaimonJdbcBackendIT119.java | 22 +++
.../FlinkPaimonLocalFileSystemBackendIT119.java | 22 +++
.../v1.20/flink-runtime/build.gradle.kts | 90 +++++++++
.../flink/runtime/TestRuntimeJarDependencies.java | 80 ++++++++
flink-connector/v1.20/flink/build.gradle.kts | 207 +++++++++++++++++++++
.../hive/GravitinoHiveCatalogFactoryFlink120.java | 50 +++++
.../hive/GravitinoHiveCatalogFlink120.java | 55 ++++++
.../GravitinoIcebergCatalogFactoryFlink120.java | 46 +++++
.../iceberg/GravitinoIcebergCatalogFlink120.java | 59 ++++++
.../jdbc/GravitinoJdbcCatalogFlink120.java | 62 ++++++
.../GravitinoMysqlJdbcCatalogFactoryFlink120.java | 40 ++++
...ravitinoPostgresJdbcCatalogFactoryFlink120.java | 41 ++++
.../GravitinoPaimonCatalogFactoryFlink120.java | 38 ++++
.../paimon/GravitinoPaimonCatalogFlink120.java | 43 +++++
.../connector/utils/CatalogCompatFlink120.java | 49 +++++
.../org.apache.flink.table.factories.Factory | 24 +++
.../test/catalog/GravitinoCatalogManagerIT120.java | 22 +++
.../test/hive/FlinkHiveCatalogIT120.java | 78 ++++++++
.../test/hive/FlinkHiveKerberosClientIT120.java | 22 +++
.../test/iceberg/FlinkIcebergHiveCatalogIT120.java | 22 +++
.../test/iceberg/FlinkIcebergRestCatalogIT120.java | 22 +++
.../test/jdbc/FlinkJdbcMysqlCatalogIT120.java | 51 +++++
.../test/paimon/FlinkPaimonHiveBackendIT120.java | 22 +++
.../test/paimon/FlinkPaimonJdbcBackendIT120.java | 22 +++
.../FlinkPaimonLocalFileSystemBackendIT120.java | 22 +++
gradle/libs.versions.toml | 10 +
settings.gradle.kts | 15 +-
53 files changed, 2317 insertions(+), 80 deletions(-)
diff --git a/.github/workflows/backend-integration-test-action.yml
b/.github/workflows/backend-integration-test-action.yml
index 9e2239db13..09992506b1 100644
--- a/.github/workflows/backend-integration-test-action.yml
+++ b/.github/workflows/backend-integration-test-action.yml
@@ -80,7 +80,10 @@ jobs:
./gradlew test -PskipTests -PtestMode=${{ inputs.test-mode }}
-PjdbcBackend=${{ inputs.backend }} -PskipDockerTests=false -PskipWeb=true \
-x :web:web:test -x :web:integration-test:test -x :web-v2:web:test
-x :web-v2:integration-test:test -x :clients:client-python:test \
- -x :flink-connector:flink-common:test -x
:flink-connector:flink-1.18:test -x :flink-connector:flink-runtime-1.18:test \
+ -x :flink-connector:flink-common:test \
+ -x :flink-connector:flink-1.18:test -x
:flink-connector:flink-runtime-1.18:test \
+ -x :flink-connector:flink-1.19:test -x
:flink-connector:flink-runtime-1.19:test \
+ -x :flink-connector:flink-1.20:test -x
:flink-connector:flink-runtime-1.20:test \
-x :spark-connector:spark-common:test \
-x :spark-connector:spark-3.3:test -x
:spark-connector:spark-3.4:test -x :spark-connector:spark-3.5:test \
-x :spark-connector:spark-runtime-3.3:test -x
:spark-connector:spark-runtime-3.4:test -x
:spark-connector:spark-runtime-3.5:test \
diff --git a/.github/workflows/flink-integration-test-action.yml
b/.github/workflows/flink-integration-test-action.yml
index b4cc9416a4..257d6784f1 100644
--- a/.github/workflows/flink-integration-test-action.yml
+++ b/.github/workflows/flink-integration-test-action.yml
@@ -17,7 +17,7 @@ jobs:
start-runner:
name: JDK${{ inputs.java-version }}
runs-on: ubuntu-latest
- timeout-minutes: 60
+ timeout-minutes: 120
env:
PLATFORM: ${{ inputs.architecture }}
steps:
@@ -46,10 +46,16 @@ jobs:
- name: Flink Integration Test
id: integrationTest
- # run embedded mode and deploy mode integration tests
+ # run embedded mode and deploy mode integration tests for every
supported Flink minor
run: |
- ./gradlew -PskipTests -PtestMode=embedded -PskipDockerTests=false
-PskipWeb=true :flink-connector:flink-1.18:test --tests
"org.apache.gravitino.flink.connector.integration.test.**"
- ./gradlew -PskipTests -PtestMode=deploy -PskipDockerTests=false
-PskipWeb=true :flink-connector:flink-1.18:test --tests
"org.apache.gravitino.flink.connector.integration.test.**"
+ for v in 1.18 1.19 1.20; do
+ ./gradlew -PskipTests -PtestMode=embedded -PskipDockerTests=false
-PskipWeb=true \
+ :flink-connector:flink-$v:test \
+ --tests
"org.apache.gravitino.flink.connector.integration.test.**"
+ ./gradlew -PskipTests -PtestMode=deploy -PskipDockerTests=false
-PskipWeb=true \
+ :flink-connector:flink-$v:test \
+ --tests
"org.apache.gravitino.flink.connector.integration.test.**"
+ done
- name: Upload integrate tests reports
uses: actions/upload-artifact@v7
@@ -60,6 +66,10 @@ jobs:
build/reports
flink-connector/v1.18/flink/build/*.log
flink-connector/v1.18/flink/build/*.tar
+ flink-connector/v1.19/flink/build/*.log
+ flink-connector/v1.19/flink/build/*.tar
+ flink-connector/v1.20/flink/build/*.log
+ flink-connector/v1.20/flink/build/*.tar
distribution/package/logs/gravitino-server.out
distribution/package/logs/gravitino-server.log
catalogs/**/*.log
diff --git a/.github/workflows/trino-integration-test.yml
b/.github/workflows/trino-integration-test.yml
index 5911ac2e3f..7dd6213727 100644
--- a/.github/workflows/trino-integration-test.yml
+++ b/.github/workflows/trino-integration-test.yml
@@ -81,6 +81,10 @@ jobs:
-x :flink-connector:flink-common:build \
-x :flink-connector:flink-1.18:build \
-x :flink-connector:flink-runtime-1.18:build \
+ -x :flink-connector:flink-1.19:build \
+ -x :flink-connector:flink-runtime-1.19:build \
+ -x :flink-connector:flink-1.20:build \
+ -x :flink-connector:flink-runtime-1.20:build \
-x :spark-connector:spark-common:build \
-x :spark-connector:spark-3.3:build -x
:spark-connector:spark-3.4:build -x :spark-connector:spark-3.5:build \
-x :spark-connector:spark-runtime-3.3:build -x
:spark-connector:spark-runtime-3.4:build -x
:spark-connector:spark-runtime-3.5:build \
diff --git a/.github/workflows/trino-multi-version-test.yml
b/.github/workflows/trino-multi-version-test.yml
index f5a620d6c0..f9c55137f0 100644
--- a/.github/workflows/trino-multi-version-test.yml
+++ b/.github/workflows/trino-multi-version-test.yml
@@ -29,6 +29,10 @@ jobs:
-x :flink-connector:flink-common:build \
-x :flink-connector:flink-1.18:build \
-x :flink-connector:flink-runtime-1.18:build \
+ -x :flink-connector:flink-1.19:build \
+ -x :flink-connector:flink-runtime-1.19:build \
+ -x :flink-connector:flink-1.20:build \
+ -x :flink-connector:flink-runtime-1.20:build \
-x :spark-connector:spark-common:build \
-x :spark-connector:spark-3.3:build -x
:spark-connector:spark-3.4:build -x :spark-connector:spark-3.5:build \
-x :spark-connector:spark-runtime-3.3:build -x
:spark-connector:spark-runtime-3.4:build -x
:spark-connector:spark-runtime-3.5:build \
diff --git
a/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT.java
b/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT.java
index 4d77b6167b..197f75f288 100644
---
a/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT.java
+++
b/flink-connector/flink-common/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT.java
@@ -19,11 +19,17 @@
package org.apache.gravitino.flink.connector.integration.test.iceberg;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.Arrays;
import java.util.Map;
+import java.util.Optional;
import org.apache.flink.table.api.ResultKind;
+import org.apache.flink.table.api.TableResult;
import org.apache.flink.types.Row;
+import org.apache.gravitino.Catalog;
+import org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalog;
+import
org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalogFactoryOptions;
import org.apache.gravitino.flink.connector.iceberg.IcebergPropertiesConstants;
import org.apache.gravitino.flink.connector.integration.test.utils.TestUtils;
import org.junit.jupiter.api.Assertions;
@@ -48,6 +54,66 @@ public abstract class FlinkIcebergRestCatalogIT extends
FlinkIcebergCatalogIT {
return catalogProperties;
}
+ @Override
+ @Test
+ public void testCreateGravitinoIcebergUsingSQL() {
+ tableEnv.useCatalog(DEFAULT_CATALOG);
+ int numCatalogs = tableEnv.listCatalogs().length;
+
+ String catalogName = "gravitino_iceberg_using_sql";
+ tableEnv.executeSql(
+ String.format(
+ "create catalog %s with ("
+ + "'type'='%s', "
+ + "'catalog-backend'='%s',"
+ + "'uri'='%s'"
+ + ")",
+ catalogName,
+ GravitinoIcebergCatalogFactoryOptions.IDENTIFIER,
+ getCatalogBackend(),
+ getUri()));
+ Assertions.assertTrue(metalake.catalogExists(catalogName));
+
+ Catalog gravitinoCatalog = metalake.loadCatalog(catalogName);
+ Map<String, String> properties = gravitinoCatalog.properties();
+ Assertions.assertEquals(
+ getUri(),
properties.get(IcebergPropertiesConstants.GRAVITINO_ICEBERG_CATALOG_URI));
+ Assertions.assertFalse(
+
properties.containsKey(IcebergPropertiesConstants.GRAVITINO_ICEBERG_CATALOG_WAREHOUSE));
+
+ Optional<org.apache.flink.table.catalog.Catalog> catalog =
tableEnv.getCatalog(catalogName);
+ Assertions.assertTrue(catalog.isPresent());
+ Assertions.assertInstanceOf(GravitinoIcebergCatalog.class, catalog.get());
+
+ String[] catalogs = tableEnv.listCatalogs();
+ Assertions.assertEquals(numCatalogs + 1, catalogs.length, "Should create a
new catalog");
+ Assertions.assertTrue(
+ Arrays.asList(catalogs).contains(catalogName), "Should create the
correct catalog.");
+
+ TableResult result = tableEnv.executeSql("show catalogs");
+ Assertions.assertEquals(
+ numCatalogs + 1, Lists.newArrayList(result.collect()).size(), "Should
have 2 catalogs");
+
+ Assertions.assertEquals(
+ DEFAULT_CATALOG,
+ tableEnv.getCurrentCatalog(),
+ "Current catalog should be default_catalog in flink");
+
+ tableEnv.useCatalog(catalogName);
+ Assertions.assertEquals(
+ catalogName,
+ tableEnv.getCurrentCatalog(),
+ "Current catalog should be the one that is created just now.");
+
+ tableEnv.useCatalog(DEFAULT_CATALOG);
+ tableEnv.executeSql("drop catalog " + catalogName);
+ Assertions.assertFalse(metalake.catalogExists(catalogName));
+
+ Optional<org.apache.flink.table.catalog.Catalog> droppedCatalog =
+ tableEnv.getCatalog(catalogName);
+ Assertions.assertFalse(droppedCatalog.isPresent(), "Catalog should be
dropped");
+ }
+
@Override
@Test
public void testListSchema() {
diff --git
a/flink-connector/v1.18/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT118.java
b/flink-connector/v1.18/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT118.java
index c383100ca6..94c0803035 100644
---
a/flink-connector/v1.18/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT118.java
+++
b/flink-connector/v1.18/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT118.java
@@ -19,77 +19,4 @@
package org.apache.gravitino.flink.connector.integration.test.iceberg;
-import com.google.common.collect.Lists;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Optional;
-import org.apache.flink.table.api.TableResult;
-import org.apache.gravitino.Catalog;
-import org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalog;
-import
org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalogFactoryOptions;
-import org.apache.gravitino.flink.connector.iceberg.IcebergPropertiesConstants;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-public class FlinkIcebergRestCatalogIT118 extends FlinkIcebergRestCatalogIT {
-
- @Override
- @Test
- public void testCreateGravitinoIcebergUsingSQL() {
- tableEnv.useCatalog(DEFAULT_CATALOG);
- int numCatalogs = tableEnv.listCatalogs().length;
-
- String catalogName = "gravitino_iceberg_using_sql";
- tableEnv.executeSql(
- String.format(
- "create catalog %s with ("
- + "'type'='%s', "
- + "'catalog-backend'='%s',"
- + "'uri'='%s'"
- + ")",
- catalogName,
- GravitinoIcebergCatalogFactoryOptions.IDENTIFIER,
- getCatalogBackend(),
- getUri()));
- Assertions.assertTrue(metalake.catalogExists(catalogName));
-
- Catalog gravitinoCatalog = metalake.loadCatalog(catalogName);
- Map<String, String> properties = gravitinoCatalog.properties();
- Assertions.assertEquals(
- getUri(),
properties.get(IcebergPropertiesConstants.GRAVITINO_ICEBERG_CATALOG_URI));
- Assertions.assertFalse(
-
properties.containsKey(IcebergPropertiesConstants.GRAVITINO_ICEBERG_CATALOG_WAREHOUSE));
-
- Optional<org.apache.flink.table.catalog.Catalog> catalog =
tableEnv.getCatalog(catalogName);
- Assertions.assertTrue(catalog.isPresent());
- Assertions.assertInstanceOf(GravitinoIcebergCatalog.class, catalog.get());
-
- String[] catalogs = tableEnv.listCatalogs();
- Assertions.assertEquals(numCatalogs + 1, catalogs.length, "Should create a
new catalog");
- Assertions.assertTrue(
- Arrays.asList(catalogs).contains(catalogName), "Should create the
correct catalog.");
-
- TableResult result = tableEnv.executeSql("show catalogs");
- Assertions.assertEquals(
- numCatalogs + 1, Lists.newArrayList(result.collect()).size(), "Should
have 2 catalogs");
-
- Assertions.assertEquals(
- DEFAULT_CATALOG,
- tableEnv.getCurrentCatalog(),
- "Current catalog should be default_catalog in flink");
-
- tableEnv.useCatalog(catalogName);
- Assertions.assertEquals(
- catalogName,
- tableEnv.getCurrentCatalog(),
- "Current catalog should be the one that is created just now.");
-
- tableEnv.useCatalog(DEFAULT_CATALOG);
- tableEnv.executeSql("drop catalog " + catalogName);
- Assertions.assertFalse(metalake.catalogExists(catalogName));
-
- Optional<org.apache.flink.table.catalog.Catalog> droppedCatalog =
- tableEnv.getCatalog(catalogName);
- Assertions.assertFalse(droppedCatalog.isPresent(), "Catalog should be
dropped");
- }
-}
+public class FlinkIcebergRestCatalogIT118 extends FlinkIcebergRestCatalogIT {}
diff --git a/flink-connector/v1.19/flink-runtime/build.gradle.kts
b/flink-connector/v1.19/flink-runtime/build.gradle.kts
new file mode 100644
index 0000000000..f9792df561
--- /dev/null
+++ b/flink-connector/v1.19/flink-runtime/build.gradle.kts
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+ alias(libs.plugins.shadow)
+}
+
+repositories {
+ mavenCentral()
+}
+
+val flinkVersion: String = libs.versions.flink119.get()
+val flinkMajorVersion: String = flinkVersion.substringBeforeLast(".")
+val scalaVersion: String = "2.12"
+val artifactName = "gravitino-${project.name}_$scalaVersion"
+val baseName =
"${rootProject.name}-flink-connector-runtime-${flinkMajorVersion}_$scalaVersion"
+
+configurations.all {
+ resolutionStrategy.eachDependency {
+ if (requested.group == "org.apache.logging.log4j") {
+ throw GradleException("Dependency 'org.apache.logging.log4j' is not
allowed.")
+ }
+ }
+}
+
+dependencies {
+ implementation(project(":clients:client-java-runtime", configuration =
"shadow"))
+ implementation(project(":flink-connector:flink-1.19"))
+
+ testImplementation(libs.junit.jupiter.api)
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+val shadowJarTask = tasks.named<ShadowJar>("shadowJar")
+
+shadowJarTask.configure {
+ isZip64 = true
+ configurations = listOf(project.configurations.runtimeClasspath.get())
+ archiveFileName.set("$baseName-$version.jar")
+ archiveClassifier.set("")
+ mergeServiceFiles()
+
+ exclude("org/slf4j/**")
+ exclude("META-INF/maven/org.slf4j/**")
+
+ relocate("com.google", "org.apache.gravitino.shaded.com.google")
+ relocate("google", "org.apache.gravitino.shaded.google")
+ relocate("org.apache.hc", "org.apache.gravitino.shaded.org.apache.hc")
+}
+
+tasks.test {
+ useJUnitPlatform()
+ dependsOn(shadowJarTask)
+ doFirst {
+ systemProperty("shadowJarPath",
shadowJarTask.get().archiveFile.get().asFile.absolutePath)
+ }
+}
+
+publishing {
+ publications {
+ withType<MavenPublication>().configureEach {
+ artifactId = baseName
+ }
+ }
+}
+
+tasks.jar {
+ dependsOn(tasks.named("shadowJar"))
+ archiveClassifier.set("empty")
+}
diff --git
a/flink-connector/v1.19/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
b/flink-connector/v1.19/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
new file mode 100644
index 0000000000..014c6896ab
--- /dev/null
+++
b/flink-connector/v1.19/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.flink.runtime;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.Test;
+
+class TestRuntimeJarDependencies {
+ private static final String FACTORY_SERVICE_ENTRY =
+ "META-INF/services/org.apache.flink.table.factories.Factory";
+
+ @Test
+ void shadowJarShouldNotBundleSlf4j() throws IOException {
+ String jarPath = System.getProperty("shadowJarPath");
+ assertNotNull(jarPath, "shadowJarPath system property should be provided
by the build");
+
+ File runtimeJar = new File(jarPath);
+ assertTrue(runtimeJar.exists(), "shadow jar does not exist: " +
runtimeJar);
+
+ try (JarFile jarFile = new JarFile(runtimeJar)) {
+ List<String> entries =
jarFile.stream().map(JarEntry::getName).collect(Collectors.toList());
+ boolean hasSlf4jClasses = entries.stream().anyMatch(entry ->
entry.startsWith("org/slf4j/"));
+ boolean hasSlf4jMetadata =
+ entries.stream().anyMatch(entry ->
entry.startsWith("META-INF/maven/org.slf4j/"));
+ assertFalse(
+ hasSlf4jClasses,
+ "Flink connector runtime jar should rely on Flink provided slf4j
instead of shading it");
+ assertFalse(hasSlf4jMetadata, "SLF4J metadata should not be packaged in
runtime jar");
+ }
+ }
+
+ @Test
+ void shadowJarShouldMergeFactoryServiceDescriptors() throws IOException {
+ String jarPath = System.getProperty("shadowJarPath");
+ assertNotNull(jarPath, "shadowJarPath system property should be provided
by the build");
+
+ try (JarFile jarFile = new JarFile(new File(jarPath))) {
+ JarEntry factoryServiceEntry =
jarFile.getJarEntry(FACTORY_SERVICE_ENTRY);
+ assertNotNull(factoryServiceEntry, "Factory service descriptor should
exist in runtime jar");
+
+ String factoryServices =
+ new String(
+ jarFile.getInputStream(factoryServiceEntry).readAllBytes(),
StandardCharsets.UTF_8);
+ assertTrue(
+ factoryServices.contains(
+
"org.apache.gravitino.flink.connector.store.GravitinoCatalogStoreFactory"),
+ "Runtime jar should include the shared catalog-store factory
descriptor");
+ assertTrue(
+ factoryServices.contains(
+
"org.apache.gravitino.flink.connector.hive.GravitinoHiveCatalogFactoryFlink119"),
+ "Runtime jar should include the version-specific catalog factory
descriptor");
+ }
+ }
+}
diff --git a/flink-connector/v1.19/flink/build.gradle.kts
b/flink-connector/v1.19/flink/build.gradle.kts
new file mode 100644
index 0000000000..9ca0201df6
--- /dev/null
+++ b/flink-connector/v1.19/flink/build.gradle.kts
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import org.gradle.api.tasks.SourceSetContainer
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+}
+
+repositories {
+ mavenCentral()
+}
+
+val commonProject = project(":flink-connector:flink-common")
+val commonSourceSets = commonProject.extensions.getByType<SourceSetContainer>()
+val commonTestOutput = commonSourceSets.named("test").get().output
+val flinkVersion: String = libs.versions.flink119.get()
+val flinkMajorVersion: String = flinkVersion.substringBeforeLast(".")
+val icebergVersion: String = libs.versions.iceberg4flink119.get()
+val paimonVersion: String = libs.versions.paimon4flink119.get()
+val scalaVersion: String = "2.12"
+val artifactName =
"${rootProject.name}-flink-${flinkMajorVersion}_$scalaVersion"
+
+dependencies {
+ implementation(commonProject)
+
+ compileOnly(project(":clients:client-java-runtime", configuration =
"shadow"))
+
compileOnly("org.apache.iceberg:iceberg-flink-runtime-$flinkMajorVersion:$icebergVersion")
+
compileOnly("org.apache.flink:flink-connector-hive_$scalaVersion:$flinkVersion")
+ compileOnly("org.apache.flink:flink-table-common:$flinkVersion")
+ compileOnly("org.apache.flink:flink-table-api-java:$flinkVersion")
+
compileOnly("org.apache.paimon:paimon-flink-$flinkMajorVersion:$paimonVersion")
+ compileOnly(libs.flinkjdbc119)
+ compileOnly(libs.hive2.common) {
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ }
+
+ testImplementation(project(":api"))
+ testImplementation(project(":catalogs:catalog-jdbc-common")) {
+ exclude("org.apache.logging.log4j")
+ }
+ testImplementation(project(":clients:client-java"))
+ testImplementation(project(":common"))
+ testImplementation(project(":core"))
+ testImplementation(project(":flink-connector:flink-common", "testArtifacts"))
+ testImplementation(project(":integration-test-common", "testArtifacts"))
+ testImplementation(project(":server"))
+ testImplementation(project(":server-common"))
+ testImplementation(libs.awaitility)
+ testImplementation(libs.flinkjdbc119)
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.junit.jupiter.params)
+ testImplementation(libs.metrics.core)
+ testImplementation(libs.minikdc)
+ testImplementation(libs.mockito.core)
+ testImplementation(libs.mysql.driver)
+ testImplementation(libs.postgresql.driver)
+ testImplementation(libs.sqlite.jdbc)
+ testImplementation(libs.testcontainers)
+ testImplementation(libs.testcontainers.junit.jupiter)
+ testImplementation(libs.testcontainers.mysql)
+
+ testImplementation("org.apache.iceberg:iceberg-core:$icebergVersion")
+
testImplementation("org.apache.iceberg:iceberg-hive-metastore:$icebergVersion")
+
testImplementation("org.apache.iceberg:iceberg-flink-runtime-$flinkMajorVersion:$icebergVersion")
+
testImplementation("org.apache.flink:flink-connector-hive_$scalaVersion:$flinkVersion")
+ testImplementation("org.apache.flink:flink-table-common:$flinkVersion")
+ testImplementation("org.apache.flink:flink-table-api-java:$flinkVersion")
+ testImplementation("org.apache.flink:flink-sql-gateway:$flinkVersion")
+
testImplementation("org.apache.paimon:paimon-flink-$flinkMajorVersion:$paimonVersion")
+
+ testImplementation(libs.hive2.exec) {
+ artifact {
+ classifier = "core"
+ }
+ exclude("com.fasterxml.jackson.core")
+ exclude("com.google.code.findbugs", "jsr305")
+ exclude("com.google.protobuf")
+ exclude("org.apache.avro")
+ exclude("org.apache.calcite")
+ exclude("org.apache.calcite.avatica")
+ exclude("org.apache.curator")
+ exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
+ exclude("org.apache.logging.log4j")
+ exclude("org.apache.zookeeper")
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ exclude("org.openjdk.jol")
+ exclude("org.pentaho")
+ exclude("org.slf4j")
+ }
+
+ testImplementation(libs.hadoop3.common) {
+ exclude("*")
+ }
+ testImplementation(libs.hadoop3.hdfs) {
+ exclude("com.sun.jersey")
+ exclude("commons-cli", "commons-cli")
+ exclude("commons-io", "commons-io")
+ exclude("commons-codec", "commons-codec")
+ exclude("commons-logging", "commons-logging")
+ exclude("javax.servlet", "servlet-api")
+ exclude("org.mortbay.jetty")
+ }
+ testImplementation(libs.hadoop3.hdfs.client)
+ testImplementation(libs.hadoop3.mapreduce.client.core) {
+ exclude("*")
+ }
+ // Hadoop 3.x runtime requirements (stripped by exclude("*") above)
+ testImplementation(libs.hadoop3.shaded.guava)
+ testImplementation(libs.hadoop3.shaded.protobuf)
+ testImplementation(libs.commons.configuration2)
+ testImplementation(libs.re2j)
+ testImplementation(libs.hive2.common) {
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ }
+ testImplementation(libs.hive2.metastore) {
+ exclude("co.cask.tephra")
+ exclude("com.github.joshelser")
+ exclude("com.google.code.findbugs", "jsr305")
+ exclude("com.google.code.findbugs", "sr305")
+ exclude("com.tdunning", "json")
+ exclude("com.zaxxer", "HikariCP")
+ exclude("io.dropwizard.metrics")
+ exclude("javax.transaction", "transaction-api")
+ exclude("org.apache.avro")
+ exclude("org.apache.curator")
+ exclude("org.apache.hbase")
+ exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
+ exclude("org.apache.logging.log4j")
+ exclude("org.apache.parquet", "parquet-hadoop-bundle")
+ exclude("org.apache.zookeeper")
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ exclude("org.slf4j")
+ }
+
testImplementation("org.apache.flink:flink-table-api-bridge-base:$flinkVersion")
{
+ exclude("commons-cli", "commons-cli")
+ exclude("commons-io", "commons-io")
+ exclude("com.google.code.findbugs", "jsr305")
+ }
+
testImplementation("org.apache.flink:flink-table-planner_$scalaVersion:$flinkVersion")
+ testImplementation("org.apache.flink:flink-test-utils:$flinkVersion")
+
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+tasks.test {
+ dependsOn(commonProject.tasks.named("testClasses"))
+ // A test artifact dependency only adds common test classes to the
classpath. Add the common
+ // test output explicitly so Gradle discovers and executes those shared
tests in this variant.
+ testClassesDirs = files(commonTestOutput.classesDirs,
sourceSets["test"].output.classesDirs)
+ classpath = files(commonTestOutput, sourceSets["test"].runtimeClasspath)
+
+ val skipITs = project.hasProperty("skipITs")
+ if (skipITs) {
+ exclude("**/integration/test/**")
+ } else {
+ dependsOn(tasks.jar)
+ dependsOn(":catalogs:catalog-hive:jar")
+ dependsOn(":catalogs:catalog-hive:runtimeJars")
+ dependsOn(":catalogs:catalog-lakehouse-iceberg:jar")
+ dependsOn(":catalogs:catalog-lakehouse-iceberg:runtimeJars")
+ dependsOn(":iceberg:iceberg-rest-server:jar")
+ dependsOn(":catalogs:catalog-lakehouse-paimon:jar")
+ dependsOn(":catalogs:catalog-lakehouse-paimon:runtimeJars")
+ dependsOn(":catalogs:catalog-jdbc-mysql:jar")
+ dependsOn(":catalogs:catalog-jdbc-mysql:runtimeJars")
+ dependsOn(":catalogs:catalog-jdbc-postgresql:jar")
+ dependsOn(":catalogs:catalog-jdbc-postgresql:runtimeJars")
+ }
+}
+
+tasks.withType<Jar> {
+ archiveBaseName.set(artifactName)
+}
+
+publishing {
+ publications {
+ withType<MavenPublication>().configureEach {
+ artifactId = artifactName
+ }
+ }
+}
+
+tasks.named<Jar>("sourcesJar") {
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink119.java
new file mode 100644
index 0000000000..c427e113b2
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink119.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.hive;
+
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+/** {@link GravitinoHiveCatalogFactory} implementation for Flink 1.19. */
+public class GravitinoHiveCatalogFactoryFlink119 extends
GravitinoHiveCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ String catalogName,
+ String defaultDatabase,
+ Map<String, String> catalogOptions,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ @Nullable HiveConf hiveConf,
+ @Nullable String hiveVersion) {
+ return new GravitinoHiveCatalogFlink119(
+ catalogName,
+ defaultDatabase,
+ catalogOptions,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ hiveConf,
+ hiveVersion);
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink119.java
new file mode 100644
index 0000000000..b133df9394
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink119.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.hive;
+
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.DefaultCatalogCompat;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+/** {@link GravitinoHiveCatalog} implementation for Flink 1.19. */
+public class GravitinoHiveCatalogFlink119 extends GravitinoHiveCatalog {
+
+ GravitinoHiveCatalogFlink119(
+ String catalogName,
+ String defaultDatabase,
+ Map<String, String> catalogOptions,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ @Nullable HiveConf hiveConf,
+ @Nullable String hiveVersion) {
+ super(
+ catalogName,
+ defaultDatabase,
+ catalogOptions,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ hiveConf,
+ hiveVersion);
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return DefaultCatalogCompat.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink119.java
new file mode 100644
index 0000000000..61ca21b8c0
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink119.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.iceberg;
+
+import java.util.Map;
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+
+/** {@link GravitinoIcebergCatalogFactory} implementation for Flink 1.19. */
+public class GravitinoIcebergCatalogFactoryFlink119 extends
GravitinoIcebergCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ String catalogName,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ Map<String, String> catalogOptions,
+ Map<String, String> icebergCatalogProperties) {
+ return new GravitinoIcebergCatalogFlink119(
+ catalogName,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ catalogOptions,
+ icebergCatalogProperties);
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink119.java
new file mode 100644
index 0000000000..e4f56e3a43
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink119.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.iceberg;
+
+import java.util.Map;
+import org.apache.flink.table.catalog.AbstractCatalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.DefaultCatalogCompat;
+import org.apache.iceberg.flink.FlinkCatalogFactory;
+
+/** {@link GravitinoIcebergCatalog} implementation for Flink 1.19. */
+public class GravitinoIcebergCatalogFlink119 extends GravitinoIcebergCatalog {
+
+ protected GravitinoIcebergCatalogFlink119(
+ String catalogName,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ Map<String, String> catalogOptions,
+ Map<String, String> icebergCatalogProperties) {
+ super(
+ catalogName,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ catalogOptions,
+ createIcebergCatalog(catalogName, icebergCatalogProperties));
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return DefaultCatalogCompat.INSTANCE;
+ }
+
+ private static AbstractCatalog createIcebergCatalog(
+ String catalogName, Map<String, String> icebergCatalogProperties) {
+ return asAbstractCatalog(
+ new FlinkCatalogFactory().createCatalog(catalogName,
icebergCatalogProperties));
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink119.java
new file mode 100644
index 0000000000..d65ea32505
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink119.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc;
+
+import java.util.Optional;
+import
org.apache.flink.connector.jdbc.core.database.catalog.factory.JdbcCatalogFactory;
+import org.apache.flink.connector.jdbc.core.table.JdbcDynamicTableFactory;
+import org.apache.flink.table.catalog.AbstractCatalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.flink.table.factories.Factory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.DefaultCatalogCompat;
+
+/**
+ * {@link GravitinoJdbcCatalog} implementation for Flink 1.19. Uses the
relocated {@code
+ * org.apache.flink.connector.jdbc.core.*} factory packages shipped with
{@code flink-connector-jdbc
+ * 3.3.x}.
+ */
+public class GravitinoJdbcCatalogFlink119 extends GravitinoJdbcCatalog {
+
+ public GravitinoJdbcCatalogFlink119(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ super(
+ context,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ (AbstractCatalog) new JdbcCatalogFactory().createCatalog(context));
+ }
+
+ @Override
+ public Optional<Factory> getFactory() {
+ return Optional.of(new JdbcDynamicTableFactory());
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return DefaultCatalogCompat.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink119.java
new file mode 100644
index 0000000000..91bf581434
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink119.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc.mysql;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.jdbc.GravitinoJdbcCatalogFlink119;
+
+/** {@link GravitinoMysqlJdbcCatalogFactory} implementation for Flink 1.19. */
+public class GravitinoMysqlJdbcCatalogFactoryFlink119 extends
GravitinoMysqlJdbcCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoJdbcCatalogFlink119(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink119.java
new file mode 100644
index 0000000000..c8ce2def9c
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink119.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc.postgresql;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.jdbc.GravitinoJdbcCatalogFlink119;
+
+/** {@link GravitinoPostgresJdbcCatalogFactory} implementation for Flink 1.19.
*/
+public class GravitinoPostgresJdbcCatalogFactoryFlink119
+ extends GravitinoPostgresJdbcCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoJdbcCatalogFlink119(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink119.java
new file mode 100644
index 0000000000..6b9026c334
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink119.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.paimon;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+
+/** {@link GravitinoPaimonCatalogFactory} implementation for Flink 1.19. */
+public class GravitinoPaimonCatalogFactoryFlink119 extends
GravitinoPaimonCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoPaimonCatalogFlink119(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink119.java
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink119.java
new file mode 100644
index 0000000000..2c5adf8b48
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink119.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.paimon;
+
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.DefaultCatalogCompat;
+
+/** {@link GravitinoPaimonCatalog} implementation for Flink 1.19. */
+public class GravitinoPaimonCatalogFlink119 extends GravitinoPaimonCatalog {
+
+ protected GravitinoPaimonCatalogFlink119(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ super(context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return DefaultCatalogCompat.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.19/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
b/flink-connector/v1.19/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
new file mode 100644
index 0000000000..3d3491ed8f
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
@@ -0,0 +1,24 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+org.apache.gravitino.flink.connector.hive.GravitinoHiveCatalogFactoryFlink119
+org.apache.gravitino.flink.connector.paimon.GravitinoPaimonCatalogFactoryFlink119
+org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalogFactoryFlink119
+org.apache.gravitino.flink.connector.jdbc.mysql.GravitinoMysqlJdbcCatalogFactoryFlink119
+org.apache.gravitino.flink.connector.jdbc.postgresql.GravitinoPostgresJdbcCatalogFactoryFlink119
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT119.java
new file mode 100644
index 0000000000..4b14165f2e
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.catalog;
+
+public class GravitinoCatalogManagerIT119 extends GravitinoCatalogManagerIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT119.java
new file mode 100644
index 0000000000..8a69694354
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.hive;
+
+public class FlinkHiveCatalogIT119 extends FlinkHiveCatalogIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT119.java
new file mode 100644
index 0000000000..c43f16984c
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.hive;
+
+public class FlinkHiveKerberosClientIT119 extends FlinkHiveKerberosClientIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT119.java
new file mode 100644
index 0000000000..9a744e02e8
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.iceberg;
+
+public class FlinkIcebergHiveCatalogIT119 extends FlinkIcebergHiveCatalogIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT119.java
new file mode 100644
index 0000000000..b84263ea0f
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.iceberg;
+
+public class FlinkIcebergRestCatalogIT119 extends FlinkIcebergRestCatalogIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT119.java
new file mode 100644
index 0000000000..5d44479f7d
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.jdbc;
+
+public class FlinkJdbcMysqlCatalogIT119 extends FlinkJdbcMysqlCatalogIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT119.java
new file mode 100644
index 0000000000..6bf1b87abd
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonHiveBackendIT119 extends FlinkPaimonHiveBackendIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT119.java
new file mode 100644
index 0000000000..d09d3d466c
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonJdbcBackendIT119 extends FlinkPaimonJdbcBackendIT {}
diff --git
a/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT119.java
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT119.java
new file mode 100644
index 0000000000..bec18c7e62
--- /dev/null
+++
b/flink-connector/v1.19/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT119.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonLocalFileSystemBackendIT119 extends
FlinkPaimonLocalFileSystemBackendIT {}
diff --git a/flink-connector/v1.20/flink-runtime/build.gradle.kts
b/flink-connector/v1.20/flink-runtime/build.gradle.kts
new file mode 100644
index 0000000000..da3dd17670
--- /dev/null
+++ b/flink-connector/v1.20/flink-runtime/build.gradle.kts
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+ alias(libs.plugins.shadow)
+}
+
+repositories {
+ mavenCentral()
+}
+
+val flinkVersion: String = libs.versions.flink120.get()
+val flinkMajorVersion: String = flinkVersion.substringBeforeLast(".")
+val scalaVersion: String = "2.12"
+val artifactName = "gravitino-${project.name}_$scalaVersion"
+val baseName =
"${rootProject.name}-flink-connector-runtime-${flinkMajorVersion}_$scalaVersion"
+
+configurations.all {
+ resolutionStrategy.eachDependency {
+ if (requested.group == "org.apache.logging.log4j") {
+ throw GradleException("Dependency 'org.apache.logging.log4j' is not
allowed.")
+ }
+ }
+}
+
+dependencies {
+ implementation(project(":clients:client-java-runtime", configuration =
"shadow"))
+ implementation(project(":flink-connector:flink-1.20"))
+
+ testImplementation(libs.junit.jupiter.api)
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+val shadowJarTask = tasks.named<ShadowJar>("shadowJar")
+
+shadowJarTask.configure {
+ isZip64 = true
+ configurations = listOf(project.configurations.runtimeClasspath.get())
+ archiveFileName.set("$baseName-$version.jar")
+ archiveClassifier.set("")
+ mergeServiceFiles()
+
+ exclude("org/slf4j/**")
+ exclude("META-INF/maven/org.slf4j/**")
+
+ relocate("com.google", "org.apache.gravitino.shaded.com.google")
+ relocate("google", "org.apache.gravitino.shaded.google")
+ relocate("org.apache.hc", "org.apache.gravitino.shaded.org.apache.hc")
+}
+
+tasks.test {
+ useJUnitPlatform()
+ dependsOn(shadowJarTask)
+ doFirst {
+ systemProperty("shadowJarPath",
shadowJarTask.get().archiveFile.get().asFile.absolutePath)
+ }
+}
+
+publishing {
+ publications {
+ withType<MavenPublication>().configureEach {
+ artifactId = baseName
+ }
+ }
+}
+
+tasks.jar {
+ dependsOn(tasks.named("shadowJar"))
+ archiveClassifier.set("empty")
+}
diff --git
a/flink-connector/v1.20/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
b/flink-connector/v1.20/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
new file mode 100644
index 0000000000..4522b2458f
--- /dev/null
+++
b/flink-connector/v1.20/flink-runtime/src/test/java/org/apache/gravitino/flink/runtime/TestRuntimeJarDependencies.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.flink.runtime;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.Test;
+
+class TestRuntimeJarDependencies {
+ private static final String FACTORY_SERVICE_ENTRY =
+ "META-INF/services/org.apache.flink.table.factories.Factory";
+
+ @Test
+ void shadowJarShouldNotBundleSlf4j() throws IOException {
+ String jarPath = System.getProperty("shadowJarPath");
+ assertNotNull(jarPath, "shadowJarPath system property should be provided
by the build");
+
+ File runtimeJar = new File(jarPath);
+ assertTrue(runtimeJar.exists(), "shadow jar does not exist: " +
runtimeJar);
+
+ try (JarFile jarFile = new JarFile(runtimeJar)) {
+ List<String> entries =
jarFile.stream().map(JarEntry::getName).collect(Collectors.toList());
+ boolean hasSlf4jClasses = entries.stream().anyMatch(entry ->
entry.startsWith("org/slf4j/"));
+ boolean hasSlf4jMetadata =
+ entries.stream().anyMatch(entry ->
entry.startsWith("META-INF/maven/org.slf4j/"));
+ assertFalse(
+ hasSlf4jClasses,
+ "Flink connector runtime jar should rely on Flink provided slf4j
instead of shading it");
+ assertFalse(hasSlf4jMetadata, "SLF4J metadata should not be packaged in
runtime jar");
+ }
+ }
+
+ @Test
+ void shadowJarShouldMergeFactoryServiceDescriptors() throws IOException {
+ String jarPath = System.getProperty("shadowJarPath");
+ assertNotNull(jarPath, "shadowJarPath system property should be provided
by the build");
+
+ try (JarFile jarFile = new JarFile(new File(jarPath))) {
+ JarEntry factoryServiceEntry =
jarFile.getJarEntry(FACTORY_SERVICE_ENTRY);
+ assertNotNull(factoryServiceEntry, "Factory service descriptor should
exist in runtime jar");
+
+ String factoryServices =
+ new String(
+ jarFile.getInputStream(factoryServiceEntry).readAllBytes(),
StandardCharsets.UTF_8);
+ assertTrue(
+ factoryServices.contains(
+
"org.apache.gravitino.flink.connector.store.GravitinoCatalogStoreFactory"),
+ "Runtime jar should include the shared catalog-store factory
descriptor");
+ assertTrue(
+ factoryServices.contains(
+
"org.apache.gravitino.flink.connector.hive.GravitinoHiveCatalogFactoryFlink120"),
+ "Runtime jar should include the version-specific catalog factory
descriptor");
+ }
+ }
+}
diff --git a/flink-connector/v1.20/flink/build.gradle.kts
b/flink-connector/v1.20/flink/build.gradle.kts
new file mode 100644
index 0000000000..bbcd018e1c
--- /dev/null
+++ b/flink-connector/v1.20/flink/build.gradle.kts
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import org.gradle.api.tasks.SourceSetContainer
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+}
+
+repositories {
+ mavenCentral()
+}
+
+val commonProject = project(":flink-connector:flink-common")
+val commonSourceSets = commonProject.extensions.getByType<SourceSetContainer>()
+val commonTestOutput = commonSourceSets.named("test").get().output
+val flinkVersion: String = libs.versions.flink120.get()
+val flinkMajorVersion: String = flinkVersion.substringBeforeLast(".")
+val icebergVersion: String = libs.versions.iceberg4flink120.get()
+val paimonVersion: String = libs.versions.paimon4flink120.get()
+val scalaVersion: String = "2.12"
+val artifactName =
"${rootProject.name}-flink-${flinkMajorVersion}_$scalaVersion"
+
+dependencies {
+ implementation(commonProject)
+
+ compileOnly(project(":clients:client-java-runtime", configuration =
"shadow"))
+
compileOnly("org.apache.iceberg:iceberg-flink-runtime-$flinkMajorVersion:$icebergVersion")
+
compileOnly("org.apache.flink:flink-connector-hive_$scalaVersion:$flinkVersion")
+ compileOnly("org.apache.flink:flink-table-common:$flinkVersion")
+ compileOnly("org.apache.flink:flink-table-api-java:$flinkVersion")
+
compileOnly("org.apache.paimon:paimon-flink-$flinkMajorVersion:$paimonVersion")
+ compileOnly(libs.flinkjdbc120)
+ compileOnly(libs.hive2.common) {
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ }
+
+ testImplementation(project(":api"))
+ testImplementation(project(":catalogs:catalog-jdbc-common")) {
+ exclude("org.apache.logging.log4j")
+ }
+ testImplementation(project(":clients:client-java"))
+ testImplementation(project(":common"))
+ testImplementation(project(":core"))
+ testImplementation(project(":flink-connector:flink-common", "testArtifacts"))
+ testImplementation(project(":integration-test-common", "testArtifacts"))
+ testImplementation(project(":server"))
+ testImplementation(project(":server-common"))
+ testImplementation(libs.awaitility)
+ testImplementation(libs.flinkjdbc120)
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.junit.jupiter.params)
+ testImplementation(libs.metrics.core)
+ testImplementation(libs.minikdc)
+ testImplementation(libs.mockito.core)
+ testImplementation(libs.mysql.driver)
+ testImplementation(libs.postgresql.driver)
+ testImplementation(libs.sqlite.jdbc)
+ testImplementation(libs.testcontainers)
+ testImplementation(libs.testcontainers.junit.jupiter)
+ testImplementation(libs.testcontainers.mysql)
+
+ testImplementation("org.apache.iceberg:iceberg-core:$icebergVersion")
+
testImplementation("org.apache.iceberg:iceberg-hive-metastore:$icebergVersion")
+
testImplementation("org.apache.iceberg:iceberg-flink-runtime-$flinkMajorVersion:$icebergVersion")
+
testImplementation("org.apache.flink:flink-connector-hive_$scalaVersion:$flinkVersion")
+ testImplementation("org.apache.flink:flink-table-common:$flinkVersion")
+ testImplementation("org.apache.flink:flink-table-api-java:$flinkVersion")
+ testImplementation("org.apache.flink:flink-sql-gateway:$flinkVersion")
+
testImplementation("org.apache.paimon:paimon-flink-$flinkMajorVersion:$paimonVersion")
+
+ testImplementation(libs.hive2.exec) {
+ artifact {
+ classifier = "core"
+ }
+ exclude("com.fasterxml.jackson.core")
+ exclude("com.google.code.findbugs", "jsr305")
+ exclude("com.google.protobuf")
+ exclude("org.apache.avro")
+ exclude("org.apache.calcite")
+ exclude("org.apache.calcite.avatica")
+ exclude("org.apache.curator")
+ exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
+ exclude("org.apache.logging.log4j")
+ exclude("org.apache.zookeeper")
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ exclude("org.openjdk.jol")
+ exclude("org.pentaho")
+ exclude("org.slf4j")
+ }
+
+ testImplementation(libs.hadoop3.common) {
+ exclude("*")
+ }
+ testImplementation(libs.hadoop3.hdfs) {
+ exclude("com.sun.jersey")
+ exclude("commons-cli", "commons-cli")
+ exclude("commons-io", "commons-io")
+ exclude("commons-codec", "commons-codec")
+ exclude("commons-logging", "commons-logging")
+ exclude("javax.servlet", "servlet-api")
+ exclude("org.mortbay.jetty")
+ }
+ testImplementation(libs.hadoop3.hdfs.client)
+ testImplementation(libs.hadoop3.mapreduce.client.core) {
+ exclude("*")
+ }
+ // Hadoop 3.x runtime requirements (stripped by exclude("*") above)
+ testImplementation(libs.hadoop3.shaded.guava)
+ testImplementation(libs.hadoop3.shaded.protobuf)
+ testImplementation(libs.commons.configuration2)
+ testImplementation(libs.re2j)
+ testImplementation(libs.hive2.common) {
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ }
+ testImplementation(libs.hive2.metastore) {
+ exclude("co.cask.tephra")
+ exclude("com.github.joshelser")
+ exclude("com.google.code.findbugs", "jsr305")
+ exclude("com.google.code.findbugs", "sr305")
+ exclude("com.tdunning", "json")
+ exclude("com.zaxxer", "HikariCP")
+ exclude("io.dropwizard.metrics")
+ exclude("javax.transaction", "transaction-api")
+ exclude("org.apache.avro")
+ exclude("org.apache.curator")
+ exclude("org.apache.hbase")
+ exclude("org.apache.hadoop", "hadoop-yarn-server-resourcemanager")
+ exclude("org.apache.logging.log4j")
+ exclude("org.apache.parquet", "parquet-hadoop-bundle")
+ exclude("org.apache.zookeeper")
+ exclude("org.eclipse.jetty.aggregate", "jetty-all")
+ exclude("org.eclipse.jetty.orbit", "javax.servlet")
+ exclude("org.slf4j")
+ }
+
testImplementation("org.apache.flink:flink-table-api-bridge-base:$flinkVersion")
{
+ exclude("commons-cli", "commons-cli")
+ exclude("commons-io", "commons-io")
+ exclude("com.google.code.findbugs", "jsr305")
+ }
+
testImplementation("org.apache.flink:flink-table-planner_$scalaVersion:$flinkVersion")
+ testImplementation("org.apache.flink:flink-test-utils:$flinkVersion")
+
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+tasks.test {
+ dependsOn(commonProject.tasks.named("testClasses"))
+ // A test artifact dependency only adds common test classes to the
classpath. Add the common
+ // test output explicitly so Gradle discovers and executes those shared
tests in this variant.
+ testClassesDirs = files(commonTestOutput.classesDirs,
sourceSets["test"].output.classesDirs)
+ classpath = files(commonTestOutput, sourceSets["test"].runtimeClasspath)
+
+ val skipITs = project.hasProperty("skipITs")
+ if (skipITs) {
+ exclude("**/integration/test/**")
+ } else {
+ dependsOn(tasks.jar)
+ dependsOn(":catalogs:catalog-hive:jar")
+ dependsOn(":catalogs:catalog-hive:runtimeJars")
+ dependsOn(":catalogs:catalog-lakehouse-iceberg:jar")
+ dependsOn(":catalogs:catalog-lakehouse-iceberg:runtimeJars")
+ dependsOn(":iceberg:iceberg-rest-server:jar")
+ dependsOn(":catalogs:catalog-lakehouse-paimon:jar")
+ dependsOn(":catalogs:catalog-lakehouse-paimon:runtimeJars")
+ dependsOn(":catalogs:catalog-jdbc-mysql:jar")
+ dependsOn(":catalogs:catalog-jdbc-mysql:runtimeJars")
+ dependsOn(":catalogs:catalog-jdbc-postgresql:jar")
+ dependsOn(":catalogs:catalog-jdbc-postgresql:runtimeJars")
+ }
+}
+
+tasks.withType<Jar> {
+ archiveBaseName.set(artifactName)
+}
+
+publishing {
+ publications {
+ withType<MavenPublication>().configureEach {
+ artifactId = artifactName
+ }
+ }
+}
+
+tasks.named<Jar>("sourcesJar") {
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink120.java
new file mode 100644
index 0000000000..5ed11f0e16
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFactoryFlink120.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.hive;
+
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+/** {@link GravitinoHiveCatalogFactory} implementation for Flink 1.20. */
+public class GravitinoHiveCatalogFactoryFlink120 extends
GravitinoHiveCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ String catalogName,
+ String defaultDatabase,
+ Map<String, String> catalogOptions,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ @Nullable HiveConf hiveConf,
+ @Nullable String hiveVersion) {
+ return new GravitinoHiveCatalogFlink120(
+ catalogName,
+ defaultDatabase,
+ catalogOptions,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ hiveConf,
+ hiveVersion);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink120.java
new file mode 100644
index 0000000000..679e991bba
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/hive/GravitinoHiveCatalogFlink120.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.hive;
+
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.CatalogCompatFlink120;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+/** {@link GravitinoHiveCatalog} implementation for Flink 1.20. */
+public class GravitinoHiveCatalogFlink120 extends GravitinoHiveCatalog {
+
+ GravitinoHiveCatalogFlink120(
+ String catalogName,
+ String defaultDatabase,
+ Map<String, String> catalogOptions,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ @Nullable HiveConf hiveConf,
+ @Nullable String hiveVersion) {
+ super(
+ catalogName,
+ defaultDatabase,
+ catalogOptions,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ hiveConf,
+ hiveVersion);
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return CatalogCompatFlink120.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink120.java
new file mode 100644
index 0000000000..d9f2e8b37f
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFactoryFlink120.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.iceberg;
+
+import java.util.Map;
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+
+/** {@link GravitinoIcebergCatalogFactory} implementation for Flink 1.20. */
+public class GravitinoIcebergCatalogFactoryFlink120 extends
GravitinoIcebergCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ String catalogName,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ Map<String, String> catalogOptions,
+ Map<String, String> icebergCatalogProperties) {
+ return new GravitinoIcebergCatalogFlink120(
+ catalogName,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ catalogOptions,
+ icebergCatalogProperties);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink120.java
new file mode 100644
index 0000000000..f105b8b545
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/iceberg/GravitinoIcebergCatalogFlink120.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.iceberg;
+
+import java.util.Map;
+import org.apache.flink.table.catalog.AbstractCatalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.CatalogCompatFlink120;
+import org.apache.iceberg.flink.FlinkCatalogFactory;
+
+/** {@link GravitinoIcebergCatalog} implementation for Flink 1.20. */
+public class GravitinoIcebergCatalogFlink120 extends GravitinoIcebergCatalog {
+
+ protected GravitinoIcebergCatalogFlink120(
+ String catalogName,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter,
+ Map<String, String> catalogOptions,
+ Map<String, String> icebergCatalogProperties) {
+ super(
+ catalogName,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ catalogOptions,
+ createIcebergCatalog(catalogName, icebergCatalogProperties));
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return CatalogCompatFlink120.INSTANCE;
+ }
+
+ private static AbstractCatalog createIcebergCatalog(
+ String catalogName, Map<String, String> icebergCatalogProperties) {
+ return asAbstractCatalog(
+ new FlinkCatalogFactory().createCatalog(catalogName,
icebergCatalogProperties));
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink120.java
new file mode 100644
index 0000000000..bb9b899462
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/GravitinoJdbcCatalogFlink120.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc;
+
+import java.util.Optional;
+import
org.apache.flink.connector.jdbc.core.database.catalog.factory.JdbcCatalogFactory;
+import org.apache.flink.connector.jdbc.core.table.JdbcDynamicTableFactory;
+import org.apache.flink.table.catalog.AbstractCatalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.flink.table.factories.Factory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.CatalogCompatFlink120;
+
+/**
+ * {@link GravitinoJdbcCatalog} implementation for Flink 1.20. Uses the
relocated {@code
+ * org.apache.flink.connector.jdbc.core.*} factory packages shipped with
{@code flink-connector-jdbc
+ * 3.3.x}.
+ */
+public class GravitinoJdbcCatalogFlink120 extends GravitinoJdbcCatalog {
+
+ public GravitinoJdbcCatalogFlink120(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ super(
+ context,
+ defaultDatabase,
+ schemaAndTablePropertiesConverter,
+ partitionConverter,
+ (AbstractCatalog) new JdbcCatalogFactory().createCatalog(context));
+ }
+
+ @Override
+ public Optional<Factory> getFactory() {
+ return Optional.of(new JdbcDynamicTableFactory());
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return CatalogCompatFlink120.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink120.java
new file mode 100644
index 0000000000..a0ff8eadc7
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/mysql/GravitinoMysqlJdbcCatalogFactoryFlink120.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc.mysql;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.jdbc.GravitinoJdbcCatalogFlink120;
+
+/** {@link GravitinoMysqlJdbcCatalogFactory} implementation for Flink 1.20. */
+public class GravitinoMysqlJdbcCatalogFactoryFlink120 extends
GravitinoMysqlJdbcCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoJdbcCatalogFlink120(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink120.java
new file mode 100644
index 0000000000..45637561a0
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/jdbc/postgresql/GravitinoPostgresJdbcCatalogFactoryFlink120.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.jdbc.postgresql;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.jdbc.GravitinoJdbcCatalogFlink120;
+
+/** {@link GravitinoPostgresJdbcCatalogFactory} implementation for Flink 1.20.
*/
+public class GravitinoPostgresJdbcCatalogFactoryFlink120
+ extends GravitinoPostgresJdbcCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoJdbcCatalogFlink120(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink120.java
new file mode 100644
index 0000000000..de47221a5a
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFactoryFlink120.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.paimon;
+
+import org.apache.flink.table.catalog.Catalog;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+
+/** {@link GravitinoPaimonCatalogFactory} implementation for Flink 1.20. */
+public class GravitinoPaimonCatalogFactoryFlink120 extends
GravitinoPaimonCatalogFactory {
+
+ @Override
+ protected Catalog newCatalog(
+ Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ return new GravitinoPaimonCatalogFlink120(
+ context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink120.java
new file mode 100644
index 0000000000..464578849b
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/paimon/GravitinoPaimonCatalogFlink120.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.paimon;
+
+import org.apache.flink.table.factories.CatalogFactory;
+import org.apache.gravitino.flink.connector.PartitionConverter;
+import org.apache.gravitino.flink.connector.SchemaAndTablePropertiesConverter;
+import org.apache.gravitino.flink.connector.utils.CatalogCompat;
+import org.apache.gravitino.flink.connector.utils.CatalogCompatFlink120;
+
+/** {@link GravitinoPaimonCatalog} implementation for Flink 1.20. */
+public class GravitinoPaimonCatalogFlink120 extends GravitinoPaimonCatalog {
+
+ protected GravitinoPaimonCatalogFlink120(
+ CatalogFactory.Context context,
+ String defaultDatabase,
+ SchemaAndTablePropertiesConverter schemaAndTablePropertiesConverter,
+ PartitionConverter partitionConverter) {
+ super(context, defaultDatabase, schemaAndTablePropertiesConverter,
partitionConverter);
+ }
+
+ @Override
+ protected CatalogCompat catalogCompat() {
+ return CatalogCompatFlink120.INSTANCE;
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/utils/CatalogCompatFlink120.java
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/utils/CatalogCompatFlink120.java
new file mode 100644
index 0000000000..11052f8150
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/java/org/apache/gravitino/flink/connector/utils/CatalogCompatFlink120.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.utils;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.flink.table.api.Schema;
+import org.apache.flink.table.catalog.CatalogPropertiesUtil;
+import org.apache.flink.table.catalog.CatalogTable;
+import org.apache.flink.table.catalog.ResolvedCatalogTable;
+
+/** {@link CatalogCompat} implementation for Flink 1.20. */
+public enum CatalogCompatFlink120 implements CatalogCompat {
+ INSTANCE;
+
+ @Override
+ public CatalogTable createCatalogTable(
+ Schema schema, String comment, List<String> partitionKeys, Map<String,
String> options) {
+ // CatalogTable.of(...) is deprecated in Flink 1.20; use the builder API
instead.
+ return CatalogTable.newBuilder()
+ .schema(schema)
+ .comment(comment)
+ .partitionKeys(partitionKeys)
+ .options(options)
+ .build();
+ }
+
+ @Override
+ public Map<String, String> serializeCatalogTable(ResolvedCatalogTable
resolvedTable) {
+ return CatalogPropertiesUtil.serializeCatalogTable(resolvedTable);
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
b/flink-connector/v1.20/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
new file mode 100644
index 0000000000..d6b935d39c
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
@@ -0,0 +1,24 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+org.apache.gravitino.flink.connector.hive.GravitinoHiveCatalogFactoryFlink120
+org.apache.gravitino.flink.connector.paimon.GravitinoPaimonCatalogFactoryFlink120
+org.apache.gravitino.flink.connector.iceberg.GravitinoIcebergCatalogFactoryFlink120
+org.apache.gravitino.flink.connector.jdbc.mysql.GravitinoMysqlJdbcCatalogFactoryFlink120
+org.apache.gravitino.flink.connector.jdbc.postgresql.GravitinoPostgresJdbcCatalogFactoryFlink120
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT120.java
new file mode 100644
index 0000000000..efc2c84251
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/catalog/GravitinoCatalogManagerIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.catalog;
+
+public class GravitinoCatalogManagerIT120 extends GravitinoCatalogManagerIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT120.java
new file mode 100644
index 0000000000..89b8f2d2d0
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveCatalogIT120.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.hive;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class FlinkHiveCatalogIT120 extends FlinkHiveCatalogIT {
+
+ @Override
+ @Test
+ public void testCreateGravitinoHiveCatalogRequireOptions() {
+ // Flink 1.20 reports missing required catalog options through
IllegalArgumentException
+ // rather than the ValidationException thrown by older minor versions.
+ tableEnv.useCatalog(DEFAULT_CATALOG);
+
+ String catalogName = "gravitino_hive_sql2";
+ IllegalArgumentException exception =
+ Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () ->
+ tableEnv.executeSql(
+ String.format(
+ "create catalog %s with ("
+ + "'type'='gravitino-hive', "
+ + "'hive-conf-dir'='%s'"
+ + ")",
+ catalogName, getSharedHiveConfDir())));
+
+ Assertions.assertTrue(containsMessage(exception, "metastore.uris"),
collectMessages(exception));
+ Assertions.assertFalse(metalake.catalogExists(catalogName));
+ }
+
+ private static boolean containsMessage(Throwable throwable, String
expectedMessage) {
+ Throwable current = throwable;
+ while (current != null) {
+ String message = current.getMessage();
+ if (message != null && message.contains(expectedMessage)) {
+ return true;
+ }
+ current = current.getCause();
+ }
+
+ return false;
+ }
+
+ private static String collectMessages(Throwable throwable) {
+ StringBuilder messages = new StringBuilder();
+ Throwable current = throwable;
+ while (current != null) {
+ messages
+ .append(current.getClass().getName())
+ .append(": ")
+ .append(current.getMessage())
+ .append('\n');
+ current = current.getCause();
+ }
+
+ return messages.toString();
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT120.java
new file mode 100644
index 0000000000..662d836718
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/hive/FlinkHiveKerberosClientIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.hive;
+
+public class FlinkHiveKerberosClientIT120 extends FlinkHiveKerberosClientIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT120.java
new file mode 100644
index 0000000000..a0003c57fb
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergHiveCatalogIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.iceberg;
+
+public class FlinkIcebergHiveCatalogIT120 extends FlinkIcebergHiveCatalogIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT120.java
new file mode 100644
index 0000000000..1d272f11bd
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/iceberg/FlinkIcebergRestCatalogIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.iceberg;
+
+public class FlinkIcebergRestCatalogIT120 extends FlinkIcebergRestCatalogIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT120.java
new file mode 100644
index 0000000000..ee2c77f436
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/jdbc/FlinkJdbcMysqlCatalogIT120.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.jdbc;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class FlinkJdbcMysqlCatalogIT120 extends FlinkJdbcMysqlCatalogIT {
+
+ @Override
+ @Test
+ public void testCreateGravitinoJdbcCatalogUsingSQLMissingOptions() {
+ // Flink 1.20 reports missing required catalog options through
IllegalArgumentException
+ // rather than the ValidationException thrown by older minor versions.
+ tableEnv.useCatalog(DEFAULT_CATALOG);
+ String catalogName = "gravitino_mysql_jdbc_catalog_missing_options";
+ IllegalArgumentException exception =
+ Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () ->
+ tableEnv.executeSql(
+ String.format(
+ "create catalog %s with ("
+ + "'type'='gravitino-jdbc-mysql', "
+ + "'base-url'='%s',"
+ + "'username'='%s',"
+ + "'default-database'='%s'"
+ + ")",
+ catalogName, mysqlUrl, mysqlUsername,
mysqlDefaultDatabase)));
+
+ Assertions.assertTrue(exception.getMessage().contains("password"));
+ Assertions.assertFalse(metalake.catalogExists(catalogName));
+ }
+}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT120.java
new file mode 100644
index 0000000000..c3305a864f
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonHiveBackendIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonHiveBackendIT120 extends FlinkPaimonHiveBackendIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT120.java
new file mode 100644
index 0000000000..a718916e8e
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonJdbcBackendIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonJdbcBackendIT120 extends FlinkPaimonJdbcBackendIT {}
diff --git
a/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT120.java
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT120.java
new file mode 100644
index 0000000000..26e5154080
--- /dev/null
+++
b/flink-connector/v1.20/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/paimon/FlinkPaimonLocalFileSystemBackendIT120.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.flink.connector.integration.test.paimon;
+
+public class FlinkPaimonLocalFileSystemBackendIT120 extends
FlinkPaimonLocalFileSystemBackendIT {}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 3f0945f9c2..ae67ef69ef 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -101,10 +101,18 @@ bouncycastle = "1.84"
jodd = "3.5.2"
flink = "1.18.0"
flink18 = "1.18.0"
+flink119 = "1.19.0"
+flink120 = "1.20.0"
flinkjdbc = "3.2.0-1.18"
flinkjdbc18 = "3.2.0-1.18"
+flinkjdbc119 = "3.3.0-1.19"
+flinkjdbc120 = "3.3.0-1.20"
iceberg4flink18 = "1.9.2"
+iceberg4flink119 = "1.9.2"
+iceberg4flink120 = "1.9.2"
paimon4flink18 = "1.2.0"
+paimon4flink119 = "1.2.0"
+paimon4flink120 = "1.2.0"
# cglib upgraded from 2. to 3.3.0 for Java 17 compatibility.
# Explicit ASM dependency (9.8) is required due to cglib's internal use and
Java 17 module system.
cglib = "3.3.0"
@@ -334,6 +342,8 @@ aliyun-credentials-sdk = { group='com.aliyun',
name='credentials-java', version.
aliyun-sdk-oss = { module = "com.aliyun.oss:aliyun-sdk-oss", version.ref =
"aliyun-sdk-oss" }
flinkjdbc = {group='org.apache.flink',name='flink-connector-jdbc',
version.ref='flinkjdbc'}
flinkjdbc18 = {group='org.apache.flink',name='flink-connector-jdbc',
version.ref='flinkjdbc18'}
+flinkjdbc119 = {group='org.apache.flink',name='flink-connector-jdbc',
version.ref='flinkjdbc119'}
+flinkjdbc120 = {group='org.apache.flink',name='flink-connector-jdbc',
version.ref='flinkjdbc120'}
concurrent-trees = { group = "com.googlecode.concurrent-trees", name =
"concurrent-trees", version.ref = "concurrent-trees" }
jcasbin = { group='org.casbin', name='jcasbin', version.ref="jcasbin" }
openlineage-java= { group = "io.openlineage", name = "openlineage-java",
version.ref = "openlineage" }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index b3a9d6fb48..5f21cc7790 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -89,10 +89,23 @@ include("spark-connector:spark-common")
if (scalaVersion == "2.12") {
// flink only support scala 2.12
include("flink-connector:flink-common")
- include("flink-connector:flink-1.18", "flink-connector:flink-runtime-1.18")
+ include(
+ "flink-connector:flink-1.18",
+ "flink-connector:flink-runtime-1.18",
+ "flink-connector:flink-1.19",
+ "flink-connector:flink-runtime-1.19",
+ "flink-connector:flink-1.20",
+ "flink-connector:flink-runtime-1.20"
+ )
project(":flink-connector:flink-1.18").projectDir =
file("flink-connector/v1.18/flink")
project(":flink-connector:flink-runtime-1.18").projectDir =
file("flink-connector/v1.18/flink-runtime")
+ project(":flink-connector:flink-1.19").projectDir =
file("flink-connector/v1.19/flink")
+ project(":flink-connector:flink-runtime-1.19").projectDir =
+ file("flink-connector/v1.19/flink-runtime")
+ project(":flink-connector:flink-1.20").projectDir =
file("flink-connector/v1.20/flink")
+ project(":flink-connector:flink-runtime-1.20").projectDir =
+ file("flink-connector/v1.20/flink-runtime")
}
include("spark-connector:spark-3.3", "spark-connector:spark-runtime-3.3")
project(":spark-connector:spark-3.3").projectDir =
file("spark-connector/v3.3/spark")