<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ 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.
  -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>27</version>
  </parent>

  <groupId>org.apache.celeborn</groupId>
  <artifactId>celeborn-parent_${scala.binary.version}</artifactId>
  <version>${project.version}</version>
  <packaging>pom</packaging>

  <name>Celeborn Project Parent POM</name>

  <modules>
    <module>openapi/openapi-client</module>
    <module>spi</module>
    <module>common</module>
    <module>client</module>
    <module>service</module>
    <module>master</module>
    <module>worker</module>
    <module>cli</module>
  </modules>

  <distributionManagement>
    <repository>
      <id>${distMgmtReleaseId}</id>
      <name>${distMgmtReleaseName}</name>
      <url>${distMgmtReleaseUrl}</url>
    </repository>
    <snapshotRepository>
      <id>${distMgmtSnapshotsId}</id>
      <name>${distMgmtSnapshotsName}</name>
      <url>${distMgmtSnapshotsUrl}</url>
    </snapshotRepository>
  </distributionManagement>

  <properties>
    <project.version>0.6.0-SNAPSHOT</project.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <java.version>8</java.version>
    <scala.version>2.12.18</scala.version>
    <scala.binary.version>2.12</scala.binary.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.version>3.9.6</maven.version>

    <flink.version>1.14.6</flink.version>
    <spark.version>3.3.4</spark.version>

    <!-- use hadoop-3 as default  -->
    <hadoop.version>3.3.6</hadoop.version>
    <!--
    If you change codahale.metrics.version, you also need to change
    the link to metrics.dropwizard.io in docs/monitoring.md.
    -->
    <codahale.metrics.version>4.2.25</codahale.metrics.version>
    <commons-lang3.version>3.17.0</commons-lang3.version>
    <commons-io.version>2.13.0</commons-io.version>
    <commons-crypto.version>1.0.0</commons-crypto.version>
    <!-- last version to support compilation in java 8. See https://errorprone.info/docs/installation#:~:text=you%20are%20using.-,JDK%208,-Error%20Prone%202.10.0 -->
    <error-prone.version>2.10.0</error-prone.version>
    <error-prone.jdk8.javac.version>9+181-r4173-1</error-prone.jdk8.javac.version>
    <google.jsr305.version>1.3.9</google.jsr305.version>
    <grpc.version>1.44.0</grpc.version>
    <guava.version>33.1.0-jre</guava.version>
    <junit.version>4.13.2</junit.version>
    <leveldb.version>1.8</leveldb.version>
    <log4j2.version>2.17.2</log4j2.version>
    <lz4-java.version>1.8.0</lz4-java.version>
    <mockito.version>4.11.0</mockito.version>
    <mockito-scalatest.version>1.17.14</mockito-scalatest.version>
    <netty.version>4.1.109.Final</netty.version>
    <bouncycastle.version>1.77</bouncycastle.version>
    <protobuf.version>3.21.7</protobuf.version>
    <ratis.version>3.1.1</ratis.version>
    <scalatest.version>3.2.16</scalatest.version>
    <slf4j.version>1.7.36</slf4j.version>
    <roaringbitmap.version>1.0.6</roaringbitmap.version>
    <snakeyaml.version>2.2</snakeyaml.version>
    <zstd-jni.version>1.5.2-1</zstd-jni.version>
    <kubernetes-client.version>6.7.0</kubernetes-client.version>
    <rocksdbjni.version>9.5.2</rocksdbjni.version>
    <jackson.version>2.15.3</jackson.version>
    <snappy.version>1.1.10.5</snappy.version>
    <ap.loader.version>3.0-8</ap.loader.version>
    <picocli.version>4.7.6</picocli.version>

    <!-- Db dependencies -->
    <mybatis.version>3.5.15</mybatis.version>
    <hikaricp.version>4.0.3</hikaricp.version>
    <h2.version>2.2.224</h2.version>

    <!-- RESTful service dependencies -->
    <swagger.version>2.2.1</swagger.version>
    <swagger-ui.version>4.9.1</swagger-ui.version>
    <jersey.version>2.39.1</jersey.version>
    <jetty.version>9.4.52.v20230823</jetty.version>
    <jakarta.servlet-api.version>4.0.4</jakarta.servlet-api.version>
    <jakarta.annotation-api.version>1.3.5</jakarta.annotation-api.version>
    <!-- openapi-generator dependencies -->
    <openapitools.jackson-databind-nullable.version>0.2.6</openapitools.jackson-databind-nullable.version>
    <httpclient5.version>5.3.1</httpclient5.version>
    <httpcore5.version>5.2.4</httpcore5.version>

    <!-- org.fusesource.leveldbjni will be used except on arm64 platform. -->
    <leveldbjni.group>org.fusesource.leveldbjni</leveldbjni.group>

    <shading.prefix>org.apache.celeborn.shaded</shading.prefix>

    <maven.plugin.antrun.version>3.0.0</maven.plugin.antrun.version>
    <maven.plugin.clean.version>3.2.0</maven.plugin.clean.version>
    <maven.plugin.compiler.version>3.12.1</maven.plugin.compiler.version>
    <maven.plugin.dependency.version>3.1.1</maven.plugin.dependency.version>
    <maven.plugin.flatten.version>1.3.0</maven.plugin.flatten.version>
    <maven.plugin.jacoco.version>0.8.11</maven.plugin.jacoco.version>
    <maven.plugin.jar.version>3.0.2</maven.plugin.jar.version>
    <maven.plugin.os.version>1.7.0</maven.plugin.os.version>
    <maven.plugin.protobuf.version>0.6.1</maven.plugin.protobuf.version>
    <maven.plugin.rat.version>0.13</maven.plugin.rat.version>
    <maven.plugin.resources.version>3.3.1</maven.plugin.resources.version>
    <maven.plugin.scala.version>4.7.2</maven.plugin.scala.version>
    <maven.plugin.scalatest.version>2.1.0</maven.plugin.scalatest.version>
    <maven.plugin.shade.version>3.5.2</maven.plugin.shade.version>
    <maven.plugin.spotless.version>2.24.1</maven.plugin.spotless.version>
    <maven.plugin.surefire.version>3.0.0-M7</maven.plugin.surefire.version>
    <maven.plugin.silencer.version>1.7.13</maven.plugin.silencer.version>
    <maven.plugin.resources.version>3.3.1</maven.plugin.resources.version>
    <openapi.generator.version>7.8.0</openapi.generator.version>

    <!-- Allow modules to enable / disable certain build plugins easily. -->
    <testJarPhase>prepare-package</testJarPhase>
    <jars.target.dir>${project.build.directory}/scala-${scala.binary.version}/jars</jars.target.dir>

    <!-- for JDK-17 test-->
    <extraJavaTestArgs>-XX:+IgnoreUnrecognizedVMOptions
      --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED
      --add-opens=java.base/java.lang=ALL-UNNAMED
      --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
      --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
      --add-opens=java.base/java.io=ALL-UNNAMED
      --add-opens=java.base/java.net=ALL-UNNAMED
      --add-opens=java.base/java.nio=ALL-UNNAMED
      --add-opens=java.base/java.util=ALL-UNNAMED
      --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
      --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED
      --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED
      --add-opens=java.base/sun.nio.ch=ALL-UNNAMED
      --add-opens=java.base/sun.nio.cs=ALL-UNNAMED
      --add-opens=java.base/sun.security.action=ALL-UNNAMED
      --add-opens=java.base/sun.util.calendar=ALL-UNNAMED</extraJavaTestArgs>

    <spark.shuffle.plugin.class>org.apache.spark.shuffle.sort.io.LocalDiskShuffleDataIO</spark.shuffle.plugin.class>

    <mavenCentralId>central</mavenCentralId>
    <mavenCentralName>Maven Central</mavenCentralName>
    <mavenCentralUrl>https://repo.maven.apache.org/maven2</mavenCentralUrl>

    <distMgmtReleaseId>apache.releases.https</distMgmtReleaseId>
    <distMgmtReleaseName>Apache Release Distribution Repository</distMgmtReleaseName>
    <distMgmtReleaseUrl>https://repository.apache.org/service/local/staging/deploy/maven2</distMgmtReleaseUrl>
    <distMgmtSnapshotsId>apache.snapshots.https</distMgmtSnapshotsId>
    <distMgmtSnapshotsName>Apache Development Snapshot Repository</distMgmtSnapshotsName>
    <distMgmtSnapshotsUrl>https://repository.apache.org/content/repositories/snapshots</distMgmtSnapshotsUrl>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-runtime</artifactId>
        <version>${flink.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.tysafe</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j2.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j2.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j2.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>${log4j2.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${codahale.metrics.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-graphite</artifactId>
        <version>${codahale.metrics.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-jvm</artifactId>
        <version>${codahale.metrics.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-common</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-client</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-server</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-netty</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-proto-shaded</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-grpc</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-shell</artifactId>
        <version>${ratis.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.ratis</groupId>
        <artifactId>ratis-metrics-default</artifactId>
        <version>${ratis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
      </dependency>
      <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-reflect</artifactId>
        <version>${scala.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <type>test-jar</type>
        <exclusions>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <type>test-jar</type>
      </dependency>
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.checkerframework</groupId>
            <artifactId>checker-qual</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>animal-sniffer-annotations</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.google.errorprone</groupId>
            <artifactId>error_prone_annotations</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>listenablefuture</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.google.j2objc</groupId>
            <artifactId>j2objc-annotations</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>jsr305</artifactId>
        <version>${google.jsr305.version}</version>
      </dependency>
      <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>${protobuf.version}</version>
      </dependency>
      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>${netty.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-handler-ssl-ocsp</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
      </dependency>
      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons-io.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-crypto</artifactId>
        <version>${commons-crypto.version}</version>
        <exclusions>
          <exclusion>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${leveldbjni.group}</groupId>
        <artifactId>leveldbjni-all</artifactId>
        <version>${leveldb.version}</version>
      </dependency>
      <dependency>
        <groupId>org.lz4</groupId>
        <artifactId>lz4-java</artifactId>
        <version>${lz4-java.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.luben</groupId>
        <artifactId>zstd-jni</artifactId>
        <version>${zstd-jni.version}</version>
      </dependency>
      <dependency>
        <groupId>org.roaringbitmap</groupId>
        <artifactId>RoaringBitmap</artifactId>
        <version>${roaringbitmap.version}</version>
      </dependency>
      <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>${snakeyaml.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-app</artifactId>
        <version>${hadoop.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- async-profiler loader contains async_profiler binaries for multiple platforms -->
      <dependency>
        <groupId>me.bechberger</groupId>
        <artifactId>ap-loader-all</artifactId>
        <version>${ap.loader.version}</version>
      </dependency>

      <!-- Db dependencies -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
      </dependency>
      <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>${hikaricp.version}</version>
      </dependency>
      <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>${h2.version}</version>
        <scope>test</scope>
      </dependency>

      <!-- RESTful service dependencies -->
      <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>${jakarta.servlet-api.version}</version>
      </dependency>

      <dependency>
        <groupId>jakarta.annotation</groupId>
        <artifactId>jakarta.annotation-api</artifactId>
        <version>${jakarta.annotation-api.version}</version>
      </dependency>

      <dependency>
        <groupId>org.openapitools</groupId>
        <artifactId>jackson-databind-nullable</artifactId>
        <version>${openapitools.jackson-databind-nullable.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.httpcomponents.client5</groupId>
        <artifactId>httpclient5</artifactId>
        <version>${httpclient5.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.httpcomponents.core5</groupId>
        <artifactId>httpcore5</artifactId>
        <version>${httpcore5.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.httpcomponents.core5</groupId>
        <artifactId>httpcore5-h2</artifactId>
        <version>${httpcore5.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>${jersey.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>${jersey.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>${jersey.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.test-framework</groupId>
        <artifactId>jersey-test-framework-core</artifactId>
        <version>${jersey.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
        <artifactId>jersey-test-framework-provider-jetty</artifactId>
        <version>${jersey.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-util</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-continuation</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>io.swagger.core.v3</groupId>
        <artifactId>swagger-jaxrs2</artifactId>
        <version>${swagger.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.sun.activation</groupId>
            <artifactId>jakarta.activation</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!--
      1. This library only contains swagger-ui static resource (.html/.css/.js/.png), for more detail, see
      https://github.com/swagger-api/swagger-ui/blob/master/dist/
      2. Note that when trying to upgrade swagger-ui, we should also update the version in the file(
      service/src/main/scala/org/apache/celeborn/server/common/HttpService.scala).
      -->
      <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>swagger-ui</artifactId>
        <version>${swagger-ui.version}</version>
      </dependency>

      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.scalatest</groupId>
        <artifactId>scalatest_${scala.binary.version}</artifactId>
        <version>${scalatest.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>${mockito.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>${mockito.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-scala-scalatest_${scala.binary.version}</artifactId>
        <version>${mockito-scalatest.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>io.fabric8</groupId>
        <artifactId>kubernetes-client</artifactId>
        <version>${kubernetes-client.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.rocksdb</groupId>
        <artifactId>rocksdbjni</artifactId>
        <version>${rocksdbjni.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-scala_${scala.binary.version}</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>${jackson.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>${jackson.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.xerial.snappy</groupId>
        <artifactId>snappy-java</artifactId>
        <version>${snappy.version}</version>
      </dependency>
      <!-- for SSL support -->
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk18on</artifactId>
        <version>${bouncycastle.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk18on</artifactId>
        <version>${bouncycastle.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>info.picocli</groupId>
        <artifactId>picocli</artifactId>
        <version>${picocli.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.scalatest</groupId>
      <artifactId>scalatest_${scala.binary.version}</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>${mavenCentralId}</id>
      <name>${mavenCentralName}</name>
      <url>${mavenCentralUrl}</url>
    </repository>
    <repository>
      <id>apache-release-candidates</id>
      <name>Apache Release Candidates Repository</name>
      <url>https://repository.apache.org/content/repositories/staging</url>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>${mavenCentralId}</id>
      <name>${mavenCentralName}</name>
      <url>${mavenCentralUrl}</url>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>${maven.plugin.antrun.version}</version>
          <executions>
            <execution>
              <id>create-tmp-dir</id>
              <goals>
                <goal>run</goal>
              </goals>
              <phase>generate-test-resources</phase>
              <configuration>
                <target>
                  <mkdir dir="${project.build.directory}/tmp"></mkdir>
                </target>
              </configuration>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.xolstice.maven.plugins</groupId>
          <artifactId>protobuf-maven-plugin</artifactId>
          <version>${maven.plugin.protobuf.version}</version>
          <extensions>true</extensions>
          <configuration>
            <protoSourceRoot>${basedir}/src/main/proto/</protoSourceRoot>
            <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
            <pluginId>grpc-java</pluginId>
            <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
          </configuration>
          <executions>
            <execution>
              <id>compile-protoc</id>
              <goals>
                <goal>compile</goal>
                <goal>compile-custom</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-clean-plugin</artifactId>
          <version>${maven.plugin.clean.version}</version>
          <configuration>
            <filesets>
              <fileset>
                <directory>${project.basedir}</directory>
                <includes>
                  <include>**/*.log</include>
                </includes>
              </fileset>
              <fileset>
                <directory>${project.basedir}/metastore_db</directory>
              </fileset>
              <fileset>
                <directory>${project.basedir}/spark-warehouse</directory>
              </fileset>
            </filesets>
          </configuration>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${maven.plugin.jar.version}</version>
          <executions>
            <execution>
              <id>prepare-test-jar</id>
              <goals>
                <goal>test-jar</goal>
              </goals>
              <phase>${testJarPhase}</phase>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${maven.plugin.surefire.version}</version>
          <configuration>
            <includes>
              <include>**/*Spec*.*</include>
              <include>**/*Suite*.*</include>
              <include>**/*Test*.*</include>
            </includes>
            <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
            <argLine>${argLine} -ea -Xmx4g -Xss4m -XX:MaxMetaspaceSize=2g -XX:ReservedCodeCacheSize=128m ${extraJavaTestArgs} -Dio.netty.tryReflectionSetAccessible=true</argLine>
            <systemProperties>
              <log4j.configuration>file:src/test/resources/log4j.properties</log4j.configuration>
              <log4j2.configurationFile>src/test/resources/log4j2-test.xml</log4j2.configurationFile>
              <java.io.tmpdir>${project.build.directory}/tmp</java.io.tmpdir>
              <spark.driver.memory>1g</spark.driver.memory>
              <spark.shuffle.sort.io.plugin.class>${spark.shuffle.plugin.class}</spark.shuffle.sort.io.plugin.class>
            </systemProperties>
            <environmentVariables>
              <CELEBORN_LOCAL_HOSTNAME>localhost</CELEBORN_LOCAL_HOSTNAME>
            </environmentVariables>
            <forkCount>1</forkCount>
            <reuseForks>false</reuseForks>
            <failIfNoTests>false</failIfNoTests>
            <failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
          </configuration>
          <executions>
            <execution>
              <id>test</id>
              <goals>
                <goal>test</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.scalatest</groupId>
          <artifactId>scalatest-maven-plugin</artifactId>
          <version>${maven.plugin.scalatest.version}</version>
          <configuration>
            <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
            <argLine>-ea -Xmx4g -Xss4m -XX:MaxMetaspaceSize=2g -XX:ReservedCodeCacheSize=128m ${extraJavaTestArgs} -Dio.netty.tryReflectionSetAccessible=true</argLine>
            <filereports>TestSuite.txt</filereports>
            <!--
              the plugin does not support always now, we must be careful w/ singletons.
              tracking at: https://github.com/scalatest/scalatest-maven-plugin/issues/99
              -->
            <forkMode>once</forkMode>
            <systemProperties>
              <log4j.configuration>file:src/test/resources/log4j.properties</log4j.configuration>
              <log4j2.configurationFile>src/test/resources/log4j2-test.xml</log4j2.configurationFile>
              <java.io.tmpdir>${project.build.directory}/tmp</java.io.tmpdir>
              <spark.driver.memory>1g</spark.driver.memory>
              <spark.shuffle.sort.io.plugin.class>${spark.shuffle.plugin.class}</spark.shuffle.sort.io.plugin.class>
            </systemProperties>
            <environmentVariables>
              <CELEBORN_LOCAL_HOSTNAME>localhost</CELEBORN_LOCAL_HOSTNAME>
            </environmentVariables>
          </configuration>
          <executions>
            <execution>
              <id>test</id>
              <goals>
                <goal>test</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>flatten-maven-plugin</artifactId>
          <version>${maven.plugin.flatten.version}</version>
          <configuration>
            <flattenMode>oss</flattenMode>
          </configuration>
          <executions>
            <execution>
              <id>flatten</id>
              <goals>
                <goal>flatten</goal>
              </goals>
              <phase>process-resources</phase>
            </execution>
            <execution>
              <id>flatten.clean</id>
              <goals>
                <goal>clean</goal>
              </goals>
              <phase>clean</phase>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>${maven.plugin.shade.version}</version>
          <executions>
            <execution>
              <goals>
                <goal>shade</goal>
              </goals>
              <phase>package</phase>
              <configuration>
                <minimizeJar>false</minimizeJar>
                <shadedArtifactAttached>false</shadedArtifactAttached>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>net.alchim31.maven</groupId>
          <artifactId>scala-maven-plugin</artifactId>
          <version>${maven.plugin.scala.version}</version>
          <configuration>
            <args>
              <arg>-Ywarn-unused-import</arg>
              <arg>-unchecked</arg>
              <arg>-deprecation</arg>
              <arg>-feature</arg>
              <arg>-explaintypes</arg>
              <arg>-Xfatal-warnings</arg>
              <arg>-P:silencer:globalFilters=.*deprecated.*</arg>
              <arg>-P:silencer:lineContentFilters=.*FunctionConverter.*</arg>
            </args>
            <compilerPlugins>
              <compilerPlugin>
                <groupId>com.github.ghik</groupId>
                <artifactId>silencer-plugin_${scala.version}</artifactId>
                <version>${maven.plugin.silencer.version}</version>
              </compilerPlugin>
            </compilerPlugins>
          </configuration>
          <executions>
            <execution>
              <id>scala-compile-first</id>
              <goals>
                <goal>compile</goal>
              </goals>
              <phase>process-resources</phase>
            </execution>
            <execution>
              <id>scala-test-compile-first</id>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <phase>process-test-resources</phase>
            </execution>
            <!--
              CELEBORN-161: we must disable scaladocs to recover building for Spark 2.4
              `build/mvn clean install -DskipTests -Pspark-2.4`
            <execution>
              <id>attach-scaladocs</id>
              <goals>
                <goal>doc-jar</goal>
              </goals>
              <phase>verify</phase>
            </execution>
            -->
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>${maven.plugin.dependency.version}</version>
          <executions>
            <execution>
              <id>default-cli</id>
              <goals>
                <goal>build-classpath</goal>
              </goals>
              <configuration>
                <!-- This includes dependencies with 'runtime' and 'compile' scopes;
                       see the docs for includeScope for more details -->
                <includeScope>runtime</includeScope>
              </configuration>
            </execution>
            <execution>
              <id>copy-module-dependencies</id>
              <goals>
                <goal>copy-dependencies</goal>
              </goals>
              <phase>package</phase>
              <configuration>
                <includeScope>runtime</includeScope>
                <outputDirectory>${jars.target.dir}</outputDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
          <version>${maven.plugin.rat.version}</version>
          <inherited>true</inherited>
          <configuration>
            <excludeSubProjects>false</excludeSubProjects>
            <numUnapprovedLicenses>0</numUnapprovedLicenses>
            <licenseFamilies>
              <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
                <familyName>Apache License 2.0</familyName>
              </licenseFamily>
            </licenseFamilies>
            <excludesFile>.rat-excludes</excludesFile>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>check</goal>
              </goals>
              <phase>verify</phase>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <version>${maven.plugin.resources.version}</version>
        </plugin>

        <plugin>
          <groupId>com.diffplug.spotless</groupId>
          <artifactId>spotless-maven-plugin</artifactId>
          <version>${maven.plugin.spotless.version}</version>
          <configuration>
            <upToDateChecking>
              <enabled>true</enabled>
            </upToDateChecking>
            <java>
              <includes>
                <include>src/main/java/**/*.java</include>
                <include>src/test/java/**/*.java</include>
              </includes>
              <excludes>
                <exclude>src/main/java/org/apache/celeborn/rest/v1/**/*.java</exclude>
              </excludes>
              <googleJavaFormat>
                <version>1.7</version>
                <style>GOOGLE</style>
              </googleJavaFormat>
              <removeUnusedImports></removeUnusedImports>
              <importOrder>
                <order>java,javax,scala,,org.apache.celeborn</order>
              </importOrder>
            </java>
            <scala>
              <includes>
                <include>src/main/scala/**/*.scala</include>
                <include>src/test/scala/**/*.scala</include>
              </includes>
              <scalafmt>
                <version>3.1.1</version>
                <file>${maven.multiModuleProjectDirectory}/.scalafmt.conf</file>
              </scalafmt>
            </scala>
            <pom>
              <includes>
                <include>pom.xml</include>
              </includes>

              <sortPom>
                <encoding>UTF-8</encoding>
                <keepBlankLines>true</keepBlankLines>
                <nrOfIndentSpace>2</nrOfIndentSpace>
                <indentBlankLines>false</indentBlankLines>
              </sortPom>
            </pom>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>check</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>${maven.plugin.jacoco.version}</version>
          <executions>
            <execution>
              <id>pre-test</id>
              <goals>
                <goal>prepare-agent</goal>
              </goals>
            </execution>
            <execution>
              <id>report</id>
              <goals>
                <goal>report-aggregate</goal>
              </goals>
              <phase>test</phase>
              <configuration>
                <outputDirectory>${project.build.directory}/codecov</outputDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>

        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven.plugin.compiler.version}</version>
          <configuration>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <encoding>UTF-8</encoding>
            <fork>true</fork>
            <compilerArgs>
              <arg>-XDcompilePolicy=simple</arg>
              <arg>-Xplugin:ErrorProne \
                -XepExcludedPaths:.*/target/generated-sources/.* \
                -Xep:BadImport:OFF \
                -Xep:EmptyBlockTag:OFF \
                -Xep:EmptyCatch:OFF \
                -Xep:EqualsGetClass:OFF \
                -Xep:FutureReturnValueIgnored:OFF \
                -Xep:JdkObsolete:OFF \
                -Xep:MissingSummary:OFF \
                -Xep:MutableConstantField:OFF \
                -Xep:StringSplitter:OFF \
                -Xep:TypeParameterUnusedInFormals:OFF \
                -Xep:UnnecessaryParentheses:OFF \
                -Xep:UnusedVariable:OFF</arg>
            </compilerArgs>
            <annotationProcessorPaths>
              <path>
                <groupId>com.google.errorprone</groupId>
                <artifactId>error_prone_core</artifactId>
                <version>${error-prone.version}</version>
              </path>
            </annotationProcessorPaths>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.openapitools</groupId>
          <artifactId>openapi-generator-maven-plugin</artifactId>
          <version>${openapi.generator.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.scalatest</groupId>
        <artifactId>scalatest-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>flatten-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>hadoop-3</id>
      <activation>
        <property>
          <name>hadoop.version</name>
          <value>/^3\..*$/</value>
        </property>
      </activation>
      <properties>
        <hadoop-3-deps>true</hadoop-3-deps>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client-api</artifactId>
          <version>${hadoop.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client-runtime</artifactId>
          <version>${hadoop.version}</version>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>hadoop-2</id>
      <activation>
        <property>
          <name>hadoop.version</name>
          <value>/^2\..*$/</value>
        </property>
      </activation>
      <properties>
        <hadoop-2-deps>true</hadoop-2-deps>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>${hadoop.version}</version>
          <exclusions>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-annotations</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-mapreduce-client-app</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-mapreduce-client-core</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-yarn-client</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-yarn-registry</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.apache.hadoop</groupId>
              <artifactId>hadoop-yarn-server-common</artifactId>
            </exclusion>
            <exclusion>
              <groupId>org.fusesource.leveldbjni</groupId>
              <artifactId>leveldbjni-all</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>hadoop-aws</id>
      <properties>
        <hadoop-aws-deps>true</hadoop-aws-deps>
        <aws.version>1.12.367</aws.version>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-aws</artifactId>
          <version>${hadoop.version}</version>
        </dependency>
        <dependency>
          <groupId>com.amazonaws</groupId>
          <artifactId>aws-java-sdk-bundle</artifactId>
          <version>${aws.version}</version>
        </dependency>
      </dependencies>
    </profile>
    <profile>
      <id>spark-2.4</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-2</module>
        <module>client-spark/spark-2-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.4.0</lz4-java.version>
        <scala.version>2.11.12</scala.version>
        <scala.binary.version>2.11</scala.binary.version>
        <spark.version>2.4.8</spark.version>
        <zstd-jni.version>1.4.4-3</zstd-jni.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.0</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.7.1</lz4-java.version>
        <scala.version>2.12.10</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.0.3</spark.version>
        <zstd-jni.version>1.4.4-3</zstd-jni.version>
        <maven.plugin.silencer.version>1.6.0</maven.plugin.silencer.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.1</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.7.1</lz4-java.version>
        <scala.version>2.12.10</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.1.3</spark.version>
        <zstd-jni.version>1.4.8-1</zstd-jni.version>
        <maven.plugin.silencer.version>1.6.0</maven.plugin.silencer.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.2</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.7.1</lz4-java.version>
        <scala.version>2.12.15</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.2.4</spark.version>
        <zstd-jni.version>1.5.0-4</zstd-jni.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.3</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.8.0</lz4-java.version>
        <scala.version>2.12.15</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.3.4</spark.version>
        <zstd-jni.version>1.5.2-1</zstd-jni.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.4</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.8.0</lz4-java.version>
        <scala.version>2.12.17</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.4.3</spark.version>
        <zstd-jni.version>1.5.2-5</zstd-jni.version>
      </properties>
    </profile>

    <profile>
      <id>spark-3.5</id>
      <modules>
        <module>client-spark/common</module>
        <module>client-spark/spark-3</module>
        <module>client-spark/spark-3-columnar-common</module>
        <module>client-spark/spark-3.5-columnar-shuffle</module>
        <module>client-spark/spark-3-shaded</module>
        <module>tests/spark-it</module>
      </modules>
      <properties>
        <lz4-java.version>1.8.0</lz4-java.version>
        <scala.version>2.12.18</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <spark.version>3.5.3</spark.version>
        <zstd-jni.version>1.5.5-4</zstd-jni.version>
      </properties>
    </profile>

    <profile>
      <id>jdk-8</id>
      <activation>
        <jdk>1.8</jdk>
      </activation>
      <properties>
        <java.version>8</java.version>
      </properties>
      <dependencies>
        <dependency>
          <groupId>com.github.olivergondza</groupId>
          <artifactId>maven-jdk-tools-wrapper</artifactId>
          <version>0.1</version>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <!-- Based on https://github.com/google/error-prone/blob/f8e33bc460be82ab22256a7ef8b979d7a2cacaba/docs/installation.md#jdk-8 -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <compilerArgs combine.children="append">
                <arg>-J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/${error-prone.jdk8.javac.version}/javac-${error-prone.jdk8.javac.version}.jar</arg>
              </compilerArgs>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>jdk-11</id>
      <activation>
        <jdk>11</jdk>
      </activation>
      <properties>
        <java.version>11</java.version>
      </properties>
    </profile>

    <profile>
      <id>jdk-17</id>
      <activation>
        <jdk>17</jdk>
      </activation>
      <properties>
        <java.version>17</java.version>
      </properties>
      <build>
        <plugins>
          <!-- Based on https://github.com/google/error-prone/blob/f8e33bc460be82ab22256a7ef8b979d7a2cacaba/docs/installation.md#jdk-16 -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.plugin.compiler.version}</version>
            <configuration>
              <source>${java.version}</source>
              <target>${java.version}</target>
              <encoding>UTF-8</encoding>
              <compilerArgs>
                <arg>-XDcompilePolicy=simple</arg>
                <arg>-Xplugin:ErrorProne \
                  -XepExcludedPaths:.*/target/generated-sources/.* \
                  -Xep:BadImport:OFF \
                  -Xep:EmptyBlockTag:OFF \
                  -Xep:EmptyCatch:OFF \
                  -Xep:EqualsGetClass:OFF \
                  -Xep:FutureReturnValueIgnored:OFF \
                  -Xep:JdkObsolete:OFF \
                  -Xep:MissingSummary:OFF \
                  -Xep:MutableConstantField:OFF \
                  -Xep:StringSplitter:OFF \
                  -Xep:TypeParameterUnusedInFormals:OFF \
                  -Xep:UnnecessaryParentheses:OFF \
                  -Xep:UnusedVariable:OFF</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
                <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
                <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
              </compilerArgs>
              <annotationProcessorPaths>
                <path>
                  <groupId>com.google.errorprone</groupId>
                  <artifactId>error_prone_core</artifactId>
                  <version>${error-prone.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>jdk-21</id>
      <activation>
        <jdk>21</jdk>
      </activation>
      <properties>
        <java.version>21</java.version>
        <error-prone.version>2.25.0</error-prone.version>
      </properties>
      <build>
        <plugins>
          <!-- Based on https://github.com/google/error-prone/blob/f8e33bc460be82ab22256a7ef8b979d7a2cacaba/docs/installation.md#jdk-16 -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.plugin.compiler.version}</version>
            <configuration>
              <source>${java.version}</source>
              <target>${java.version}</target>
              <encoding>UTF-8</encoding>
              <compilerArgs>
                <arg>-XDcompilePolicy=simple</arg>
                <arg>-Xplugin:ErrorProne \
                  -XepExcludedPaths:.*/target/generated-sources/.* \
                  -Xep:BadImport:OFF \
                  -Xep:EmptyBlockTag:OFF \
                  -Xep:EmptyCatch:OFF \
                  -Xep:EqualsGetClass:OFF \
                  -Xep:FutureReturnValueIgnored:OFF \
                  -Xep:JdkObsolete:OFF \
                  -Xep:MissingSummary:OFF \
                  -Xep:MutableConstantField:OFF \
                  -Xep:StringSplitter:OFF \
                  -Xep:TypeParameterUnusedInFormals:OFF \
                  -Xep:UnnecessaryParentheses:OFF \
                  -Xep:UnusedVariable:OFF</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
                <arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
                <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
                <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
              </compilerArgs>
              <annotationProcessorPaths>
                <path>
                  <groupId>com.google.errorprone</groupId>
                  <artifactId>error_prone_core</artifactId>
                  <version>${error-prone.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>flink-1.14</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.14</module>
        <module>client-flink/flink-1.14-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.14.6</flink.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.14_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java_${scala.binary.version}</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients_${scala.binary.version}</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web_${scala.binary.version}</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.15</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.15</module>
        <module>client-flink/flink-1.15-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.15.4</flink.version>
        <flink.binary.version>1.15</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.15_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.16</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.16</module>
        <module>client-flink/flink-1.16-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.16.3</flink.version>
        <flink.binary.version>1.16</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.16_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.17</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.17</module>
        <module>client-flink/flink-1.17-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.17.2</flink.version>
        <flink.binary.version>1.17</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.17_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.18</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.18</module>
        <module>client-flink/flink-1.18-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.18.1</flink.version>
        <flink.binary.version>1.18</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.18_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.19</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.19</module>
        <module>client-flink/flink-1.19-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.19.1</flink.version>
        <flink.binary.version>1.19</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.19_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>flink-1.20</id>
      <modules>
        <module>client-flink/common</module>
        <module>client-flink/flink-1.20</module>
        <module>client-flink/flink-1.20-shaded</module>
        <module>tests/flink-it</module>
      </modules>
      <properties>
        <flink.version>1.20.0</flink.version>
        <flink.binary.version>1.20</flink.binary.version>
        <scala.binary.version>2.12</scala.binary.version>
        <celeborn.flink.plugin.artifact>celeborn-client-flink-1.20_${scala.binary.version}</celeborn.flink.plugin.artifact>
        <flink.streaming.artifact>flink-streaming-java</flink.streaming.artifact>
        <flink.clients.artifact>flink-clients</flink.clients.artifact>
        <flink.scala.artifact>flink-scala_${scala.binary.version}</flink.scala.artifact>
        <flink.runtime.web.artifact>flink-runtime-web</flink.runtime.web.artifact>
      </properties>
    </profile>

    <profile>
      <id>mr</id>
      <modules>
        <module>client-mr/mr</module>
        <module>client-mr/mr-shaded</module>
        <module>tests/mr-it</module>
      </modules>
    </profile>

    <profile>
      <id>web</id>
      <modules>
        <module>web</module>
      </modules>
    </profile>

    <profile>
      <id>google-mirror</id>
      <properties>
        <mavenCentralId>gcs-maven-central-mirror</mavenCentralId>
        <mavenCentralName>GCS Maven Central mirror</mavenCentralName>
        <mavenCentralUrl>https://maven-central.storage-download.googleapis.com/maven2</mavenCentralUrl>
      </properties>
    </profile>

    <profile>
      <id>apache-release</id>
      <build>
        <plugins>
          <!-- Prevent the source-release-assembly execution defined in the Apache parent POM
               from running so we can control it ourselves -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
              <execution>
                <id>source-release-assembly</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>net.nicoulaj.maven.plugins</groupId>
            <artifactId>checksum-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>source-release-checksum</id>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-deploy-plugin</artifactId>
            <inherited>true</inherited>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
              <quiet>true</quiet>
              <doclint>none</doclint>
            </configuration>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <executions>
              <execution>
                <id>sign-release-artifacts</id>
                <goals>
                  <goal>sign</goal>
                </goals>
                <phase>verify</phase>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

    <profile>
      <id>kubernetes-it</id>
      <modules>
        <module>tests/kubernetes-it</module>
      </modules>
    </profile>

    <!-- use org.openlabtesting.leveldbjni on aarch64 platform except MacOS -->
    <profile>
      <id>aarch64</id>
      <activation>
        <os>
          <family>linux</family>
          <arch>aarch64</arch>
        </os>
      </activation>
      <properties>
        <!-- org.openlabtesting.leveldbjni requires glibc version 3.4.21 -->
        <leveldbjni.group>org.openlabtesting.leveldbjni</leveldbjni.group>
      </properties>
    </profile>
  </profiles>
</project>
