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

    <artifactId>paimon-parent</artifactId>
    <groupId>org.apache.paimon</groupId>
    <name>Paimon : </name>
    <version>1.2.0</version>
    <packaging>pom</packaging>

    <url>https://paimon.apache.org</url>
    <inceptionYear>2023</inceptionYear>

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

    <scm>
        <url>https://github.com/apache/paimon</url>
        <connection>git@github.com:apache/paimon.git</connection>
        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/paimon.git</developerConnection>
    </scm>

    <modules>
        <module>paimon-benchmark</module>
        <module>paimon-codegen</module>
        <module>paimon-codegen-loader</module>
        <module>paimon-common</module>
        <module>paimon-core</module>
        <module>paimon-flink</module>
        <module>paimon-docs</module>
        <module>paimon-e2e-tests</module>
        <module>paimon-filesystems</module>
        <module>paimon-format</module>
        <module>paimon-bundle</module>
        <module>paimon-hive</module>
        <module>paimon-spark</module>
        <module>paimon-service</module>
        <module>paimon-test-utils</module>
        <module>paimon-arrow</module>
        <module>tools/ci/paimon-ci-tools</module>
        <module>paimon-hudi</module>
        <module>paimon-api</module>
    </modules>

    <properties>
        <project.build.outputTimestamp>2025-06-20T09:07:48Z</project.build.outputTimestamp>
        <paimon.shade.version>0.8.0</paimon.shade.version>
        <paimon.shade.jackson.version>2.14.2</paimon.shade.jackson.version>
        <paimon.shade.guava.version>30.1.1-jre</paimon.shade.guava.version>
        <paimon.shade.caffeine.version>2.9.3</paimon.shade.caffeine.version>
        <paimon.shade.netty.version>4.1.100.Final</paimon.shade.netty.version>
        <antlr4.version>4.9.3</antlr4.version>
        <hadoop.version>2.8.5</hadoop.version>
        <scala.binary.version>2.12</scala.binary.version>
        <!-- TODO: Update default Flink to 2.x after Paimon updates default Java to 11 -->
        <paimon-flinkx-common>paimon-flink1-common</paimon-flinkx-common>
        <paimon-flink-common.flink.version>1.20.1</paimon-flink-common.flink.version>
        <flink.scala.binary.version>2.12</flink.scala.binary.version>
        <scala212.version>2.12.18</scala212.version>
        <scala213.version>2.13.16</scala213.version>
        <scala.version>${scala212.version}</scala.version>
        <codegen.scala.version>${scala212.version}</codegen.scala.version>
        <snappy.version>1.1.8.4</snappy.version>
        <airlift.version>0.27</airlift.version>
        <lz4.version>1.8.0</lz4.version>
        <slf4j.version>1.7.32</slf4j.version>
        <log4j.version>2.17.1</log4j.version>
        <junit4.version>4.13.2</junit4.version>
        <junit5.version>5.8.1</junit5.version>
        <spotless.version>2.13.0</spotless.version>
        <spotless.delimiter>package</spotless.delimiter>
        <target.java.version>1.8</target.java.version>
        <assertj.version>3.23.1</assertj.version>
        <javax.annotation-api.version>1.3.2</javax.annotation-api.version>
        <flink.forkCount>1C</flink.forkCount>
        <flink.reuseForks>true</flink.reuseForks>
        <testcontainers.version>1.19.1</testcontainers.version>
        <iceberg.version>1.6.1</iceberg.version>
        <hudi.version>0.15.0</hudi.version>
        <parquet.version>1.15.1</parquet.version>
        <orc.version>1.9.2</orc.version>
        <protobuf-java.version>3.19.6</protobuf-java.version>
        <roaringbitmap.version>1.2.1</roaringbitmap.version>

        <!-- Can be set to any value to reproduce a specific build. -->
        <test.randomization.seed/>
        <test.unit.pattern>**/*Test.*</test.unit.pattern>
        <test.flink.main.version>1.20</test.flink.main.version>
        <test.flink.version>1.20.1</test.flink.version>
        <test.flink.connector.kafka.version>3.4.0-1.20</test.flink.connector.kafka.version>
        <test.flink.connector.hive.version>1.20.0</test.flink.connector.hive.version>
        <test.mysql.connector.java.version>8.0.27</test.mysql.connector.java.version>

        <!-- spark profile properties-->
        <paimon-sparkx-common>paimon-spark3-common</paimon-sparkx-common>
        <paimon-spark-common.spark.version>3.5.6</paimon-spark-common.spark.version>
        <test.spark.main.version>3.3</test.spark.main.version>
        <test.spark.version>3.3.0</test.spark.version>

        <zstd-jni.version>1.5.5-11</zstd-jni.version>
        <janino.version>3.0.11</janino.version>
        <mockito.version>3.4.6</mockito.version>
        <okhttp.version>4.12.0</okhttp.version>
        <jaxb.api.version>2.3.1</jaxb.api.version>
        <findbugs.version>1.3.9</findbugs.version>
        <json-smart.version>2.5.2</json-smart.version>
        <avro.version>1.11.4</avro.version>
        <kafka.version>3.2.3</kafka.version>
        <scala-maven-plugin.version>3.2.2</scala-maven-plugin.version>
        <scalatest-maven-plugin.version>2.1.0</scalatest-maven-plugin.version>
        <jsoup.version>1.15.3</jsoup.version>
        <CodeCacheSize>128m</CodeCacheSize>
        <extraJavaTestArgs>
            -XX:+IgnoreUnrecognizedVMOptions
            --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.ref=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
            -Djdk.reflect.useDirectMethodHandle=false
            -Dio.netty.tryReflectionSetAccessible=true
        </extraJavaTestArgs>
    </properties>

    <dependencies>
        <!-- Root dependencies for all projects -->
        <!-- Logging API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

        <!-- 'javax.annotation' classes like '@Nullable' -->
        <dependency>
            <groupId>com.google.code.findbugs</groupId>
            <artifactId>jsr305</artifactId>
        </dependency>

        <!-- test dependencies -->

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- tests will have log4j as the default logging framework available -->

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <!-- API bridge between log4j 1 and 2 -->
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>javax.annotation-api</artifactId>
                <version>${javax.annotation-api.version}</version>
            </dependency>

            <!-- This manages the 'javax.annotation' annotations (JSR305) -->
            <dependency>
                <groupId>com.google.code.findbugs</groupId>
                <artifactId>jsr305</artifactId>
                <version>${findbugs.version}</version>
            </dependency>

            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>${junit5.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit4.version}</version>
            </dependency>

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4j.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-slf4j-impl</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <dependency>
                <!-- API bridge between log4j 1 and 2 -->
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-1.2-api</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <dependency>
                <!-- pin transitive dependency of org.apache.hadoop:hadoop-common:2.8.5 -->
                <groupId>net.minidev</groupId>
                <artifactId>json-smart</artifactId>
                <version>${json-smart.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <profiles>
        <!--
          We're reusing the apache-release build profile defined in the Apache Parent POM,
          with one exclusion: do not run the source-release-assembly execution goal.
          We have our own scripts to create the source release, which correctly excludes
          binaries from distribution tarball.
          The script can be found under tools/releasing/create_source_release.sh.
        -->
        <profile>
            <id>apache-release</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <dependencies>
                            <dependency>
                                <groupId>org.apache.apache.resources</groupId>
                                <artifactId>apache-source-release-assembly-descriptor</artifactId>
                                <version>1.0.6</version>
                            </dependency>
                        </dependencies>
                        <executions>
                            <execution>
                                <id>source-release-assembly</id>
                                <!-- disable the execution -->
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>docs-and-source</id>
            <activation>
                <property>
                    <name>docs-and-source</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.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>
                        <configuration>
                            <quiet>true</quiet>
                        </configuration>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>spark3</id>
            <modules>
                <module>paimon-spark/paimon-spark3-common</module>
                <module>paimon-spark/paimon-spark-3.5</module>
                <module>paimon-spark/paimon-spark-3.4</module>
                <module>paimon-spark/paimon-spark-3.3</module>
                <module>paimon-spark/paimon-spark-3.2</module>
            </modules>
            <properties>
                <scala.binary.version>2.12</scala.binary.version>
                <scala.version>${scala212.version}</scala.version>
                <paimon-spark-common.spark.version>3.5.6</paimon-spark-common.spark.version>
                <paimon-sparkx-common>paimon-spark3-common</paimon-sparkx-common>
                <!-- todo: support the latest spark in paimon e2e test2 -->
                <test.spark.main.version>3.3</test.spark.main.version>
                <test.spark.version>3.3.0</test.spark.version>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>spark3</name>
                </property>
            </activation>
        </profile>

        <profile>
            <id>spark4</id>
            <modules>
                <module>paimon-spark/paimon-spark4-common</module>
                <module>paimon-spark/paimon-spark-4.0</module>
            </modules>
            <properties>
                <target.java.version>17</target.java.version>
                <antlr4.version>4.13.1</antlr4.version>
                <scala.binary.version>2.13</scala.binary.version>
                <scala.version>${scala213.version}</scala.version>
                <paimon-spark-common.spark.version>4.0.0</paimon-spark-common.spark.version>
                <paimon-sparkx-common>paimon-spark4-common</paimon-sparkx-common>
                <test.spark.main.version>4.0</test.spark.main.version>
                <test.spark.version>4.0.0</test.spark.version>
            </properties>
            <activation>
                <property>
                    <name>spark4</name>
                </property>
            </activation>
        </profile>

        <profile>
            <id>flink1</id>
            <properties>
                <paimon-flinkx-common>paimon-flink1-common</paimon-flinkx-common>
                <paimon-flink-common.flink.version>1.20.1</paimon-flink-common.flink.version>
                <test.flink.main.version>1.20</test.flink.main.version>
                <test.flink.version>1.20.1</test.flink.version>
            </properties>
            <modules>
                <module>paimon-flink/paimon-flink1-common</module>
                <module>paimon-flink/paimon-flink-1.15</module>
                <module>paimon-flink/paimon-flink-1.16</module>
                <module>paimon-flink/paimon-flink-1.17</module>
                <module>paimon-flink/paimon-flink-1.18</module>
                <module>paimon-flink/paimon-flink-1.19</module>
                <module>paimon-flink/paimon-flink-1.20</module>
                <module>paimon-flink/paimon-flink-cdc</module>
            </modules>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>flink1</name>
                </property>
            </activation>
        </profile>

        <profile>
            <id>flink2</id>
            <properties>
                <paimon-flinkx-common>paimon-flink2-common</paimon-flinkx-common>
                <paimon-flink-common.flink.version>2.0.0</paimon-flink-common.flink.version>
                <test.flink.main.version>2.0</test.flink.main.version>
                <test.flink.version>2.0.0</test.flink.version>
            </properties>
            <modules>
                <module>paimon-flink/paimon-flink2-common</module>
                <module>paimon-flink/paimon-flink-2.0</module>
            </modules>
            <activation>
                <property>
                    <name>flink2</name>
                </property>
            </activation>
        </profile>

        <profile>
            <id>paimon-iceberg</id>
            <modules>
                <module>paimon-iceberg</module>
            </modules>
            <activation>
                <jdk>11</jdk>
            </activation>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.4.2</version><!--$NO-MVN-MAN-VER$-->
                <configuration>
                    <archive>
                        <manifestEntries>
                            <SCM-Revision>${git.commit.id}</SCM-Revision>
                        </manifestEntries>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

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

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

            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <version>0.15</version>
                <inherited>false</inherited>
                <executions>
                    <execution>
                        <phase>verify</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
                <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>
                            <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>
                        <!-- Additional files like .gitignore etc.-->
                        <exclude>**/.*/**</exclude>
                        <exclude>**/*.prefs</exclude>
                        <exclude>**/*.log</exclude>
                        <!-- Administrative files in the main trunk. -->
                        <exclude>**/README.md</exclude>
                        <exclude>**/CODE_OF_CONDUCT.md</exclude>
                        <exclude>.github/**</exclude>
                        <!-- IDE files. -->
                        <exclude>**/*.iml</exclude>
                        <exclude>**/.idea/**</exclude>
                        <!-- Generated content -->
                        <exclude>**/target/**</exclude>
                        <exclude>**/scalastyle-output.xml</exclude>
                        <exclude>docs/resources/**</exclude>
                        <exclude>docs/public/**</exclude>
                        <exclude>docs/themes/book/**</exclude>
                        <exclude>docs/assets/github.css</exclude>
                        <exclude>docs/static/js/anchor.min.js</exclude>
                        <exclude>docs/static/js/redoc.standalone.js</exclude>
                        <exclude>**/*.svg</exclude>
                        <exclude>**/dependency-reduced-pom.xml</exclude>
                        <!-- Bundled license files -->
                        <exclude>**/LICENSE*</exclude>
                        <!-- artifacts created during release process -->
                        <exclude>release/**</exclude>
                        <!-- antlr grammar files -->
                        <exclude>paimon-common/src/main/antlr4/**</exclude>
                        <exclude>paimon-core/src/test/resources/compatibility/**</exclude>
                    </excludes>
                </configuration>
            </plugin>

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

            <!--surefire for unit tests and integration tests-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <configuration>
                    <useSystemClassLoader>false</useSystemClassLoader>
                    <forkCount>${flink.forkCount}</forkCount>
                    <reuseForks>${flink.reuseForks}</reuseForks>
                    <trimStackTrace>false</trimStackTrace>
                    <systemPropertyVariables>
                        <forkNumber>0${surefire.forkNumber}</forkNumber>
                        <checkpointing.randomization>false</checkpointing.randomization>
                        <project.basedir>${project.basedir}</project.basedir>
                        <!--suppress MavenModelInspection -->
                        <test.randomization.seed>${test.randomization.seed}</test.randomization.seed>
                        <test.flink.main.version>${test.flink.main.version}</test.flink.main.version>
                        <test.flink.version>${test.flink.version}</test.flink.version>
                        <!-- for junit5 -->
                        <junit.jupiter.extensions.autodetection.enabled>true</junit.jupiter.extensions.autodetection.enabled>
                    </systemPropertyVariables>
                    <argLine>-Xms256m -Xmx2048m -Dmvn.forkNumber=${surefire.forkNumber} -XX:+UseG1GC ${extraJavaTestArgs}</argLine>
                    <!-- By removing all default exclusions the nested classes get executed too -->
                    <excludes>
                        <exclude/>
                    </excludes>
                </configuration>
                <executions>
                    <!--execute all the unit tests-->
                    <execution>
                        <id>default-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>${test.unit.pattern}</include>
                            </includes>
                        </configuration>
                    </execution>
                    <!--execute all the integration tests-->
                    <execution>
                        <id>integration-tests</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>**/*.*</include>
                            </includes>
                            <excludes>
                                <exclude>${test.unit.pattern}</exclude>
                            </excludes>
                            <reuseForks>false</reuseForks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <executions>
                    <execution>
                        <id>enforce-maven</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <!-- enforce at least mvn version 3.1.1 (see FLINK-12447) -->
                                    <version>[3.1.1,)</version>
                                </requireMavenVersion>
                                <requireJavaVersion>
                                    <version>${target.java.version}</version>
                                </requireJavaVersion>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>ban-unsafe-snakeyaml</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <bannedDependencies>
                                    <excludes>
                                        <exclude>org.yaml:snakeyaml:(,1.26]</exclude>
                                    </excludes>
                                    <includes>
                                        <!-- Snakeyaml is pulled in by many modules without using it in production,
                                          so there's no benefit in us investing time into bumping these. -->
                                        <include>org.yaml:snakeyaml:(,1.26]:*:test</include>
                                    </includes>
                                </bannedDependencies>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>ban-unsafe-jackson</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <bannedDependencies>
                                    <excludes>
                                        <exclude>com.fasterxml.jackson*:*:(,2.7.0]</exclude>
                                    </excludes>
                                </bannedDependencies>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>forbid-log4j-1</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <bannedDependencies>
                                    <excludes>
                                        <exclude>log4j:log4j</exclude>
                                        <exclude>org.slf4j:slf4j-log4j12</exclude>
                                    </excludes>
                                </bannedDependencies>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>forbid-direct-table-planner-dependencies</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <bannedDependencies>
                                    <excludes>
                                        <exclude>org.apache.flink:flink-table-planner_${flink.scala.binary.version}</exclude>
                                    </excludes>
                                    <includes>
                                        <include>org.apache.flink:flink-table-planner_${flink.scala.binary.version}:*:*:test</include>
                                    </includes>
                                    <message>
                                        Direct dependencies on flink-table-planner are not allowed.
                                        You should depend on either Table API modules, flink-table-planner-loader or paimon-codegen-loader.
                                    </message>
                                </bannedDependencies>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>dependency-convergence</id>
                        <!-- disabled by default as it interacts badly with shade-plugin -->
                        <phase>none</phase>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <dependencyConvergence/>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <id>shade-paimon</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <shadeTestJar>false</shadeTestJar>
                            <shadedArtifactAttached>false</shadedArtifactAttached>
                            <createDependencyReducedPom>true</createDependencyReducedPom>
                            <!-- Filters MUST be appended; merging filters does not work properly, see MSHADE-305 -->
                            <filters combine.children="append">
                                <!-- Globally exclude log4j.properties from our JAR files. -->
                                <filter>
                                    <artifact>*</artifact>
                                    <excludes>
                                        <exclude>log4j.properties</exclude>
                                        <exclude>log4j2.properties</exclude>
                                        <exclude>log4j-test.properties</exclude>
                                        <exclude>log4j2-test.properties</exclude>
                                        <!-- Do not copy the signatures in the META-INF folder.
								Otherwise, this might cause SecurityExceptions when using the JAR. -->
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                                <!-- drop entries into META-INF and NOTICE files for the dummy artifact -->
                                <filter>
                                    <artifact>org.apache.flink:force-shading</artifact>
                                    <excludes>
                                        <exclude>**</exclude>
                                    </excludes>
                                </filter>
                                <!-- io.netty:netty brings its own LICENSE.txt which we don't need -->
                                <filter>
                                    <artifact>io.netty:netty</artifact>
                                    <excludes>
                                        <exclude>META-INF/LICENSE.txt</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <artifactSet>
                                <includes>
                                    <!-- Unfortunately, the next line is necessary for now to force the execution
                                    of the Shade plugin upon all sub modules. This will generate effective poms,
                                    i.e. poms which do not contain properties which are derived from this root pom.
                                    In particular, the Scala version properties are defined in the root pom and without
                                    shading, the root pom would have to be Scala suffixed and thereby all other modules.
                                    -->
                                    <include>org.apache.flink:force-shading</include>
                                </includes>
                            </artifactSet>
                            <transformers combine.children="append">
                                <!-- The service transformer is needed to merge META-INF/services files -->
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <!-- The ApacheNoticeResourceTransformer collects and aggregates NOTICE files -->
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                                    <projectName>Apache Paimon</projectName>
                                    <inceptionYear>${project.inceptionYear}</inceptionYear>
                                    <encoding>UTF-8</encoding>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${project.basedir}</directory>
                            <includes>
                                <include>dependency-reduced-pom.xml</include>
                            </includes>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>

            <!-- generate configuration docs -->
            <plugin>
                <groupId>org.commonjava.maven.plugins</groupId>
                <artifactId>directory-maven-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution>
                        <id>directories</id>
                        <goals>
                            <goal>directory-of</goal>
                        </goals>
                        <phase>initialize</phase>
                        <configuration>
                            <property>rootDir</property>
                            <project>
                                <groupId>org.apache.paimon</groupId>
                                <artifactId>paimon-parent</artifactId>
                            </project>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.7</version>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>${target.java.version}</source>
                        <target>${target.java.version}</target>
                        <!-- The semantics of this option are reversed, see MCOMPILER-209. -->
                        <useIncrementalCompilation>false</useIncrementalCompilation>
                        <compilerArgs>
                            <!-- Prevents recompilation due to missing package-info.class, see MCOMPILER-205 -->
                            <arg>-Xpkginfo:always</arg>
                            <arg>-Xlint:deprecation</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-checkstyle-plugin</artifactId>
                    <version>2.17</version>
                    <dependencies>
                        <dependency>
                            <groupId>com.puppycrawl.tools</groupId>
                            <artifactId>checkstyle</artifactId>
                            <!-- Note: match version with docs/flinkDev/ide_setup.md -->
                            <version>8.14</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <id>validate</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <suppressionsLocation>/tools/maven/suppressions.xml</suppressionsLocation>
                        <includeTestSourceDirectory>true</includeTestSourceDirectory>
                        <configLocation>/tools/maven/checkstyle.xml</configLocation>
                        <logViolationsToConsole>true</logViolationsToConsole>
                        <failOnViolation>true</failOnViolation>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>com.diffplug.spotless</groupId>
                    <artifactId>spotless-maven-plugin</artifactId>
                    <version>${spotless.version}</version>
                    <configuration>
                        <java>
                            <googleJavaFormat>
                                <version>1.7</version>
                                <style>AOSP</style>
                            </googleJavaFormat>

                            <!-- \# refers to the static imports -->
                            <importOrder>
                                <order>org.apache.paimon,org.apache.paimon.shade,,javax,java,scala,\#</order>
                            </importOrder>

                            <licenseHeader>
                                <!-- replace it with ${project.rootDirectory} after maven 4.0.0, see MNG-7038 -->
                                <file>${maven.multiModuleProjectDirectory}/copyright.txt</file>
                                <delimiter>${spotless.delimiter}</delimiter>
                            </licenseHeader>
                        </java>
                        <scala>
                            <!--  make it works `// spotless:off`  -->
                            <toggleOffOn />

                            <scalafmt>
                                <version>3.4.3</version>
                                <file>${maven.multiModuleProjectDirectory}/.scalafmt.conf</file>
                            </scalafmt>

                            <licenseHeader>
                                <file>${maven.multiModuleProjectDirectory}/copyright.txt</file>
                                <delimiter>${spotless.delimiter}</delimiter>
                            </licenseHeader>
                        </scala>
                    </configuration>
                    <executions>
                        <execution>
                            <id>spotless-check</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>


                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>3.1.1</version><!--$NO-MVN-MAN-VER$-->
                    <configuration>
                        <quiet>true</quiet>
                        <detectOfflineLinks>false</detectOfflineLinks>
                        <additionalJOptions combine.children="append">
                            <additionalJOption>-Xdoclint:none</additionalJOption>
                        </additionalJOptions>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-enforcer-plugin</artifactId>
                    <version>3.0.0-M1</version>
                </plugin>

                <!-- Pin the version of the maven shade plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.5.3</version>
                </plugin>

                <!-- configure scala style -->
                <plugin>
                    <groupId>org.scalastyle</groupId>
                    <artifactId>scalastyle-maven-plugin</artifactId>
                    <version>1.0.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>check</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <verbose>false</verbose>
                        <failOnViolation>true</failOnViolation>
                        <includeTestSourceDirectory>true</includeTestSourceDirectory>
                        <failOnWarning>false</failOnWarning>
                        <sourceDirectory>${basedir}/src/main/scala</sourceDirectory>
                        <testSourceDirectory>${basedir}/src/test/scala</testSourceDirectory>
                        <outputFile>${project.basedir}/target/scalastyle-output.xml</outputFile>
                        <inputEncoding>UTF-8</inputEncoding>
                        <outputEncoding>UTF-8</outputEncoding>
                    </configuration>
                </plugin>

                <plugin>
                    <!-- Inherited from Apache parent, but not actually used. Disable to reduce noise. -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-site-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>attach-descriptor</id>
                            <phase>none</phase>
                        </execution>
                    </executions>
                </plugin>

                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>3.1.0</version>
                    <inherited>false</inherited>
                    <executions>
                        <execution>
                            <id>check-license</id>
                            <!-- manually called -->
                            <phase>none</phase>
                            <goals>
                                <goal>java</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <mainClass>org.apache.paimon.tools.ci.licensecheck.LicenseChecker</mainClass>
                        <includePluginDependencies>true</includePluginDependencies>
                        <includeProjectDependencies>false</includeProjectDependencies>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.apache.paimon</groupId>
                            <artifactId>paimon-ci-tools</artifactId>
                            <version>${project.version}</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <!--
    Uncomment the following "repositories" tag if your maven fails to download paimon-shade snapshot files.
    We comment these tags by default because downloading from apache repositories is very slow for both github and developers.
    -->

    <!--
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>apache-releases</id>
            <name>apache releases</name>
            <url>https://repository.apache.org/content/repositories/releases/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>apache-snapshots</id>
            <name>apache snapshots</name>
            <url>https://repository.apache.org/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
    -->
</project>
