This is an automated email from the ASF dual-hosted git repository.

diqiu50 pushed a commit to branch branch-jdk
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-jdk by this push:
     new 1d1eb201ab [#7823] feat(server): upgrade Gravitino server and Iceberg 
REST server mini JDK version to 17 (#7832)
1d1eb201ab is described below

commit 1d1eb201aba77a127304a48cb9e0293cfd0246d8
Author: FANNG <[email protected]>
AuthorDate: Wed Jul 30 16:07:21 2025 +0800

    [#7823] feat(server): upgrade Gravitino server and Iceberg REST server mini 
JDK version to 17 (#7832)
    
    ### What changes were proposed in this pull request?
    1. Upgrade Gravitino server and Iceberg REST server minimal JDK version
    to 17
    2. Adjust the Integration test for the current module:
        a.  JDK17  module: support JDK17 for embedded and deploy mode.
        b.  Non-JDK17 module:  support JDK17 for deploy mode only.
    3. Move integration test from `catalog-model` and `client-java` to
    `integration-test` module, which supports JDK17 in embedded mode and JDK
    7,11,17 in deploy mode.
    
    JDK17 modules: server-related modules: `:server`, `:iceberg`,
    `:catalogs`, `:lineage`, `authorizations`.
    `:catalogs:catalogs-fileset` `:catalogs:hadoop-common` is the special
    case because `bundles` modle is JDK 8 compatible and relies on them, so
    they are JDK 8, not 17.
    
    ### Why are the changes needed?
    
    We could upgrade the Iceberg version only if we upgrade the IRC and
    Gravitino server
    
    Fix: #7823
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes, the server couldn't run under JDK8, JDK11
    
    ### How was this patch tested?
    
    adding ITs
---
 .../workflows/backend-integration-test-action.yml  |  6 ++
 .github/workflows/backend-integration-test.yml     |  2 +-
 .../workflows/flink-integration-test-action.yml    |  5 +-
 .github/workflows/flink-integration-test.yml       |  4 +-
 ...test-action.yml => integration-test-action.yml} | 17 ++--
 ...d-integration-test.yml => integration-test.yml} | 13 +--
 .github/workflows/spark-integration-test.yml       |  8 +-
 build.gradle.kts                                   | 98 +++++++++++++++++++++-
 catalogs/catalog-fileset/build.gradle.kts          |  1 -
 clients/cli/build.gradle.kts                       |  3 -
 .../cli/integration/test/TableFormatOutputIT.java  |  2 +
 clients/client-java/build.gradle.kts               |  1 -
 clients/client-python/build.gradle.kts             |  7 +-
 clients/filesystem-hadoop3/build.gradle.kts        |  1 -
 .../test/GravitinoVirtualFileSystemIT.java         |  2 +
 .../test/GravitinoVirtualFileSystemS3IT.java       |  2 +
 ...vitinoVirtualFilesystemWithFSOpsDisabledIT.java |  2 +
 flink-connector/flink/build.gradle.kts             |  1 -
 .../connector/integration/test/FlinkEnvIT.java     |  2 +
 .../test/IcebergRestKerberosHiveCatalogIT.java     | 19 ++++-
 .../util/IcebergRESTServerManagerForDeploy.java    |  8 +-
 integration-test-common/build.gradle.kts           |  1 -
 .../gravitino/integration/test/MiniGravitino.java  | 17 ++--
 .../gravitino/integration/test/util/BaseIT.java    | 16 ++--
 .../integration/test/util/GravitinoITUtils.java    | 16 +++-
 .../gravitino/integration/test/util/ITUtils.java   |  2 +
 .../build.gradle.kts                               | 19 ++---
 .../catalogs/build.gradle.kts                      | 19 ++---
 .../catalogs/catalog-model-it}/build.gradle.kts    | 74 +++++++---------
 .../integration/test/ModelCatalogOperationsIT.java |  0
 .../src/test/resources/log4j2.properties           | 73 ++++++++++++++++
 .../clients/build.gradle.kts                       | 19 ++---
 .../clients/client-java-it}/build.gradle.kts       | 41 +++------
 .../gravitino/client/integration/test/AuditIT.java |  0
 .../client/integration/test/CatalogIT.java         |  0
 .../client/integration/test/MetalakeIT.java        | 36 ++++----
 .../gravitino/client/integration/test/TagIT.java   |  0
 .../integration/test/VersionOperationsIT.java      |  0
 .../test/authorization/AccessControlIT.java        |  0
 .../authorization/AccessControlNotAllowIT.java     |  0
 .../authorization/BaseRestApiAuthorizationIT.java  |  0
 .../test/authorization/CatalogAuthorizationIT.java |  0
 .../test/authorization/CheckCurrentUserIT.java     |  5 +-
 .../test/authorization/FilesetAuthorizationIT.java |  0
 .../test/authorization/GroupAuthorizationIT.java   |  0
 .../test/authorization/KerberosOperationsIT.java   |  0
 .../authorization/MetalakeAuthorizationIT.java     |  0
 .../test/authorization/ModelAuthorizationIT.java   |  0
 .../test/authorization/MultiAuthOperationsIT.java  |  3 +-
 .../test/authorization/OAuth2OperationsIT.java     |  0
 .../test/authorization/OwnerAuthorizationIT.java   |  0
 .../integration/test/authorization/OwnerIT.java    |  0
 .../authorization/PermissionAuthorizationIT.java   |  0
 .../test/authorization/RoleAuthorizationIT.java    |  0
 .../test/authorization/SchemaAuthorizationIT.java  |  0
 .../test/authorization/TableAuthorizationIT.java   |  0
 .../test/authorization/TopicAuthorizationIT.java   |  0
 .../test/authorization/UserAuthorizationIT.java    |  0
 .../src/test/resources/log4j2.properties           | 73 ++++++++++++++++
 settings.gradle.kts                                |  1 +
 spark-connector/spark-common/build.gradle.kts      |  3 -
 .../connector/integration/test/SparkEnvIT.java     |  2 +
 spark-connector/v3.3/spark/build.gradle.kts        | 10 ---
 spark-connector/v3.4/spark/build.gradle.kts        | 10 ---
 spark-connector/v3.5/spark/build.gradle.kts        | 10 ---
 65 files changed, 429 insertions(+), 225 deletions(-)

diff --git a/.github/workflows/backend-integration-test-action.yml 
b/.github/workflows/backend-integration-test-action.yml
index 9d69a2914e..ab97d73346 100644
--- a/.github/workflows/backend-integration-test-action.yml
+++ b/.github/workflows/backend-integration-test-action.yml
@@ -62,6 +62,12 @@ jobs:
           -x :spark-connector:spark-runtime-3.3:test -x 
:spark-connector:spark-runtime-3.4:test -x 
:spark-connector:spark-runtime-3.5:test
           -x :trino-connector:integration-test:test -x 
:trino-connector:trino-connector:test
           -x :authorizations:authorization-chain:test -x 
:authorizations:authorization-ranger:test 
+          -x :integration-test:test -x :catalogs:catalog-fileset:test
+
+      - name: Test catalog fileset
+        if: ${{ inputs.test-mode == 'deploy' }}
+        run: |
+          ./gradlew :catalogs:catalog-fileset:test -PjdkVersion=${{ 
inputs.java-version }} -PjdbcBackend=${{ inputs.backend }} 
-PskipDockerTests=false -PtestMode=deploy
 
       - name: Upload integrate tests reports
         uses: actions/upload-artifact@v4
diff --git a/.github/workflows/backend-integration-test.yml 
b/.github/workflows/backend-integration-test.yml
index d5cc20a8c7..0aeb4fc1bb 100644
--- a/.github/workflows/backend-integration-test.yml
+++ b/.github/workflows/backend-integration-test.yml
@@ -54,7 +54,7 @@ jobs:
     strategy:
       matrix:
         architecture: [linux/amd64]
-        java-version: [ 8, 11, 17 ]
+        java-version: [ 17 ]
         backend: [ h2, mysql, postgresql ]
         test-mode: [ embedded, deploy ]
         exclude:
diff --git a/.github/workflows/flink-integration-test-action.yml 
b/.github/workflows/flink-integration-test-action.yml
index 55d7250fca..6e23539095 100644
--- a/.github/workflows/flink-integration-test-action.yml
+++ b/.github/workflows/flink-integration-test-action.yml
@@ -46,9 +46,8 @@ jobs:
 
       - name: Flink Integration Test
         id: integrationTest
-        # run embedded mode and deploy mode integration tests
+        # run deploy mode integration tests
         run: |
-          ./gradlew -PskipTests -PtestMode=embedded -PjdkVersion=${{ 
inputs.java-version }} -PskipDockerTests=false :flink-connector:flink:test 
--tests "org.apache.gravitino.flink.connector.integration.test.**"
           ./gradlew -PskipTests -PtestMode=deploy -PjdkVersion=${{ 
inputs.java-version }} -PskipDockerTests=false :flink-connector:flink:test 
--tests "org.apache.gravitino.flink.connector.integration.test.**"
 
       - name: Upload integrate tests reports
@@ -63,4 +62,4 @@ jobs:
             distribution/package/logs/gravitino-server.out
             distribution/package/logs/gravitino-server.log
             catalogs/**/*.log
-            catalogs/**/*.tar
\ No newline at end of file
+            catalogs/**/*.tar
diff --git a/.github/workflows/flink-integration-test.yml 
b/.github/workflows/flink-integration-test.yml
index 2bd91792cf..ca62e1ad1f 100644
--- a/.github/workflows/flink-integration-test.yml
+++ b/.github/workflows/flink-integration-test.yml
@@ -53,7 +53,7 @@ jobs:
     strategy:
       matrix:
         architecture: [linux/amd64]
-        java-version: [ 8, 11, 17 ]
+        java-version: [ 17 ]
     uses: ./.github/workflows/flink-integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
@@ -69,4 +69,4 @@ jobs:
     uses: ./.github/workflows/flink-integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
-      java-version: ${{ matrix.java-version }}
\ No newline at end of file
+      java-version: ${{ matrix.java-version }}
diff --git a/.github/workflows/backend-integration-test-action.yml 
b/.github/workflows/integration-test-action.yml
similarity index 65%
copy from .github/workflows/backend-integration-test-action.yml
copy to .github/workflows/integration-test-action.yml
index 9d69a2914e..529507f785 100644
--- a/.github/workflows/backend-integration-test-action.yml
+++ b/.github/workflows/integration-test-action.yml
@@ -1,6 +1,6 @@
-name: Backend Integration Test Action
+name: New Integration Test Action
 
-# run backend integration test
+# run integration test
 on:
   workflow_call:
     inputs:
@@ -53,15 +53,10 @@ jobs:
         run: |
           dev/ci/util_free_space.sh
 
-      - name: Backend Integration Test (JDK${{ inputs.java-version }}-${{ 
inputs.test-mode }}-${{ inputs.backend }})
+      - name: Integration Test (JDK${{ inputs.java-version }}-${{ 
inputs.test-mode }}-${{ inputs.backend }})
         id: integrationTest
         run: >
-          ./gradlew test -PskipTests -PtestMode=${{ inputs.test-mode }} 
-PjdkVersion=${{ inputs.java-version }} -PjdbcBackend=${{ inputs.backend }} 
-PskipDockerTests=false
-          -x :web:web:test -x :web:integration-test:test -x 
:clients:client-python:test -x :flink-connector:flink: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
-          -x :trino-connector:integration-test:test -x 
:trino-connector:trino-connector:test
-          -x :authorizations:authorization-chain:test -x 
:authorizations:authorization-ranger:test 
+          ./gradlew :integration-test:test -PtestMode=${{ inputs.test-mode }} 
-PjdkVersion=${{ inputs.java-version }} -PjdbcBackend=${{ inputs.backend }} 
-PskipDockerTests=false
 
       - name: Upload integrate tests reports
         uses: actions/upload-artifact@v4
@@ -73,6 +68,6 @@ jobs:
             iceberg/iceberg-rest-server/build/*.log
             distribution/package/logs/*.out
             distribution/package/logs/*.log
-            catalogs/**/*.log
-            catalogs/**/*.tar
+            integration-test/**/**/*.log
+            integration-test/**/**/*.tar
             distribution/**/*.log
diff --git a/.github/workflows/backend-integration-test.yml 
b/.github/workflows/integration-test.yml
similarity index 90%
copy from .github/workflows/backend-integration-test.yml
copy to .github/workflows/integration-test.yml
index d5cc20a8c7..a055dc9454 100644
--- a/.github/workflows/backend-integration-test.yml
+++ b/.github/workflows/integration-test.yml
@@ -1,4 +1,4 @@
-name: Backend Integration Test
+name: New Integration Test
 
 # Controls when the workflow will run
 on:
@@ -36,6 +36,7 @@ jobs:
               - gradle/**
               - iceberg/**
               - integration-test-common/**
+              - integration-test/**
               - meta/**
               - scripts/**
               - server/**
@@ -55,7 +56,7 @@ jobs:
       matrix:
         architecture: [linux/amd64]
         java-version: [ 8, 11, 17 ]
-        backend: [ h2, mysql, postgresql ]
+        backend: [ h2, postgresql ]
         test-mode: [ embedded, deploy ]
         exclude:
           - test-mode: 'embedded'
@@ -64,7 +65,7 @@ jobs:
             backend: 'postgresql'
           - test-mode: 'deploy'
             backend: 'h2'
-    uses: ./.github/workflows/backend-integration-test-action.yml
+    uses: ./.github/workflows/integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
       java-version: ${{ matrix.java-version }}
@@ -77,8 +78,8 @@ jobs:
     strategy:
       matrix:
         architecture: [ linux/amd64 ]
-        java-version: [ 17 ]
-        backend: [ h2, mysql, postgresql ]
+        java-version: [ 8, 11, 17 ]
+        backend: [ mysql ]
         test-mode: [ embedded, deploy ]
         exclude:
           - test-mode: 'embedded'
@@ -87,7 +88,7 @@ jobs:
             backend: 'postgresql'
           - test-mode: 'deploy'
             backend: 'h2'
-    uses: ./.github/workflows/backend-integration-test-action.yml
+    uses: ./.github/workflows/integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
       java-version: ${{ matrix.java-version }}
diff --git a/.github/workflows/spark-integration-test.yml 
b/.github/workflows/spark-integration-test.yml
index 2b6364cbcf..47b95af1a9 100644
--- a/.github/workflows/spark-integration-test.yml
+++ b/.github/workflows/spark-integration-test.yml
@@ -53,9 +53,9 @@ jobs:
       matrix:
         # Integration test for AMD64 architecture
         architecture: [linux/amd64]
-        java-version: [ 8, 11, 17 ]
+        java-version: [ 17 ]
         scala-version: [ 2.12 ]
-        test-mode: [ embedded, deploy ]
+        test-mode: [ deploy ]
     uses: ./.github/workflows/spark-integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
@@ -72,10 +72,10 @@ jobs:
         architecture: [linux/amd64]
         java-version: [ 17 ]
         scala-version: [ 2.12 ]
-        test-mode: [ embedded, deploy ]
+        test-mode: [ deploy ]
     uses: ./.github/workflows/spark-integration-test-action.yml
     with:
       architecture: ${{ matrix.architecture }}
       java-version: ${{ matrix.java-version }}
       scala-version: ${{ matrix.scala-version }}
-      test-mode: ${{ matrix.test-mode }}
\ No newline at end of file
+      test-mode: ${{ matrix.test-mode }}
diff --git a/build.gradle.kts b/build.gradle.kts
index 6f3a334b93..51f8a4652e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -76,7 +76,10 @@ if (scalaVersion !in listOf("2.12", "2.13")) {
   throw GradleException("Scala version $scalaVersion is not supported.")
 }
 
-project.extra["extraJvmArgs"] = if (extra["jdkVersion"] in listOf("8", "11")) {
+rootProject.extra["isTestModeEmbedded"] = project.properties["testMode"] as? 
String ?: "embedded" == "embedded"
+var JAVA_17 = JavaLanguageVersion.of(17)
+
+project.extra["extraJvmArgs"] = if (getJdkVersionForTest(project) != JAVA_17) {
   listOf()
 } else {
   listOf(
@@ -105,6 +108,53 @@ project.extra["extraJvmArgs"] = if (extra["jdkVersion"] in 
listOf("8", "11")) {
   )
 }
 
+fun useJDK17(project: Project): Boolean {
+  val name = project.name.lowercase()
+  val path = project.path.lowercase()
+
+  // bundles module rely on catalog-fileset module
+  if (name == "catalog-common" || name == "hadoop-common" || name == 
"catalog-fileset") {
+    return false
+  }
+
+  if (path.startsWith(":catalogs:") || path.startsWith(":iceberg:") || 
path.startsWith(":authorizations:")) {
+    return true
+  }
+
+  if (path == ":trino-connector:integration-test" || path == 
":web:integration-test") {
+    return true
+  }
+
+  if (name in listOf("server", "lineage")) {
+    return true
+  }
+
+  // All ITs could only run embedded mode in JDK17
+  if (path.startsWith(":integration-test:") && 
rootProject.extra["isTestModeEmbedded"] == true) {
+    return true
+  }
+
+  return false
+}
+
+// Use JDK 17 for embedded mode, use the JDK from `jdkVersion` for deploy mode
+fun getJdkVersionForTest(project: Project): JavaLanguageVersion {
+  if (rootProject.extra["isTestModeEmbedded"] == true) {
+    return JAVA_17
+  }
+
+  return JavaLanguageVersion.of(extra["jdkVersion"].toString())
+}
+
+val toolchainService: JavaToolchainService = extensions.getByType()
+fun getJdkHome(version: Int): Provider<File> {
+  return toolchainService.launcherFor {
+    languageVersion.set(JavaLanguageVersion.of(version))
+  }.map { it.metadata.installationPath.asFile }
+}
+val jdk17Home = getJdkHome(17).get()
+rootProject.extra["jdk17Home"] = jdk17Home
+
 val pythonVersion: String = project.properties["pythonVersion"] as? String ?: 
project.extra["pythonVersion"].toString()
 project.extra["pythonVersion"] = pythonVersion
 
@@ -170,6 +220,7 @@ allprojects {
       }
       param.environment("HADOOP_HOME", "/tmp")
       param.environment("PROJECT_VERSION", project.version)
+      param.environment("JDK17_HOME", jdk17Home)
 
       // Gravitino CI Docker image
       param.environment("GRAVITINO_CI_HIVE_DOCKER_IMAGE", 
"apache/gravitino-ci:hive-0.1.20")
@@ -273,6 +324,39 @@ subprojects {
     mavenLocal()
   }
 
+  tasks.register("printJvm") {
+    group = "help"
+    description = "print JVM information"
+
+    doLast {
+
+      val compileJvmVersion = 
tasks.withType<JavaCompile>().firstOrNull()?.javaCompiler?.get()
+        ?.metadata?.languageVersion?.asInt() ?: "undefined"
+
+      val testJvmVersion = 
tasks.withType<Test>().firstOrNull()?.javaLauncher?.get()
+        ?.metadata?.languageVersion?.asInt() ?: "undefined"
+
+      val testJvmArgs = tasks.withType<Test>().firstOrNull()?.jvmArgs ?: 
listOf()
+
+      val targetJvmVersion = (java.targetCompatibility?.majorVersion ?: 
"undefined")
+
+      val sourceJvmVersion = (java.sourceCompatibility?.majorVersion ?: 
"undefined")
+
+      println(
+        """
+            |=== ${project.name} JVM information===
+            | project path: ${project.path}
+            | JVM for compile: $compileJvmVersion
+            | JVM for test: $testJvmVersion
+            | JVM test args: $testJvmArgs
+            | target JVM version: $targetJvmVersion
+            | source JVM version: $sourceJvmVersion
+            |==================================
+        """.trimMargin()
+      )
+    }
+  }
+
   java {
     toolchain {
       // Some JDK vendors like Homebrew installed OpenJDK 17 have problems in 
building trino-connector:
@@ -283,7 +367,11 @@ subprojects {
         if (OperatingSystem.current().isMacOsX) {
           vendor.set(JvmVendorSpec.AMAZON)
         }
-        languageVersion.set(JavaLanguageVersion.of(17))
+        languageVersion.set(JAVA_17)
+      } else if (useJDK17(getProject())) {
+        languageVersion.set(JAVA_17)
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
       } else {
         
languageVersion.set(JavaLanguageVersion.of(extra["jdkVersion"].toString().toInt()))
         sourceCompatibility = JavaVersion.VERSION_1_8
@@ -472,6 +560,12 @@ subprojects {
   }
 
   tasks.configureEach<Test> {
+    javaLauncher.set(
+      javaToolchains.launcherFor {
+        languageVersion.set(getJdkVersionForTest(project))
+      }
+    )
+
     if (project.name != "server-common") {
       val initTest = project.extra.get("initTestParam") as (Test) -> Unit
       initTest(this)
diff --git a/catalogs/catalog-fileset/build.gradle.kts 
b/catalogs/catalog-fileset/build.gradle.kts
index 88382a38a8..449dfcb26c 100644
--- a/catalogs/catalog-fileset/build.gradle.kts
+++ b/catalogs/catalog-fileset/build.gradle.kts
@@ -71,7 +71,6 @@ dependencies {
   testImplementation(project(":bundles:aliyun-bundle", configuration = 
"shadow"))
   testImplementation(project(":bundles:azure-bundle", configuration = 
"shadow"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
-  testImplementation(project(":server"))
   testImplementation(project(":server-common"))
   testImplementation(libs.bundles.log4j)
   testImplementation(libs.hadoop3.gcs)
diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts
index 9358808f9f..a37e72536d 100644
--- a/clients/cli/build.gradle.kts
+++ b/clients/cli/build.gradle.kts
@@ -42,9 +42,6 @@ dependencies {
   testImplementation(project(":core")) {
     exclude("org.apache.logging.log4j")
   }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-  }
   testImplementation(project(":server-common")) {
     exclude("org.apache.logging.log4j")
   }
diff --git 
a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java
 
b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java
index bca9e960ff..7e1fe98e09 100644
--- 
a/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java
+++ 
b/clients/cli/src/test/java/org/apache/gravitino/cli/integration/test/TableFormatOutputIT.java
@@ -29,7 +29,9 @@ import org.apache.gravitino.cli.commands.Command;
 import org.apache.gravitino.integration.test.util.BaseIT;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledIf;
 
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public class TableFormatOutputIT extends BaseIT {
   private String gravitinoUrl;
 
diff --git a/clients/client-java/build.gradle.kts 
b/clients/client-java/build.gradle.kts
index 30b3a15deb..fe630667fa 100644
--- a/clients/client-java/build.gradle.kts
+++ b/clients/client-java/build.gradle.kts
@@ -42,7 +42,6 @@ dependencies {
 
   testImplementation(project(":core"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
-  testImplementation(project(":server"))
   testImplementation(project(":server-common"))
 
   testImplementation(libs.bundles.jersey)
diff --git a/clients/client-python/build.gradle.kts 
b/clients/client-python/build.gradle.kts
index a9873ea22c..24be469be1 100644
--- a/clients/client-python/build.gradle.kts
+++ b/clients/client-python/build.gradle.kts
@@ -31,6 +31,8 @@ pythonPlugin {
   pythonVersion.set(project.rootProject.extra["pythonVersion"].toString())
 }
 
+var jdk17Home = rootProject.extra["jdk17Home"]
+
 fun deleteCacheDir(targetDir: String) {
   project.fileTree(project.projectDir).matching {
     include("**/$targetDir/**")
@@ -79,7 +81,10 @@ fun waitForServerIsReady(host: String = "http://localhost";, 
port: Int = 8090, ti
 }
 
 fun gravitinoServer(operation: String) {
-    val process = 
ProcessBuilder("${project.rootDir.path}/distribution/package/bin/gravitino.sh", 
operation).start()
+    val processBuilder = 
ProcessBuilder("${project.rootDir.path}/distribution/package/bin/gravitino.sh", 
operation)
+    var env = processBuilder.environment();
+    env["JAVA_HOME"] = jdk17Home.toString()
+    var process = processBuilder.start()
     val exitCode = process.waitFor()
     if (exitCode == 0) {
       val currentContext = process.inputStream.bufferedReader().readText()
diff --git a/clients/filesystem-hadoop3/build.gradle.kts 
b/clients/filesystem-hadoop3/build.gradle.kts
index ace9fa42d9..7f68f35268 100644
--- a/clients/filesystem-hadoop3/build.gradle.kts
+++ b/clients/filesystem-hadoop3/build.gradle.kts
@@ -44,7 +44,6 @@ dependencies {
   testImplementation(project(":core"))
   testImplementation(project(":catalogs:catalog-fileset"))
   testImplementation(project(":common"))
-  testImplementation(project(":server"))
   testImplementation(project(":server-common"))
   testImplementation(project(":clients:client-java"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemIT.java
 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemIT.java
index 0b5c5995e1..f5840c1b35 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemIT.java
+++ 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemIT.java
@@ -54,10 +54,12 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Tag("gravitino-docker-test")
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public class GravitinoVirtualFileSystemIT extends BaseIT {
   private static final Logger LOG = 
LoggerFactory.getLogger(GravitinoVirtualFileSystemIT.class);
   protected static final ContainerSuite containerSuite = 
ContainerSuite.getInstance();
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemS3IT.java
 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemS3IT.java
index 05fc78475c..5f1f292dd0 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemS3IT.java
+++ 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFileSystemS3IT.java
@@ -38,11 +38,13 @@ import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.condition.DisabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testcontainers.containers.Container;
 import org.testcontainers.shaded.org.awaitility.Awaitility;
 
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public class GravitinoVirtualFileSystemS3IT extends 
GravitinoVirtualFileSystemIT {
   private static final Logger LOG = 
LoggerFactory.getLogger(GravitinoVirtualFileSystemS3IT.class);
 
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
index 2564bac84f..8a24bebf68 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
+++ 
b/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
@@ -20,8 +20,10 @@ package 
org.apache.gravitino.filesystem.hadoop.integration.test;
 
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.condition.DisabledIf;
 
 @Tag("gravitino-docker-test")
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public class GravitinoVirtualFilesystemWithFSOpsDisabledIT extends 
GravitinoVirtualFileSystemIT {
 
   @BeforeAll
diff --git a/flink-connector/flink/build.gradle.kts 
b/flink-connector/flink/build.gradle.kts
index ea0a2d0e76..1dddd22480 100644
--- a/flink-connector/flink/build.gradle.kts
+++ b/flink-connector/flink/build.gradle.kts
@@ -88,7 +88,6 @@ dependencies {
   testImplementation(project(":core"))
   testImplementation(project(":common"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
-  testImplementation(project(":server"))
   testImplementation(project(":server-common"))
   testImplementation(libs.junit.jupiter.api)
   testImplementation(libs.junit.jupiter.params)
diff --git 
a/flink-connector/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/FlinkEnvIT.java
 
b/flink-connector/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/FlinkEnvIT.java
index e2cdbbd69b..8baf604d51 100644
--- 
a/flink-connector/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/FlinkEnvIT.java
+++ 
b/flink-connector/flink/src/test/java/org/apache/gravitino/flink/connector/integration/test/FlinkEnvIT.java
@@ -48,9 +48,11 @@ import org.apache.gravitino.server.web.JettyServerConfig;
 import org.apache.hadoop.fs.FileSystem;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.DisabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public abstract class FlinkEnvIT extends BaseIT {
   private static final Logger LOG = LoggerFactory.getLogger(FlinkEnvIT.class);
   private static final ContainerSuite CONTAINER_SUITE = 
ContainerSuite.getInstance();
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/IcebergRestKerberosHiveCatalogIT.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/IcebergRestKerberosHiveCatalogIT.java
index cea5ced31b..7ab4be49a7 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/IcebergRestKerberosHiveCatalogIT.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/IcebergRestKerberosHiveCatalogIT.java
@@ -19,6 +19,7 @@
 package org.apache.gravitino.iceberg.integration.test;
 
 import java.io.File;
+import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.util.HashMap;
@@ -81,7 +82,7 @@ public class IcebergRestKerberosHiveCatalogIT extends 
IcebergRESTHiveCatalogIT {
       System.setProperty("java.security.krb5.realm", "HADOOPKRB");
       System.setProperty("java.security.krb5.kdc", ip);
 
-      sun.security.krb5.Config.refresh();
+      refreshKerberosConfig();
       resetDefaultRealm();
 
       // Give cli@HADOOPKRB permission to access the hdfs
@@ -157,4 +158,20 @@ public class IcebergRestKerberosHiveCatalogIT extends 
IcebergRESTHiveCatalogIT {
 
     return Objects.equals(mode, ITUtils.EMBEDDED_TEST_MODE);
   }
+
+  private static void refreshKerberosConfig() {
+    Class<?> classRef;
+    try {
+      if (System.getProperty("java.vendor").contains("IBM")) {
+        classRef = Class.forName("com.ibm.security.krb5.internal.Config");
+      } else {
+        classRef = Class.forName("sun.security.krb5.Config");
+      }
+
+      Method refershMethod = classRef.getMethod("refresh");
+      refershMethod.invoke(null);
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
 }
diff --git 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/util/IcebergRESTServerManagerForDeploy.java
 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/util/IcebergRESTServerManagerForDeploy.java
index ca4ba0cc41..d32032fef5 100644
--- 
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/util/IcebergRESTServerManagerForDeploy.java
+++ 
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/integration/test/util/IcebergRESTServerManagerForDeploy.java
@@ -18,6 +18,7 @@
  */
 package org.apache.gravitino.iceberg.integration.test.util;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
@@ -30,7 +31,6 @@ import 
org.apache.gravitino.integration.test.util.CommandExecutor;
 import org.apache.gravitino.integration.test.util.DownloaderUtils;
 import org.apache.gravitino.integration.test.util.ProcessData;
 import org.apache.gravitino.integration.test.util.ProcessData.TypesOfData;
-import org.testcontainers.shaded.com.google.common.collect.ImmutableMap;
 
 public class IcebergRESTServerManagerForDeploy extends 
IcebergRESTServerManager {
 
@@ -55,6 +55,7 @@ public class IcebergRESTServerManagerForDeploy extends 
IcebergRESTServerManager
         SQLITE_DRIVER_DOWNLOAD_URL,
         Paths.get(icebergRESTServerHome.toString(), "iceberg-rest-server", 
"libs").toString());
 
+    String jdk17Home = System.getenv("JDK17_HOME");
     String gravitinoRestStartShell = icebergRESTServerHome.toString() + 
"/bin/" + SCRIPT_NAME;
     String krb5Path = System.getProperty("java.security.krb5.conf");
     if (krb5Path != null) {
@@ -76,7 +77,10 @@ public class IcebergRESTServerManagerForDeploy extends 
IcebergRESTServerManager
         tmp.setExecutable(true);
         LOG.info("modifiedGravitinoStartShell content: \n{}", content);
         CommandExecutor.executeCommandLocalHost(
-            modifiedGravitinoStartShell + " start", false, 
ProcessData.TypesOfData.OUTPUT);
+            modifiedGravitinoStartShell + " start",
+            false,
+            ProcessData.TypesOfData.OUTPUT,
+            ImmutableMap.of("JAVA_HOME", jdk17Home));
       } catch (Exception e) {
         LOG.error("Can replace /etc/krb5.conf with real kerberos 
configuration", e);
       }
diff --git a/integration-test-common/build.gradle.kts 
b/integration-test-common/build.gradle.kts
index bd15dc2a34..419ba2818d 100644
--- a/integration-test-common/build.gradle.kts
+++ b/integration-test-common/build.gradle.kts
@@ -30,7 +30,6 @@ dependencies {
   testImplementation(project(":clients:client-java"))
   testImplementation(project(":common"))
   testImplementation(project(":core"))
-  testImplementation(project(":server"))
   testImplementation(project(":server-common"))
   testImplementation(libs.bundles.jetty)
   testImplementation(libs.bundles.jersey)
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/MiniGravitino.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/MiniGravitino.java
index d0ce1710d7..1a86637f82 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/MiniGravitino.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/MiniGravitino.java
@@ -47,7 +47,6 @@ import org.apache.gravitino.integration.test.util.ITUtils;
 import org.apache.gravitino.integration.test.util.KerberosProviderHelper;
 import org.apache.gravitino.integration.test.util.OAuthMockDataProvider;
 import org.apache.gravitino.rest.RESTUtils;
-import org.apache.gravitino.server.GravitinoServer;
 import org.apache.gravitino.server.ServerConfig;
 import org.apache.gravitino.server.web.JettyServerConfig;
 import org.slf4j.Logger;
@@ -93,7 +92,7 @@ public class MiniGravitino {
     // Generate random Gravitino Server port and backend storage path, 
avoiding conflicts
     customizeConfigFile(
         ITUtils.joinPath(gravitinoRootDir, "conf", "gravitino.conf.template"),
-        ITUtils.joinPath(mockConfDir.getAbsolutePath(), 
GravitinoServer.CONF_FILE));
+        ITUtils.joinPath(mockConfDir.getAbsolutePath(), 
ITUtils.GRAVITINO_CONF_FILE));
 
     Files.copy(
         Paths.get(ITUtils.joinPath(gravitinoRootDir, "conf", 
"gravitino-env.sh.template")),
@@ -114,7 +113,7 @@ public class MiniGravitino {
 
     // Initialize the REST client
     JettyServerConfig jettyServerConfig =
-        JettyServerConfig.fromConfig(serverConfig, 
GravitinoServer.WEBSERVER_CONF_PREFIX);
+        JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
     this.host = jettyServerConfig.getHost();
     this.port = jettyServerConfig.getHttpPort();
     String URI = String.format("http://%s:%d";, host, port);
@@ -145,10 +144,12 @@ public class MiniGravitino {
         executor.submit(
             () -> {
               try {
-                GravitinoServer.main(
-                    new String[] {
-                      ITUtils.joinPath(mockConfDir.getAbsolutePath(), 
"gravitino.conf")
-                    });
+                String configPath =
+                    ITUtils.joinPath(mockConfDir.getAbsolutePath(), 
"gravitino.conf");
+                String[] args = new String[] {configPath};
+                Class<?> gravitinoServerClass =
+                    
Class.forName("org.apache.gravitino.server.GravitinoServer");
+                gravitinoServerClass.getMethod("main", 
String[].class).invoke(null, (Object) args);
               } catch (Exception e) {
                 LOG.error("Exception in startup MiniGravitino Server ", e);
                 throw new RuntimeException(e);
@@ -235,7 +236,7 @@ public class MiniGravitino {
       throws IOException {
     Map<String, String> configMap = new HashMap<>();
     configMap.put(
-        GravitinoServer.WEBSERVER_CONF_PREFIX + 
JettyServerConfig.WEBSERVER_HTTP_PORT.getKey(),
+        ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX + 
JettyServerConfig.WEBSERVER_HTTP_PORT.getKey(),
         String.valueOf(RESTUtils.findAvailablePort(2000, 3000)));
 
     configMap.putAll(getIcebergRestServiceConfigs());
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/BaseIT.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/BaseIT.java
index 72923341b9..4ee8a04d8f 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/BaseIT.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/BaseIT.java
@@ -21,7 +21,6 @@ package org.apache.gravitino.integration.test.util;
 import static org.apache.gravitino.Configs.ENTITY_RELATIONAL_JDBC_BACKEND_PATH;
 import static 
org.apache.gravitino.integration.test.util.TestDatabaseName.PG_CATALOG_POSTGRESQL_IT;
 import static 
org.apache.gravitino.integration.test.util.TestDatabaseName.PG_JDBC_BACKEND;
-import static 
org.apache.gravitino.server.GravitinoServer.WEBSERVER_CONF_PREFIX;
 
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
@@ -60,7 +59,6 @@ import 
org.apache.gravitino.integration.test.MiniGravitinoContext;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.MySQLContainer;
 import org.apache.gravitino.integration.test.container.PostgreSQLContainer;
-import org.apache.gravitino.server.GravitinoServer;
 import org.apache.gravitino.server.ServerConfig;
 import org.apache.gravitino.server.web.JettyServerConfig;
 import org.apache.hadoop.security.UserGroupInformation;
@@ -125,7 +123,7 @@ public class BaseIT {
 
   public int getGravitinoServerPort() {
     JettyServerConfig jettyServerConfig =
-        JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX);
+        JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
     return jettyServerConfig.getHttpPort();
   }
 
@@ -135,7 +133,7 @@ public class BaseIT {
 
   private void rewriteGravitinoServerConfig() throws IOException {
     String gravitinoHome = System.getenv("GRAVITINO_HOME");
-    Path configPath = Paths.get(gravitinoHome, "conf", 
GravitinoServer.CONF_FILE);
+    Path configPath = Paths.get(gravitinoHome, "conf", 
ITUtils.GRAVITINO_CONF_FILE);
     if (originConfig == null) {
       originConfig = FileUtils.readFileToString(configPath.toFile(), 
StandardCharsets.UTF_8);
     }
@@ -144,7 +142,7 @@ public class BaseIT {
       return;
     }
 
-    String tmpFileName = GravitinoServer.CONF_FILE + ".tmp";
+    String tmpFileName = ITUtils.GRAVITINO_CONF_FILE + ".tmp";
     Path tmpPath = Paths.get(gravitinoHome, "conf", tmpFileName);
     Files.deleteIfExists(tmpPath);
 
@@ -154,7 +152,7 @@ public class BaseIT {
 
   private void recoverGravitinoServerConfig() throws IOException {
     String gravitinoHome = System.getenv("GRAVITINO_HOME");
-    Path configPath = Paths.get(gravitinoHome, "conf", 
GravitinoServer.CONF_FILE);
+    Path configPath = Paths.get(gravitinoHome, "conf", 
ITUtils.GRAVITINO_CONF_FILE);
 
     if (originConfig != null) {
       Files.deleteIfExists(configPath);
@@ -337,14 +335,14 @@ public class BaseIT {
       serverConfig = miniGravitino.getServerConfig();
     } else {
       rewriteGravitinoServerConfig();
-      serverConfig.loadFromFile(GravitinoServer.CONF_FILE);
+      serverConfig.loadFromFile(ITUtils.GRAVITINO_CONF_FILE);
 
       setupJdbcDrivers();
 
       GravitinoITUtils.startGravitinoServer();
 
       JettyServerConfig jettyServerConfig =
-          JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX);
+          JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
       String checkServerUrl =
           "http://";
               + jettyServerConfig.getHost()
@@ -358,7 +356,7 @@ public class BaseIT {
     }
 
     JettyServerConfig jettyServerConfig =
-        JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX);
+        JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
 
     serverUri = "http://"; + jettyServerConfig.getHost() + ":" + 
jettyServerConfig.getHttpPort();
 
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/GravitinoITUtils.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/GravitinoITUtils.java
index 4ed7fbf295..b5177bcb22 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/GravitinoITUtils.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/GravitinoITUtils.java
@@ -18,10 +18,13 @@
  */
 package org.apache.gravitino.integration.test.util;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,6 +37,9 @@ public class GravitinoITUtils {
 
   public static void startGravitinoServer() {
     String gravitinoStartShell = System.getenv("GRAVITINO_HOME") + 
"/bin/gravitino.sh";
+    // Gravitino server could only start with JDK17
+    String jdk17Home = System.getenv("JDK17_HOME");
+    Preconditions.checkArgument(StringUtils.isNotBlank(jdk17Home), "JDK17_HOME 
is not set");
 
     String krb5Path = System.getProperty("java.security.krb5.conf");
     if (krb5Path != null) {
@@ -54,13 +60,19 @@ public class GravitinoITUtils {
         tmp.setExecutable(true);
         LOG.info("modifiedGravitinoStartShell content: \n{}", content);
         CommandExecutor.executeCommandLocalHost(
-            modifiedGravitinoStartShell + " start", false, 
ProcessData.TypesOfData.OUTPUT);
+            modifiedGravitinoStartShell + " start",
+            false,
+            ProcessData.TypesOfData.OUTPUT,
+            ImmutableMap.of("JAVA_HOME", jdk17Home));
       } catch (Exception e) {
         LOG.error("Can replace /etc/krb5.conf with real kerberos 
configuration", e);
       }
     } else {
       CommandExecutor.executeCommandLocalHost(
-          gravitinoStartShell + " start", false, 
ProcessData.TypesOfData.OUTPUT);
+          gravitinoStartShell + " start",
+          false,
+          ProcessData.TypesOfData.OUTPUT,
+          ImmutableMap.of("JAVA_HOME", jdk17Home));
     }
     // wait for server to start.
     sleep(3000, false);
diff --git 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/ITUtils.java
 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/ITUtils.java
index 508c5fb42e..fe894689b6 100644
--- 
a/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/ITUtils.java
+++ 
b/integration-test-common/src/test/java/org/apache/gravitino/integration/test/util/ITUtils.java
@@ -52,6 +52,8 @@ public class ITUtils {
   public static final String TEST_MODE = "testMode";
   public static final String EMBEDDED_TEST_MODE = "embedded";
   public static final String DEPLOY_TEST_MODE = "deploy";
+  public static final String GRAVITINO_CONF_FILE = "gravitino.conf";
+  public static final String GRAVITINO_WEBSERVER_CONF_PREFIX = 
"gravitino.server.webserver.";
 
   public static String joinPath(String... dirs) {
     return String.join(File.separator, dirs);
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
 b/integration-test/build.gradle.kts
similarity index 66%
copy from 
clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
copy to integration-test/build.gradle.kts
index 2564bac84f..42311aa45b 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
+++ b/integration-test/build.gradle.kts
@@ -16,18 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.filesystem.hadoop.integration.test;
 
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Tag;
-
-@Tag("gravitino-docker-test")
-public class GravitinoVirtualFilesystemWithFSOpsDisabledIT extends 
GravitinoVirtualFileSystemIT {
+tasks.all {
+    enabled = false
+}
 
-  @BeforeAll
-  @Override
-  public void startUp() throws Exception {
-    properties.put("disable-filesystem-ops", "true");
-    super.startUp();
-  }
+tasks.named<Test>("test") {
+    subprojects.forEach { sub ->
+        dependsOn(sub.tasks.named("test"))
+    }
 }
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
 b/integration-test/catalogs/build.gradle.kts
similarity index 66%
copy from 
clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
copy to integration-test/catalogs/build.gradle.kts
index 2564bac84f..42311aa45b 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
+++ b/integration-test/catalogs/build.gradle.kts
@@ -16,18 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.filesystem.hadoop.integration.test;
 
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Tag;
-
-@Tag("gravitino-docker-test")
-public class GravitinoVirtualFilesystemWithFSOpsDisabledIT extends 
GravitinoVirtualFileSystemIT {
+tasks.all {
+    enabled = false
+}
 
-  @BeforeAll
-  @Override
-  public void startUp() throws Exception {
-    properties.put("disable-filesystem-ops", "true");
-    super.startUp();
-  }
+tasks.named<Test>("test") {
+    subprojects.forEach { sub ->
+        dependsOn(sub.tasks.named("test"))
+    }
 }
diff --git a/clients/cli/build.gradle.kts 
b/integration-test/catalogs/catalog-model-it/build.gradle.kts
similarity index 61%
copy from clients/cli/build.gradle.kts
copy to integration-test/catalogs/catalog-model-it/build.gradle.kts
index 9358808f9f..cdb18f75cb 100644
--- a/clients/cli/build.gradle.kts
+++ b/integration-test/catalogs/catalog-model-it/build.gradle.kts
@@ -16,63 +16,53 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+description = "catalog-model-it"
+
 plugins {
   `maven-publish`
   id("java")
   id("idea")
 }
 
+val isTestModeEmbedded = rootProject.extra["isTestModeEmbedded"] as Boolean
+
 dependencies {
-  implementation(libs.commons.cli.new)
-  implementation(libs.commons.csv)
-  implementation(libs.guava)
-  implementation(libs.slf4j.api)
-  implementation(libs.slf4j.simple)
-  implementation(project(":api"))
-  implementation(project(":clients:client-java"))
-  implementation(project(":common"))
+  testImplementation(project(":api")) {
+    exclude(group = "*")
+  }
+  testImplementation(project(":catalogs:catalog-common")) {
+    exclude(group = "*")
+  }
+  testImplementation(project(":common")) {
+    exclude(group = "*")
+  }
+  testImplementation(project(":core")) {
+    exclude(group = "*")
+  }
+  testImplementation(project(":clients:client-java"))
+  testImplementation(project(":integration-test-common", "testArtifacts"))
+  if (isTestModeEmbedded) {
+    testImplementation(project(":server"))
+  }
+  testImplementation(project(":server-common"))
 
-  testImplementation(libs.junit.jupiter.api)
-  testImplementation(libs.junit.jupiter.params)
+  testImplementation(libs.bundles.log4j)
+  testImplementation(libs.commons.io)
+  testImplementation(libs.commons.lang3)
   testImplementation(libs.mockito.core)
+  testImplementation(libs.mockito.inline)
   testImplementation(libs.mysql.driver)
+  testImplementation(libs.junit.jupiter.api)
+  testImplementation(libs.junit.jupiter.params)
+  testImplementation(libs.guava)
   testImplementation(libs.postgresql.driver)
+  testImplementation(libs.slf4j.api)
   testImplementation(libs.testcontainers)
+  testImplementation(libs.testcontainers.mysql)
 
-  testImplementation(project(":core")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":server-common")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":integration-test-common", "testArtifacts"))
   testRuntimeOnly(libs.junit.jupiter.engine)
 }
 
-tasks.build {
-  dependsOn("javadoc")
-}
-
-tasks.clean {
-  delete("target")
-  delete("tmp")
-}
-
-tasks.jar {
-  manifest {
-    attributes["Main-Class"] = "org.apache.gravitino.cli.Main"
-  }
-  val dependencies = configurations
-    .runtimeClasspath
-    .get()
-    .map(::zipTree)
-  from(dependencies)
-  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
-}
-
 tasks.test {
   val skipITs = project.hasProperty("skipITs")
   if (skipITs) {
@@ -80,6 +70,6 @@ tasks.test {
     exclude("**/integration/test/**")
   } else {
     dependsOn(tasks.jar)
-    dependsOn(":catalogs:catalog-jdbc-postgresql:jar", 
":catalogs:catalog-jdbc-postgresql:runtimeJars")
+    dependsOn(":catalogs:catalog-model:jar")
   }
 }
diff --git 
a/catalogs/catalog-model/src/test/java/org/apache/gravtitino/catalog/model/integration/test/ModelCatalogOperationsIT.java
 
b/integration-test/catalogs/catalog-model-it/src/test/java/org/apache/gravtitino/catalog/model/integration/test/ModelCatalogOperationsIT.java
similarity index 100%
rename from 
catalogs/catalog-model/src/test/java/org/apache/gravtitino/catalog/model/integration/test/ModelCatalogOperationsIT.java
rename to 
integration-test/catalogs/catalog-model-it/src/test/java/org/apache/gravtitino/catalog/model/integration/test/ModelCatalogOperationsIT.java
diff --git 
a/integration-test/catalogs/catalog-model-it/src/test/resources/log4j2.properties
 
b/integration-test/catalogs/catalog-model-it/src/test/resources/log4j2.properties
new file mode 100644
index 0000000000..88da637c15
--- /dev/null
+++ 
b/integration-test/catalogs/catalog-model-it/src/test/resources/log4j2.properties
@@ -0,0 +1,73 @@
+#
+# 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.
+#
+
+# Set to debug or trace if log4j initialization is failing
+status = info
+
+# Name of the configuration
+name = ConsoleLogConfig
+
+# Console appender configuration
+appender.console.type = Console
+appender.console.name = consoleLogger
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}:%L - 
%m%n
+
+# Log files location
+property.logPath = 
${sys:gravitino.log.path:-build/catalog-model-integration-test.log}
+
+# File appender configuration
+appender.file.type = File
+appender.file.name = fileLogger
+appender.file.fileName = ${logPath}
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
+
+# Root logger level
+rootLogger.level = info
+
+# Root logger referring to console and file appenders
+rootLogger.appenderRef.stdout.ref = consoleLogger
+rootLogger.appenderRef.file.ref = fileLogger
+
+# File appender configuration for testcontainers
+appender.testcontainersFile.type = File
+appender.testcontainersFile.name = testcontainersLogger
+appender.testcontainersFile.fileName = build/testcontainers.log
+appender.testcontainersFile.layout.type = PatternLayout
+appender.testcontainersFile.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] 
%-5p %c - %m%n
+
+# Logger for testcontainers
+logger.testcontainers.name = org.testcontainers
+logger.testcontainers.level = debug
+logger.testcontainers.additivity = false
+logger.testcontainers.appenderRef.file.ref = testcontainersLogger
+
+logger.tc.name = tc
+logger.tc.level = debug
+logger.tc.additivity = false
+logger.tc.appenderRef.file.ref = testcontainersLogger
+
+logger.docker.name = com.github.dockerjava
+logger.docker.level = warn
+logger.docker.additivity = false
+logger.docker.appenderRef.file.ref = testcontainersLogger
+
+logger.http.name = 
com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.wire
+logger.http.level = off
diff --git 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
 b/integration-test/clients/build.gradle.kts
similarity index 66%
copy from 
clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
copy to integration-test/clients/build.gradle.kts
index 2564bac84f..42311aa45b 100644
--- 
a/clients/filesystem-hadoop3/src/test/java/org/apache/gravitino/filesystem/hadoop/integration/test/GravitinoVirtualFilesystemWithFSOpsDisabledIT.java
+++ b/integration-test/clients/build.gradle.kts
@@ -16,18 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.filesystem.hadoop.integration.test;
 
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Tag;
-
-@Tag("gravitino-docker-test")
-public class GravitinoVirtualFilesystemWithFSOpsDisabledIT extends 
GravitinoVirtualFileSystemIT {
+tasks.all {
+    enabled = false
+}
 
-  @BeforeAll
-  @Override
-  public void startUp() throws Exception {
-    properties.put("disable-filesystem-ops", "true");
-    super.startUp();
-  }
+tasks.named<Test>("test") {
+    subprojects.forEach { sub ->
+        dependsOn(sub.tasks.named("test"))
+    }
 }
diff --git a/clients/client-java/build.gradle.kts 
b/integration-test/clients/client-java-it/build.gradle.kts
similarity index 70%
copy from clients/client-java/build.gradle.kts
copy to integration-test/clients/client-java-it/build.gradle.kts
index 30b3a15deb..ed66145621 100644
--- a/clients/client-java/build.gradle.kts
+++ b/integration-test/clients/client-java-it/build.gradle.kts
@@ -16,33 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+description = "client-java-it"
+
 plugins {
   `maven-publish`
   id("java")
   id("idea")
 }
 
-dependencies {
-  implementation(project(":api"))
-  implementation(project(":common"))
-  implementation(libs.jackson.databind)
-  implementation(libs.jackson.annotations)
-  implementation(libs.jackson.datatype.jdk8)
-  implementation(libs.jackson.datatype.jsr310)
-  implementation(libs.guava)
-  implementation(libs.httpclient5) {
-    exclude(group = "org.slf4j")
-  }
-  implementation(libs.commons.lang3)
+val isTestModeEmbedded = rootProject.extra["isTestModeEmbedded"] as Boolean
 
-  compileOnly(libs.lombok)
-  annotationProcessor(libs.lombok)
+dependencies {
   testCompileOnly(libs.lombok)
   testAnnotationProcessor(libs.lombok)
 
+  testImplementation(project(":api"))
+  testImplementation(project(":clients:client-java"))
+  testImplementation(project(":common"))
   testImplementation(project(":core"))
   testImplementation(project(":integration-test-common", "testArtifacts"))
-  testImplementation(project(":server"))
+  if (isTestModeEmbedded) {
+    testImplementation(project(":server"))
+  }
   testImplementation(project(":server-common"))
 
   testImplementation(libs.bundles.jersey)
@@ -62,10 +57,6 @@ dependencies {
   testRuntimeOnly(libs.junit.jupiter.engine)
 }
 
-tasks.build {
-  dependsOn("javadoc")
-}
-
 tasks.test {
   val skipITs = project.hasProperty("skipITs")
   if (skipITs) {
@@ -77,18 +68,6 @@ tasks.test {
   }
 }
 
-tasks.javadoc {
-  dependsOn(":api:javadoc", ":common:javadoc")
-  source =
-    sourceSets["main"].allJava +
-    project(":api").sourceSets["main"].allJava +
-    project(":common").sourceSets["main"].allJava
-
-  classpath = configurations["compileClasspath"] +
-    project(":api").configurations["runtimeClasspath"] +
-    project(":common").configurations["runtimeClasspath"]
-}
-
 tasks.clean {
   delete("target")
   delete("tmp")
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/AuditIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/AuditIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/AuditIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/AuditIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/CatalogIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/CatalogIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/CatalogIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/CatalogIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
similarity index 91%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
index 7911f02cdf..383e65689b 100644
--- 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
+++ 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/MetalakeIT.java
@@ -80,7 +80,7 @@ public class MetalakeIT extends BaseIT {
     client.createMetalake(metalakeNameA, "metalake A comment", 
Collections.emptyMap());
     metaLakes = client.listMetalakes();
     assertEquals(1, metaLakes.length);
-    assertEquals(metaLakes[0].name(), metalakeNameA);
+    Assertions.assertEquals(metaLakes[0].name(), metalakeNameA);
 
     // two metalakes
     client.createMetalake(metalakeNameB, "metalake B comment", 
Collections.emptyMap());
@@ -98,8 +98,8 @@ public class MetalakeIT extends BaseIT {
     // metalake exists
     client.createMetalake(metalakeNameA, "metalake A comment", 
Collections.emptyMap());
     GravitinoMetalake metaLakeA = client.loadMetalake(metalakeNameA);
-    assertEquals(metaLakeA.name(), metalakeNameA);
-    assertEquals("true", metaLakeA.properties().get(PROPERTY_IN_USE));
+    Assertions.assertEquals(metaLakeA.name(), metalakeNameA);
+    Assertions.assertEquals("true", 
metaLakeA.properties().get(PROPERTY_IN_USE));
 
     // metalake does not exist
     NameIdentifier noexist = NameIdentifier.of(metalakeNameB);
@@ -124,14 +124,14 @@ public class MetalakeIT extends BaseIT {
           MetalakeChange.rename(newName), MetalakeChange.updateComment("new 
metalake comment")
         };
     GravitinoMetalake metaLake = client.alterMetalake(metalakeNameA, changes);
-    assertEquals(newName, metaLake.name());
-    assertEquals("new metalake comment", metaLake.comment());
-    assertEquals(AuthConstants.ANONYMOUS_USER, metaLake.auditInfo().creator());
+    Assertions.assertEquals(newName, metaLake.name());
+    Assertions.assertEquals("new metalake comment", metaLake.comment());
+    Assertions.assertEquals(AuthConstants.ANONYMOUS_USER, 
metaLake.auditInfo().creator());
 
     // Reload metadata via new name to check if the changes are applied
     GravitinoMetalake newMetalake = client.loadMetalake(newName);
-    assertEquals(newName, newMetalake.name());
-    assertEquals("new metalake comment", newMetalake.comment());
+    Assertions.assertEquals(newName, newMetalake.name());
+    Assertions.assertEquals("new metalake comment", newMetalake.comment());
 
     // Old name does not exist
     NameIdentifier old = NameIdentifier.of(metalakeNameA);
@@ -159,10 +159,10 @@ public class MetalakeIT extends BaseIT {
   public void testCreateMetalake() {
     client.createMetalake(metalakeNameA, "metalake A comment", 
Collections.emptyMap());
     GravitinoMetalake metalake = client.loadMetalake(metalakeNameA);
-    assertEquals(metalakeNameA, metalake.name());
-    assertEquals("metalake A comment", metalake.comment());
-    assertEquals(AuthConstants.ANONYMOUS_USER, metalake.auditInfo().creator());
-    assertEquals("true", metalake.properties().get(PROPERTY_IN_USE));
+    Assertions.assertEquals(metalakeNameA, metalake.name());
+    Assertions.assertEquals("metalake A comment", metalake.comment());
+    Assertions.assertEquals(AuthConstants.ANONYMOUS_USER, 
metalake.auditInfo().creator());
+    Assertions.assertEquals("true", 
metalake.properties().get(PROPERTY_IN_USE));
 
     // Test metalake name already exists
     Map<String, String> emptyMap = Collections.emptyMap();
@@ -178,9 +178,9 @@ public class MetalakeIT extends BaseIT {
   public void testCreateMetalakeWithChinese() {
     client.createMetalake(metalakeNameA, "这是中文comment", 
Collections.emptyMap());
     GravitinoMetalake metalake = client.loadMetalake(metalakeNameA);
-    assertEquals(metalakeNameA, metalake.name());
-    assertEquals("这是中文comment", metalake.comment());
-    assertEquals(AuthConstants.ANONYMOUS_USER, metalake.auditInfo().creator());
+    Assertions.assertEquals(metalakeNameA, metalake.name());
+    Assertions.assertEquals("这是中文comment", metalake.comment());
+    Assertions.assertEquals(AuthConstants.ANONYMOUS_USER, 
metalake.auditInfo().creator());
 
     // Test metalake name already exists
     Map<String, String> emptyMap = Collections.emptyMap();
@@ -213,13 +213,13 @@ public class MetalakeIT extends BaseIT {
   public void testUpdateMetalakeWithNullableComment() {
     client.createMetalake(metalakeNameA, null, Collections.emptyMap());
     GravitinoMetalake metalake = client.loadMetalake(metalakeNameA);
-    assertEquals(metalakeNameA, metalake.name());
-    assertEquals(null, metalake.comment());
+    Assertions.assertEquals(metalakeNameA, metalake.name());
+    Assertions.assertEquals(null, metalake.comment());
 
     MetalakeChange[] changes =
         new MetalakeChange[] {MetalakeChange.updateComment("new metalake 
comment")};
     GravitinoMetalake updatedMetalake = client.alterMetalake(metalakeNameA, 
changes);
-    assertEquals("new metalake comment", updatedMetalake.comment());
+    Assertions.assertEquals("new metalake comment", updatedMetalake.comment());
 
     GravitinoMetalake updateNullComment =
         client.alterMetalake(metalakeNameA, 
MetalakeChange.updateComment(null));
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/TagIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/VersionOperationsIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/VersionOperationsIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/VersionOperationsIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/VersionOperationsIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlNotAllowIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlNotAllowIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlNotAllowIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/AccessControlNotAllowIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/BaseRestApiAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/BaseRestApiAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/BaseRestApiAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/BaseRestApiAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/CatalogAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/CatalogAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/CatalogAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/CatalogAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
similarity index 98%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
index a7339ba0db..6802f9aa7f 100644
--- 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
+++ 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/CheckCurrentUserIT.java
@@ -18,8 +18,6 @@
  */
 package org.apache.gravitino.client.integration.test.authorization;
 
-import static 
org.apache.gravitino.server.GravitinoServer.WEBSERVER_CONF_PREFIX;
-
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import java.util.Collections;
@@ -39,6 +37,7 @@ import 
org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.HiveContainer;
 import org.apache.gravitino.integration.test.container.KafkaContainer;
 import org.apache.gravitino.integration.test.util.BaseIT;
+import org.apache.gravitino.integration.test.util.ITUtils;
 import org.apache.gravitino.rel.Column;
 import org.apache.gravitino.rel.types.Types;
 import org.apache.gravitino.server.web.JettyServerConfig;
@@ -85,7 +84,7 @@ public class CheckCurrentUserIT extends BaseIT {
             KafkaContainer.DEFAULT_BROKER_PORT);
 
     JettyServerConfig jettyServerConfig =
-        JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX);
+        JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
 
     String uri = "http://"; + jettyServerConfig.getHost() + ":" + 
jettyServerConfig.getHttpPort();
     System.setProperty("user.name", "test");
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/FilesetAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/FilesetAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/FilesetAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/FilesetAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/GroupAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/GroupAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/GroupAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/GroupAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/KerberosOperationsIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/KerberosOperationsIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/KerberosOperationsIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/KerberosOperationsIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/MetalakeAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/MetalakeAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/MetalakeAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/MetalakeAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/ModelAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/ModelAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/ModelAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/ModelAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
similarity index 98%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
index 01628d95d1..6a4fbaaf4a 100644
--- 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
+++ 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/MultiAuthOperationsIT.java
@@ -18,7 +18,6 @@
  */
 package org.apache.gravitino.client.integration.test.authorization;
 
-import static 
org.apache.gravitino.server.GravitinoServer.WEBSERVER_CONF_PREFIX;
 import static org.apache.gravitino.server.authentication.KerberosConfig.KEYTAB;
 import static 
org.apache.gravitino.server.authentication.KerberosConfig.PRINCIPAL;
 import static org.apache.hadoop.minikdc.MiniKdc.MAX_TICKET_LIFETIME;
@@ -94,7 +93,7 @@ public class MultiAuthOperationsIT extends BaseIT {
             .build();
 
     JettyServerConfig jettyServerConfig =
-        JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX);
+        JettyServerConfig.fromConfig(serverConfig, 
ITUtils.GRAVITINO_WEBSERVER_CONF_PREFIX);
     serverUri = "http://localhost:"; + jettyServerConfig.getHttpPort();
     kerberosClient =
         GravitinoAdminClient.builder(serverUri)
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OAuth2OperationsIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OAuth2OperationsIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OAuth2OperationsIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OAuth2OperationsIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/OwnerIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/PermissionAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/PermissionAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/PermissionAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/PermissionAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/RoleAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/SchemaAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/SchemaAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/SchemaAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/SchemaAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/TableAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TopicAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/TopicAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TopicAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/TopicAuthorizationIT.java
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/UserAuthorizationIT.java
 
b/integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/UserAuthorizationIT.java
similarity index 100%
rename from 
clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/UserAuthorizationIT.java
rename to 
integration-test/clients/client-java-it/src/test/java/org/apache/gravitino/client/integration/test/authorization/UserAuthorizationIT.java
diff --git 
a/integration-test/clients/client-java-it/src/test/resources/log4j2.properties 
b/integration-test/clients/client-java-it/src/test/resources/log4j2.properties
new file mode 100644
index 0000000000..2ee58e894b
--- /dev/null
+++ 
b/integration-test/clients/client-java-it/src/test/resources/log4j2.properties
@@ -0,0 +1,73 @@
+#
+# 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.
+#
+
+# Set to debug or trace if log4j initialization is failing
+status = info
+
+# Name of the configuration
+name = ConsoleLogConfig
+
+# Console appender configuration
+appender.console.type = Console
+appender.console.name = consoleLogger
+appender.console.layout.type = PatternLayout
+appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}:%L - 
%m%n
+
+# Log files location
+property.logPath = 
${sys:gravitino.log.path:-build/client-java-integration-test.log}
+
+# File appender configuration
+appender.file.type = File
+appender.file.name = fileLogger
+appender.file.fileName = ${logPath}
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
+
+# Root logger level
+rootLogger.level = info
+
+# Root logger referring to console and file appenders
+rootLogger.appenderRef.stdout.ref = consoleLogger
+rootLogger.appenderRef.file.ref = fileLogger
+
+# File appender configuration for testcontainers
+appender.testcontainersFile.type = File
+appender.testcontainersFile.name = testcontainersLogger
+appender.testcontainersFile.fileName = build/testcontainers.log
+appender.testcontainersFile.layout.type = PatternLayout
+appender.testcontainersFile.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] 
%-5p %c - %m%n
+
+# Logger for testcontainers
+logger.testcontainers.name = org.testcontainers
+logger.testcontainers.level = debug
+logger.testcontainers.additivity = false
+logger.testcontainers.appenderRef.file.ref = testcontainersLogger
+
+logger.tc.name = tc
+logger.tc.level = debug
+logger.tc.additivity = false
+logger.tc.appenderRef.file.ref = testcontainersLogger
+
+logger.docker.name = com.github.dockerjava
+logger.docker.level = warn
+logger.docker.additivity = false
+logger.docker.appenderRef.file.ref = testcontainersLogger
+
+logger.http.name = 
com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.wire
+logger.http.level = off
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 6b8b3fcd06..fdf7bb5b32 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -84,3 +84,4 @@ include(":bundles:aliyun", ":bundles:aliyun-bundle")
 include(":bundles:azure", ":bundles:azure-bundle")
 include(":catalogs:hadoop-common")
 include(":lineage")
+include(":integration-test:catalogs:catalog-model-it", 
":integration-test:clients:client-java-it")
diff --git a/spark-connector/spark-common/build.gradle.kts 
b/spark-connector/spark-common/build.gradle.kts
index 5a61934295..faac9bc717 100644
--- a/spark-connector/spark-common/build.gradle.kts
+++ b/spark-connector/spark-common/build.gradle.kts
@@ -73,9 +73,6 @@ dependencies {
   testImplementation(project(":common")) {
     exclude("org.apache.logging.log4j")
   }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-  }
   testImplementation(project(":server-common")) {
     exclude("org.apache.logging.log4j")
   }
diff --git 
a/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/integration/test/SparkEnvIT.java
 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/integration/test/SparkEnvIT.java
index 5bcdc9a2cb..3d5c7a25a2 100644
--- 
a/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/integration/test/SparkEnvIT.java
+++ 
b/spark-connector/spark-common/src/test/java/org/apache/gravitino/spark/connector/integration/test/SparkEnvIT.java
@@ -42,10 +42,12 @@ import org.apache.spark.sql.SparkSession;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.DisabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Setup Hive, Gravitino, Spark, Metalake environment to execute SparkSQL. */
+@DisabledIf("org.apache.gravitino.integration.test.util.ITUtils#isEmbedded")
 public abstract class SparkEnvIT extends SparkUtilIT {
 
   private static final Logger LOG = LoggerFactory.getLogger(SparkEnvIT.class);
diff --git a/spark-connector/v3.3/spark/build.gradle.kts 
b/spark-connector/v3.3/spark/build.gradle.kts
index 257020a84c..ce2e94f76a 100644
--- a/spark-connector/v3.3/spark/build.gradle.kts
+++ b/spark-connector/v3.3/spark/build.gradle.kts
@@ -52,12 +52,6 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
-  testImplementation(project(":catalogs:catalog-jdbc-common")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":catalogs:hive-metastore-common")) {
-    exclude("*")
-  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
@@ -74,10 +68,6 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-    exclude("org.slf4j")
-  }
   testImplementation(project(":server-common")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
diff --git a/spark-connector/v3.4/spark/build.gradle.kts 
b/spark-connector/v3.4/spark/build.gradle.kts
index 7789017bd9..c853a2dddf 100644
--- a/spark-connector/v3.4/spark/build.gradle.kts
+++ b/spark-connector/v3.4/spark/build.gradle.kts
@@ -53,12 +53,6 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
-  testImplementation(project(":catalogs:catalog-jdbc-common")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":catalogs:hive-metastore-common")) {
-    exclude("*")
-  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
@@ -75,10 +69,6 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-    exclude("org.slf4j")
-  }
   testImplementation(project(":server-common")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
diff --git a/spark-connector/v3.5/spark/build.gradle.kts 
b/spark-connector/v3.5/spark/build.gradle.kts
index f6a5417ac2..878b15e1e9 100644
--- a/spark-connector/v3.5/spark/build.gradle.kts
+++ b/spark-connector/v3.5/spark/build.gradle.kts
@@ -53,12 +53,6 @@ dependencies {
   testImplementation(project(":api")) {
     exclude("org.apache.logging.log4j")
   }
-  testImplementation(project(":catalogs:catalog-jdbc-common")) {
-    exclude("org.apache.logging.log4j")
-  }
-  testImplementation(project(":catalogs:hive-metastore-common")) {
-    exclude("*")
-  }
   testImplementation(project(":clients:client-java")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
@@ -75,10 +69,6 @@ dependencies {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")
   }
-  testImplementation(project(":server")) {
-    exclude("org.apache.logging.log4j")
-    exclude("org.slf4j")
-  }
   testImplementation(project(":server-common")) {
     exclude("org.apache.logging.log4j")
     exclude("org.slf4j")

Reply via email to