<?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>21</version>
  </parent>

  <groupId>org.apache.hudi</groupId>
  <artifactId>hudi</artifactId>
  <packaging>pom</packaging>
  <version>0.12.0-SNAPSHOT</version>
  <description>Apache Hudi brings stream style processing on big data</description>
  <url>https://github.com/apache/hudi</url>
  <name>Hudi</name>

  <modules>
    <module>hudi-common</module>
    <module>hudi-cli</module>
    <module>hudi-client</module>
    <module>hudi-aws</module>
    <module>hudi-gcp</module>
    <module>hudi-hadoop-mr</module>
    <module>hudi-spark-datasource</module>
    <module>hudi-timeline-service</module>
    <module>hudi-utilities</module>
    <module>hudi-sync</module>
    <module>packaging/hudi-hadoop-mr-bundle</module>
    <module>packaging/hudi-datahub-sync-bundle</module>
    <module>packaging/hudi-hive-sync-bundle</module>
    <module>packaging/hudi-gcp-bundle</module>
    <module>packaging/hudi-spark-bundle</module>
    <module>packaging/hudi-presto-bundle</module>
    <module>packaging/hudi-utilities-bundle</module>
    <module>packaging/hudi-utilities-slim-bundle</module>
    <module>packaging/hudi-timeline-server-bundle</module>
    <module>packaging/hudi-trino-bundle</module>
    <module>hudi-examples</module>
    <module>hudi-flink-datasource</module>
    <module>hudi-kafka-connect</module>
    <module>packaging/hudi-flink-bundle</module>
    <module>packaging/hudi-kafka-connect-bundle</module>
  </modules>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <organization>
    <name>The Apache Software Foundation</name>
    <url>https://www.apache.org</url>
  </organization>

  <properties>
    <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
    <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>
    <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version>
    <maven-shade-plugin.version>3.2.4</maven-shade-plugin.version>
    <maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
    <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
    <maven-deploy-plugin.version>2.4</maven-deploy-plugin.version>
    <genjavadoc-plugin.version>0.15</genjavadoc-plugin.version>
    <build-helper-maven-plugin.version>1.7</build-helper-maven-plugin.version>
    <maven-enforcer-plugin.version>3.0.0-M1</maven-enforcer-plugin.version>
    <maven-docker-plugin.version>0.37.0</maven-docker-plugin.version>

    <java.version>1.8</java.version>
    <fasterxml.version>2.6.7</fasterxml.version>
    <fasterxml.jackson.databind.version>2.6.7.3</fasterxml.jackson.databind.version>
    <fasterxml.jackson.module.scala.version>2.6.7.1</fasterxml.jackson.module.scala.version>
    <fasterxml.jackson.dataformat.yaml.version>2.7.4</fasterxml.jackson.dataformat.yaml.version>
    <fasterxml.spark3.version>2.10.0</fasterxml.spark3.version>
    <kafka.version>2.0.0</kafka.version>
    <kafka.spark3.version>2.4.1</kafka.spark3.version>
    <pulsar.version>2.8.1</pulsar.version>
    <confluent.version>5.3.4</confluent.version>
    <glassfish.version>2.17</glassfish.version>
    <parquet.version>1.10.1</parquet.version>
    <junit.jupiter.version>5.7.0-M1</junit.jupiter.version>
    <junit.vintage.version>5.7.0-M1</junit.vintage.version>
    <junit.platform.version>1.7.0-M1</junit.platform.version>
    <mockito.jupiter.version>3.3.3</mockito.jupiter.version>
    <log4j.version>1.2.17</log4j.version>
    <log4j.test.version>2.17.0</log4j.test.version>
    <slf4j.version>1.7.30</slf4j.version>
    <joda.version>2.9.9</joda.version>
    <hadoop.version>2.10.1</hadoop.version>
    <hive.groupid>org.apache.hive</hive.groupid>
    <hive.version>2.3.1</hive.version>
    <hive.exec.classifier>core</hive.exec.classifier>
    <metrics.version>4.1.1</metrics.version>
    <orc.version>1.6.0</orc.version>
    <airlift.version>0.16</airlift.version>
    <prometheus.version>0.8.0</prometheus.version>
    <http.version>4.4.1</http.version>
    <spark.version>${spark2.version}</spark.version>
    <spark2.version>2.4.4</spark2.version>
    <spark3.version>3.2.1</spark3.version>
    <sparkbundle.version></sparkbundle.version>
    <flink1.14.version>1.14.4</flink1.14.version>
    <flink1.13.version>1.13.6</flink1.13.version>
    <flink.version>${flink1.14.version}</flink.version>
    <hudi.flink.module>hudi-flink1.14.x</hudi.flink.module>
    <flink.bundle.version>1.14</flink.bundle.version>
    <flink.runtime.artifactId>flink-runtime</flink.runtime.artifactId>
    <flink.table.runtime.artifactId>flink-table-runtime_${scala.binary.version}</flink.table.runtime.artifactId>
    <flink.table.planner.artifactId>flink-table-planner_${scala.binary.version}</flink.table.planner.artifactId>
    <flink.format.parquet.version>1.12.2</flink.format.parquet.version>
    <spark31.version>3.1.3</spark31.version>
    <spark32.version>3.2.1</spark32.version>
    <hudi.spark.module>hudi-spark2</hudi.spark.module>
    <hudi.spark.common.module>hudi-spark2-common</hudi.spark.common.module>
    <avro.version>1.8.2</avro.version>
    <caffeine.version>2.9.1</caffeine.version>
    <scala11.version>2.11.12</scala11.version>
    <scala12.version>2.12.10</scala12.version>
    <scala.version>${scala11.version}</scala.version>
    <scala.binary.version>2.11</scala.binary.version>
    <apache-rat-plugin.version>0.13</apache-rat-plugin.version>
    <scala-maven-plugin.version>3.3.1</scala-maven-plugin.version>
    <scalatest.version>3.0.1</scalatest.version>
    <scalatest.spark3.version>3.1.0</scalatest.spark3.version>
    <surefire-log4j.file>file://${project.basedir}/src/test/resources/log4j-surefire.properties</surefire-log4j.file>
    <thrift.version>0.12.0</thrift.version>
    <jetty.version>9.4.15.v20190215</jetty.version>
    <htrace.version>3.1.0-incubating</htrace.version>
    <hbase.version>2.4.9</hbase.version>
    <hbase-thirdparty.version>3.5.1</hbase-thirdparty.version>
    <codehaus-jackson.version>1.9.13</codehaus-jackson.version>
    <h2.version>1.4.199</h2.version>
    <awaitility.version>3.1.2</awaitility.version>
    <skipTests>false</skipTests>
    <skipUTs>${skipTests}</skipUTs>
    <skipFTs>${skipTests}</skipFTs>
    <skipITs>${skipTests}</skipITs>
    <skip.hudi-spark2.unit.tests>${skipTests}</skip.hudi-spark2.unit.tests>
    <skip.hudi-spark3.unit.tests>${skipTests}</skip.hudi-spark3.unit.tests>
    <skipDocker>${skipTests}</skipDocker>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <main.basedir>${project.basedir}</main.basedir>
    <spark.bundle.hive.scope>provided</spark.bundle.hive.scope>
    <spark.bundle.hive.shade.prefix/>
    <utilities.bundle.hive.scope>provided</utilities.bundle.hive.scope>
    <utilities.bundle.hive.shade.prefix/>
    <argLine>-Xmx2g</argLine>
    <jacoco.version>0.8.5</jacoco.version>
    <presto.bundle.bootstrap.scope>compile</presto.bundle.bootstrap.scope>
    <presto.bundle.bootstrap.shade.prefix>org.apache.hudi.</presto.bundle.bootstrap.shade.prefix>
    <trino.bundle.bootstrap.scope>compile</trino.bundle.bootstrap.scope>
    <trino.bundle.bootstrap.shade.prefix>org.apache.hudi.</trino.bundle.bootstrap.shade.prefix>
    <shadeSources>true</shadeSources>
    <zk-curator.version>2.7.1</zk-curator.version>
    <antlr.version>4.7</antlr.version>
    <aws.sdk.version>1.12.22</aws.sdk.version>
    <proto.version>3.17.3</proto.version>
    <protoc.version>3.11.4</protoc.version>
    <dynamodb.lockclient.version>1.1.0</dynamodb.lockclient.version>
    <zookeeper.version>3.5.7</zookeeper.version>
    <dynamodb-local.port>8000</dynamodb-local.port>
    <dynamodb-local.endpoint>http://localhost:${dynamodb-local.port}</dynamodb-local.endpoint>
  </properties>

  <scm>
    <connection>scm:git:git@github.com:apache/hudi.git</connection>
    <developerConnection>scm:git:git@github.com:apache/hudi.git</developerConnection>
    <url>git@github.com:apache/hudi.git</url>
    <tag>HEAD</tag>
  </scm>

  <issueManagement>
    <system>JIRA</system>
    <url>https://issues.apache.org/jira/browse/HUDI</url>
  </issueManagement>

  <mailingLists>
    <mailingList>
      <name>Dev Mailing List</name>
      <post>dev@hudi.apache.org</post>
      <subscribe>dev-subscribe@hudi.apache.org</subscribe>
      <unsubscribe>dev-unsubscribe@hudi.apache.org</unsubscribe>
    </mailingList>
    <mailingList>
      <name>User Mailing List</name>
      <post>users@hudi.apache.org</post>
      <subscribe>users-subscribe@hudi.apache.org</subscribe>
      <unsubscribe>users-unsubscribe@hudi.apache.org</unsubscribe>
    </mailingList>
    <mailingList>
      <name>Commits Mailing List</name>
      <post>commits@hudi.apache.org</post>
      <subscribe>commits-subscribe@hudi.apache.org</subscribe>
      <unsubscribe>commits-unsubscribe@hudi.apache.org</unsubscribe>
    </mailingList>
  </mailingLists>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.2.1</version>
        <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-checkstyle-plugin</artifactId>
        <version>3.0.0</version>
        <dependencies>
          <dependency>
            <groupId>com.puppycrawl.tools</groupId>
            <artifactId>checkstyle</artifactId>
            <version>8.18</version>
          </dependency>
        </dependencies>
        <configuration>
          <consoleOutput>true</consoleOutput>
          <encoding>UTF-8</encoding>
          <configLocation>style/checkstyle.xml</configLocation>
          <suppressionsLocation>style/checkstyle-suppressions.xml</suppressionsLocation>
          <suppressionsFileExpression>checkstyle.suppressions.file</suppressionsFileExpression>
          <failOnViolation>true</failOnViolation>
          <violationSeverity>warning</violationSeverity>
          <includeTestSourceDirectory>true</includeTestSourceDirectory>
          <sourceDirectories>
            <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
          </sourceDirectories>
          <!-- NOTE: This property is only available in Maven >= 3.3.1 -->
          <propertyExpansion>basedir=${maven.multiModuleProjectDirectory}</propertyExpansion>
          <excludes>**\/generated-sources\/</excludes>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
<!--
      See https://jira.apache.org/jira/browse/HUDI-304
      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
        <version>1.24.3</version>
        <configuration>
          <java>
            <eclipse>
              <file>${main.basedir}/style/eclipse-java-google-style.xml</file>
              <version>4.10.0</version>
            </eclipse>
          </java>
          <scala>
            <trimTrailingWhitespace />
          </scala>
        </configuration>
        <executions>
          <execution>
            <id>spotless-check</id>
            <phase>compile</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin.version}</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.3</version>
        <configuration>
          <autoVersionSubmodules>true</autoVersionSubmodules>
          <useReleaseProfile>false</useReleaseProfile>
          <releaseProfiles>release,integration-tests</releaseProfiles>
          <goals>deploy</goals>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>${maven-deploy-plugin.version}</version>
        <executions>
          <execution>
            <id>default-deploy</id>
            <phase>deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>${maven-failsafe-plugin.version}</version>
        <configuration>
          <skip>${skipITs}</skip>
          <argLine>@{argLine}</argLine>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
      </plugin>
      <plugin>
        <groupId>io.fabric8</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>${maven-docker-plugin.version}</version>
        <configuration>
          <skip>${skipDocker}</skip>
        </configuration>
      </plugin>
    </plugins>

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${maven-surefire-plugin.version}</version>
          <configuration>
            <rerunFailingTestsCount>3</rerunFailingTestsCount>
            <argLine>@{argLine}</argLine>
            <trimStackTrace>false</trimStackTrace>
            <systemPropertyVariables>
              <log4j.configuration>
                ${surefire-log4j.file}
              </log4j.configuration>
            </systemPropertyVariables>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${maven-jar-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>net.alchim31.maven</groupId>
          <artifactId>scala-maven-plugin</artifactId>
          <version>${scala-maven-plugin.version}</version>
          <configuration>
            <checkMultipleScalaVersions>false</checkMultipleScalaVersions>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
          <!-- excludes are inherited -->
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
          <version>${apache-rat-plugin.version}</version>
          <configuration>
            <excludeSubProjects>false</excludeSubProjects>
            <numUnapprovedLicenses>0</numUnapprovedLicenses>
            <licenses>
              <!-- Enforce this license:
                   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.
              -->
              <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
                <licenseFamilyCategory>AL2 </licenseFamilyCategory>
                <licenseFamilyName>Apache License 2.0</licenseFamilyName>
                <notes />
                <patterns>
                  <pattern>Licensed to the Apache Software Foundation (ASF) under one</pattern>
                </patterns>
              </license>
            </licenses>
            <licenseFamilies>
              <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
                <familyName>Apache License 2.0</familyName>
              </licenseFamily>
            </licenseFamilies>
            <excludes>
              <exclude>NOTICE</exclude>
              <exclude>DISCLAIMER</exclude>
              <exclude>**/.*</exclude>
              <exclude>**/*.json</exclude>
              <exclude>**/*.hfile</exclude>
              <exclude>**/*.log</exclude>
              <exclude>**/*.sqltemplate</exclude>
              <exclude>**/compose_env</exclude>
              <exclude>**/*NOTICE*</exclude>
              <exclude>**/*LICENSE*</exclude>
              <exclude>**/dependency-reduced-pom.xml</exclude>
              <exclude>**/test/resources/*.data</exclude>
              <exclude>**/test/resources/*.commit</exclude>
              <exclude>**/target/**</exclude>
              <exclude>**/generated-sources/**</exclude>
              <exclude>.github/**</exclude>
              <!-- local files not in version control -->
              <exclude>**/*.iml</exclude>
              <exclude>.mvn/**</exclude>
            </excludes>
          </configuration>
          <executions>
            <execution>
              <phase>compile</phase>
              <goals>
                <goal>check</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.avro</groupId>
          <artifactId>avro-maven-plugin</artifactId>
          <version>${avro.version}</version>
          <executions>
            <execution>
              <phase>generate-sources</phase>
              <goals>
                <goal>schema</goal>
              </goals>
              <configuration>
                <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
                <outputDirectory>${project.build.directory}/generated-sources/src/main/java/
                </outputDirectory>
                <stringType>String</stringType>
              </configuration>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.scalastyle</groupId>
          <artifactId>scalastyle-maven-plugin</artifactId>
          <version>1.0.0</version>
          <configuration>
            <verbose>false</verbose>
            <failOnViolation>true</failOnViolation>
            <includeTestSourceDirectory>true</includeTestSourceDirectory>
            <failOnWarning>false</failOnWarning>
            <sourceDirectory>${project.basedir}/src/main/scala</sourceDirectory>
            <testSourceDirectory>${project.basedir}/src/test/scala</testSourceDirectory>
            <configLocation>${main.basedir}/style/scalastyle.xml</configLocation>
            <outputEncoding>UTF-8</outputEncoding>
          </configuration>
          <executions>
            <execution>
              <phase>compile</phase>
              <goals>
                <goal>check</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <dependencyManagement>
    <dependencies>
      <!-- Logging -->
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>

      <!-- Fasterxml -->
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>${fasterxml.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${fasterxml.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${fasterxml.jackson.databind.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-guava</artifactId>
        <version>${fasterxml.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-scala_${scala.binary.version}</artifactId>
        <version>${fasterxml.jackson.module.scala.version}</version>
      </dependency>

      <!-- Glassfish -->
      <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${glassfish.version}</version>
      </dependency>
      <dependency>
        <groupId>org.glassfish.jersey.connectors</groupId>
        <artifactId>jersey-apache-connector</artifactId>
        <version>${glassfish.version}</version>
      </dependency>
      <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>${glassfish.version}</version>
      </dependency>

      <!-- Avro -->
      <dependency>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro</artifactId>
        <version>${avro.version}</version>
        <scope>provided</scope>
      </dependency>

      <!-- caffeine -->
      <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>${caffeine.version}</version>
      </dependency>

      <!-- Parquet -->
      <dependency>
        <groupId>org.apache.parquet</groupId>
        <artifactId>parquet-avro</artifactId>
        <version>${parquet.version}</version>
        <scope>provided</scope>
      </dependency>

      <!-- Spark -->
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <classifier>tests</classifier>
        <version>${spark.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_${scala.binary.version}</artifactId>
        <classifier>tests</classifier>
        <version>${spark.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-catalyst_${scala.binary.version}</artifactId>
        <classifier>tests</classifier>
        <version>${spark.version}</version>
        <scope>test</scope>
      </dependency>

      <!-- Flink -->
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>provided</scope>
      </dependency>

      <!-- Dropwizard Metrics -->
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-graphite</artifactId>
        <version>${metrics.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-jmx</artifactId>
        <version>${metrics.version}</version>
      </dependency>

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient</artifactId>
        <version>${prometheus.version}</version>
      </dependency>
      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_httpserver</artifactId>
        <version>${prometheus.version}</version>
      </dependency>
      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_dropwizard</artifactId>
        <version>${prometheus.version}</version>
      </dependency>
      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_pushgateway</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>com.beust</groupId>
        <artifactId>jcommander</artifactId>
        <version>1.72</version>
      </dependency>

      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>${joda.version}</version>
      </dependency>

      <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.9.1</version>
      </dependency>

      <dependency>
        <groupId>xalan</groupId>
        <artifactId>xalan</artifactId>
        <version>2.7.1</version>
      </dependency>

      <dependency>
        <groupId>org.rocksdb</groupId>
        <artifactId>rocksdbjni</artifactId>
        <version>5.17.2</version>
      </dependency>

      <!-- Httpcomponents -->
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>fluent-hc</artifactId>
        <version>${http.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>${http.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${http.version}</version>
      </dependency>

      <!-- Jackson -->
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>${codehaus-jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${codehaus-jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>${codehaus-jackson.version}</version>
      </dependency>
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>${codehaus-jackson.version}</version>
      </dependency>

      <!-- Hadoop -->
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-auth</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-common</artifactId>
        <version>${hadoop.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <classifier>tests</classifier>
        <scope>test</scope>
        <version>${hadoop.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <classifier>tests</classifier>
        <version>${hadoop.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!-- Hive -->
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-service</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-shims</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-serde</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-metastore</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.transaction</groupId>
            <artifactId>transaction-api</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-common</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>${hive.groupid}</groupId>
        <artifactId>hive-exec</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <classifier>${hive.exec.classifier}</classifier>
        <exclusions>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>${hive.version}</version>
        <scope>provided</scope>
        <exclusions>
          <exclusion>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
          </exclusion>
          <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
          </exclusion>
          <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.pentaho</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.esotericsoftware</groupId>
            <artifactId>kryo-shaded</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!-- Zookeeper -->
      <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>${zk-curator.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-client</artifactId>
        <version>${zk-curator.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>${zk-curator.version}</version>
      </dependency>

      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>${junit.vintage.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-params</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-junit-jupiter</artifactId>
        <scope>test</scope>
        <version>${mockito.jupiter.version}</version>
      </dependency>

      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-runner</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite-api</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-commons</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <!--Used to test execution in task executor after de-serializing-->
        <groupId>com.esotericsoftware</groupId>
        <artifactId>kryo</artifactId>
        <version>4.0.0</version>
        <scope>test</scope>
      </dependency>

      <!-- Other Utils -->
      <dependency>
        <groupId>org.awaitility</groupId>
        <artifactId>awaitility</artifactId>
        <version>${awaitility.version}</version>
        <scope>test</scope>
        <exclusions>
          <exclusion>
            <groupId>org.objenesis</groupId>
            <artifactId>objenesis</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-test-utils_${scala.binary.version}</artifactId>
        <version>${flink.version}</version>
        <scope>test</scope>
        <exclusions>
          <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <!-- Needed for running HiveServer for Tests -->
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.test.version}</version>
        <scope>test</scope>
      </dependency>

    </dependencies>
  </dependencyManagement>
  <repositories>
    <repository>
      <id>Maven Central</id>
      <name>Maven Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>cloudera-repo-releases</id>
      <url>https://repository.cloudera.com/artifactory/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>confluent</id>
      <url>https://packages.confluent.io/maven/</url>
    </repository>
  </repositories>

  <profiles>
    <profile>
      <id>release</id>
      <activation>
        <property>
          <name>deployArtifacts</name>
          <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <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>
            <version>${maven-javadoc-plugin.version}</version>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <doclint>none</doclint>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.4</version>
            <executions>
              <execution>
                <id>sign-artifacts</id>
                <phase>verify</phase>
                <goals>
                  <goal>sign</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>warn-log</id>
      <activation>
        <property>
          <name>env.HUDI_QUIETER_LOGGING</name>
        </property>
      </activation>
      <properties>
        <surefire-log4j.file>file://${project.basedir}/src/test/resources/log4j-surefire-quiet.properties
        </surefire-log4j.file>
      </properties>
    </profile>
    <profile>
      <id>unit-tests</id>
      <properties>
        <skipUTs>false</skipUTs>
        <skipFTs>true</skipFTs>
        <skipITs>true</skipITs>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <dependencies>
              <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-engine</artifactId>
                <version>${junit.jupiter.version}</version>
              </dependency>
            </dependencies>
            <configuration combine.self="append">
              <skip>${skipUTs}</skip>
              <forkedProcessExitTimeoutInSeconds>120</forkedProcessExitTimeoutInSeconds>
              <excludedGroups>functional</excludedGroups>
              <excludes>
                <exclude>**/*FunctionalTestSuite.java</exclude>
                <exclude>**/IT*.java</exclude>
                <exclude>**/testsuite/**/Test*.java</exclude>
              </excludes>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
              </execution>
              <execution>
                <id>post-unit-tests</id>
                <phase>test</phase>
                <goals>
                  <goal>report</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>functional-tests</id>
      <properties>
        <skipUTs>true</skipUTs>
        <skipFTs>false</skipFTs>
        <skipITs>true</skipITs>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <dependencies>
              <dependency>
                <groupId>org.apache.maven.surefire</groupId>
                <artifactId>surefire-junit47</artifactId>
                <version>${maven-surefire-plugin.version}</version>
              </dependency>
            </dependencies>
            <configuration combine.self="append">
              <skip>${skipFTs}</skip>
              <forkCount>1</forkCount>
              <reuseForks>true</reuseForks>
              <includes>
                <include>**/*FunctionalTestSuite.java</include>
              </includes>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
              </execution>
              <execution>
                <id>post-functional-tests</id>
                <phase>test</phase>
                <goals>
                  <goal>report</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.reporting.outputDirectory}/jacoco-ft</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>integration-tests</id>
      <activation>
        <property>
          <name>deployArtifacts</name>
          <value>true</value>
        </property>
      </activation>
      <modules>
        <module>docker/hoodie/hadoop</module>
        <module>hudi-integ-test</module>
        <module>packaging/hudi-integ-test-bundle</module>
      </modules>
      <properties>
        <skipUTs>true</skipUTs>
        <skipFTs>true</skipFTs>
        <skipITs>${skipTests}</skipITs>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <configuration combine.self="override">
              <skip>${skipUTs}</skip>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration combine.self="override">
              <skip>${skipITs}</skip>
              <includes>
                <include>**/IT*.java</include>
              </includes>
              <systemPropertyVariables>
                <dynamodb-local.endpoint>${dynamodb-local.endpoint}</dynamodb-local.endpoint>
              </systemPropertyVariables>
            </configuration>
            <executions>
              <execution>
                <phase>integration-test</phase>
                <goals>
                  <goal>integration-test</goal>
                </goals>
              </execution>
              <execution>
                <id>verify-integration-test</id>
                <phase>verify</phase>
                <goals>
                  <goal>verify</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
              </execution>
              <execution>
                <id>post-integration-tests</id>
                <phase>test</phase>
                <goals>
                  <goal>report</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>javadocs</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>${java.version}</source>
              <target>${java.version}</target>
            </configuration>
          </plugin>
          <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>${scala-maven-plugin.version}</version>
            <executions>
              <execution>
                <id>doc</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>compile</goal>
                </goals>
                <configuration>
                  <excludes>
                    <exclude>${project.basedir}/src/main/scala</exclude>
                  </excludes>
                  <checkMultipleScalaVersions>false</checkMultipleScalaVersions>
                </configuration>
              </execution>
            </executions>
            <configuration>
              <args>
                <arg>-P:genjavadoc:out=${project.build.directory}/genjavadoc</arg>
              </args>
              <compilerPlugins>
                <compilerPlugin>
                  <groupId>com.typesafe.genjavadoc</groupId>
                  <artifactId>genjavadoc-plugin_${scala.version}</artifactId>
                  <version>${genjavadoc-plugin.version}</version>
                </compilerPlugin>
              </compilerPlugins>
              <excludes>
                <exclude>**/*.scala</exclude>
              </excludes>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>${build-helper-maven-plugin.version}</version>
            <executions>
              <execution>
                <phase>generate-sources</phase>
                <goals>
                  <goal>add-source</goal>
                </goals>
                <configuration>
                  <sources>
                    <source>${project.build.directory}/genjavadoc</source>
                  </sources>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>${maven-javadoc-plugin.version}</version>
            <executions>
              <execution>
                <id>aggregate</id>
                <goals>
                  <goal>aggregate</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <!-- Turn off the javadoc doclint for now due to incomplete javadoc in the source
              <doclint>all,-missing</doclint>
              -->
              <doclint>none</doclint>
              <detectLinks>true</detectLinks>
              <links>
                <link>https://avro.apache.org/docs/${avro.version}/api/java</link>
                <link>https://docs.spring.io/spring-shell/docs/1.2.0.RELEASE</link>
                <link>https://fasterxml.github.io/jackson-databind/javadoc/2.6</link>
                <link>https://hadoop.apache.org/docs/r${hadoop.version}/api</link>
                <link>https://hbase.apache.org/2.4/apidocs</link>
                <link>https://hive.apache.org/javadocs/r2.3.6/api</link>
                <link>https://javadoc.io/static/io.javalin/javalin/2.3.0</link>
                <link>https://javadoc.io/doc/org.apache.parquet/parquet-avro/${parquet.version}</link>
                <link>https://javadoc.io/static/org.apache.parquet/parquet-hadoop/${parquet.version}</link>
                <link>https://logging.apache.org/log4j/1.2/apidocs</link>
                <link>https://metrics.dropwizard.io/4.1.0/apidocs</link>
                <link>https://spark.apache.org/docs/${spark.version}/api/java</link>
              </links>
              <sourceFileExcludes>
                <!--
                    Exclude the generated java files with the static reference to
                    the singleton instance of the Scala object, to avoid redundancy in javadoc
                -->
                <exclude>**/*$.java</exclude>
              </sourceFileExcludes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <!-- Exists for backwards compatibility; profile doesn't do anything -->
    <profile>
      <id>scala-2.11</id>
    </profile>
    <profile>
      <id>scala-2.12</id>
      <properties>
        <scala.version>${scala12.version}</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
      </properties>
      <activation>
        <property>
          <name>scala-2.12</name>
        </property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>${maven-enforcer-plugin.version}</version>
            <executions>
              <execution>
                <id>enforce-versions</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <bannedDependencies>
                      <excludes combine.children="append">
                        <exclude>*:*_2.11</exclude>
                      </excludes>
                    </bannedDependencies>
                  </rules>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>

    <!-- Default is spark2 profile, and spark2 is an alias of spark2.4 -->
    <profile>
      <id>spark2</id>
      <modules>
        <module>hudi-spark-datasource/hudi-spark2</module>
        <module>hudi-spark-datasource/hudi-spark2-common</module>
      </modules>
      <properties>
        <skip.hudi-spark3.unit.tests>true</skip.hudi-spark3.unit.tests>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
        <property>
          <name>spark2</name>
          <!-- add spark2 moudule to all profile -->
          <value>!disabled</value>
        </property>
      </activation>
    </profile>

    <profile>
      <id>spark2.4</id>
      <modules>
        <module>hudi-spark-datasource/hudi-spark2</module>
        <module>hudi-spark-datasource/hudi-spark2-common</module>
      </modules>
      <properties>
        <sparkbundle.version>2.4</sparkbundle.version>
        <skip.hudi-spark3.unit.tests>true</skip.hudi-spark3.unit.tests>
      </properties>
      <activation>
        <property>
          <name>spark2.4</name>
        </property>
      </activation>
    </profile>

    <!-- spark3 is an alias of spark3.2 -->
    <profile>
      <id>spark3</id>
      <properties>
        <spark3.version>3.2.1</spark3.version>
        <spark.version>${spark3.version}</spark.version>
        <sparkbundle.version>3</sparkbundle.version>
        <scala.version>${scala12.version}</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <hudi.spark.module>hudi-spark3</hudi.spark.module>
        <hudi.spark.common.module>hudi-spark3-common</hudi.spark.common.module>
        <scalatest.version>${scalatest.spark3.version}</scalatest.version>
        <kafka.version>${kafka.spark3.version}</kafka.version>
        <parquet.version>1.12.2</parquet.version>
        <avro.version>1.10.2</avro.version>
        <orc.version>1.6.12</orc.version>
        <antlr.version>4.8</antlr.version>
        <fasterxml.version>${fasterxml.spark3.version}</fasterxml.version>
        <fasterxml.jackson.databind.version>${fasterxml.spark3.version}</fasterxml.jackson.databind.version>
        <fasterxml.jackson.module.scala.version>${fasterxml.spark3.version}</fasterxml.jackson.module.scala.version>
        <fasterxml.jackson.dataformat.yaml.version>${fasterxml.spark3.version}
        </fasterxml.jackson.dataformat.yaml.version>
        <skip.hudi-spark2.unit.tests>true</skip.hudi-spark2.unit.tests>
        <skipITs>true</skipITs>
      </properties>
      <modules>
        <module>hudi-spark-datasource/hudi-spark3</module>
        <module>hudi-spark-datasource/hudi-spark3-common</module>
      </modules>
      <activation>
        <property>
          <name>spark3</name>
        </property>
      </activation>
    </profile>

    <profile>
      <id>spark3.1</id>
      <properties>
        <spark3.version>3.1.3</spark3.version>
        <spark.version>${spark3.version}</spark.version>
        <sparkbundle.version>3.1</sparkbundle.version>
        <scala.version>${scala12.version}</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <hudi.spark.module>hudi-spark3.1.x</hudi.spark.module>
        <hudi.spark.common.module>hudi-spark3-common</hudi.spark.common.module>
        <scalatest.version>${scalatest.spark3.version}</scalatest.version>
        <kafka.version>${kafka.spark3.version}</kafka.version>
        <antlr.version>4.8-1</antlr.version>
        <fasterxml.version>${fasterxml.spark3.version}</fasterxml.version>
        <fasterxml.jackson.databind.version>${fasterxml.spark3.version}</fasterxml.jackson.databind.version>
        <fasterxml.jackson.module.scala.version>${fasterxml.spark3.version}</fasterxml.jackson.module.scala.version>
        <fasterxml.jackson.dataformat.yaml.version>${fasterxml.spark3.version}
        </fasterxml.jackson.dataformat.yaml.version>
        <skip.hudi-spark2.unit.tests>true</skip.hudi-spark2.unit.tests>
        <skipITs>true</skipITs>
      </properties>
      <modules>
        <module>hudi-spark-datasource/hudi-spark3.1.x</module>
        <module>hudi-spark-datasource/hudi-spark3-common</module>
      </modules>
      <activation>
        <property>
          <name>spark3.1</name>
        </property>
      </activation>
    </profile>

    <profile>
      <id>spark3.2</id>
      <properties>
        <spark3.version>3.2.1</spark3.version>
        <spark.version>${spark3.version}</spark.version>
        <sparkbundle.version>3.2</sparkbundle.version>
        <scala.version>${scala12.version}</scala.version>
        <scala.binary.version>2.12</scala.binary.version>
        <hudi.spark.module>hudi-spark3</hudi.spark.module>
        <hudi.spark.common.module>hudi-spark3-common</hudi.spark.common.module>
        <scalatest.version>${scalatest.spark3.version}</scalatest.version>
        <kafka.version>${kafka.spark3.version}</kafka.version>
        <parquet.version>1.12.2</parquet.version>
        <avro.version>1.10.2</avro.version>
        <orc.version>1.6.12</orc.version>
        <antlr.version>4.8</antlr.version>
        <fasterxml.version>${fasterxml.spark3.version}</fasterxml.version>
        <fasterxml.jackson.databind.version>${fasterxml.spark3.version}</fasterxml.jackson.databind.version>
        <fasterxml.jackson.module.scala.version>${fasterxml.spark3.version}</fasterxml.jackson.module.scala.version>
        <fasterxml.jackson.dataformat.yaml.version>${fasterxml.spark3.version}
        </fasterxml.jackson.dataformat.yaml.version>
        <skip.hudi-spark2.unit.tests>true</skip.hudi-spark2.unit.tests>
        <skipITs>true</skipITs>
      </properties>
      <modules>
        <module>hudi-spark-datasource/hudi-spark3</module>
        <module>hudi-spark-datasource/hudi-spark3-common</module>
      </modules>
      <activation>
        <property>
          <name>spark3.2</name>
        </property>
      </activation>
    </profile>

    <profile>
      <id>flink1.14</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <property>
          <name>flink1.14</name>
          <!-- add flink1.14 module to all profile -->
          <value>!disabled</value>
        </property>
      </activation>
    </profile>
    <profile>
      <id>flink1.13</id>
      <properties>
        <flink.version>${flink1.13.version}</flink.version>
        <flink.runtime.artifactId>flink-runtime_${scala.binary.version}</flink.runtime.artifactId>
        <flink.table.runtime.artifactId>flink-table-runtime-blink_${scala.binary.version}</flink.table.runtime.artifactId>
        <flink.table.planner.artifactId>flink-table-planner-blink_${scala.binary.version}</flink.table.planner.artifactId>
        <hudi.flink.module>hudi-flink1.13.x</hudi.flink.module>
        <flink.bundle.version>1.13</flink.bundle.version>
        <skipITs>true</skipITs>
      </properties>
      <activation>
        <property>
          <name>flink1.13</name>
        </property>
      </activation>
    </profile>

    <profile>
      <id>skipShadeSources</id>
      <properties>
        <shadeSources>false</shadeSources>
      </properties>
      <activation>
        <property>
          <name>skipShadeSources</name>
        </property>
      </activation>
    </profile>
  </profiles>

</project>
