<?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>
  <packaging>pom</packaging>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>23</version>
  </parent>

  <groupId>org.apache.pulsar</groupId>
  <artifactId>pulsar</artifactId>

  <version>2.11.0-SNAPSHOT</version>

  <name>Pulsar</name>
  <description>Pulsar is a distributed pub-sub messaging platform with a very
flexible messaging model and an intuitive client API.</description>
  <url>https://github.com/apache/pulsar</url>

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

  <developers>
    <developer>
      <organization>Apache Pulsar developers</organization>
      <organizationUrl>https://pulsar.apache.org/</organizationUrl>
    </developer>
  </developers>

  <licenses>
    <license>
      <name>Apache 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/pulsar</url>
    <connection>scm:git:https://github.com/apache/pulsar.git</connection>
    <developerConnection>scm:git:ssh://git@github.com:apache/pulsar.git</developerConnection>
  </scm>

  <ciManagement>
    <system>GitHub Actions</system>
    <url>https://github.com/apache/pulsar/actions</url>
  </ciManagement>

  <issueManagement>
    <system>Github</system>
    <url>https://github.com/apache/pulsar/issues</url>
  </issueManagement>

  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <pulsar.broker.compiler.release>${maven.compiler.target}</pulsar.broker.compiler.release>
    <pulsar.client.compiler.release>8</pulsar.client.compiler.release>

    <pulsar.client.python.version>2.10.1</pulsar.client.python.version>

    <!--config keys to configure test selection -->
    <include>**/Test*.java,**/*Test.java,**/*Tests.java,**/*TestCase.java</include>
    <exclude/>
    <groups/>
    <excludedGroups>quarantine</excludedGroups>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <redirectTestOutputToFile>true</redirectTestOutputToFile>
    <!-- required for running tests on JDK11+ -->
    <test.additional.args>
      --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
      --add-opens java.base/java.lang=ALL-UNNAMED <!--Mockito-->
      --add-opens java.base/java.io=ALL-UNNAMED <!--Bookkeeper NativeIO-->
      --add-opens java.base/java.util=ALL-UNNAMED <!--System Lambda-->
      --add-opens java.base/sun.net=ALL-UNNAMED <!--netty.DnsResolverUtil-->
      --add-opens java.management/sun.management=ALL-UNNAMED <!--JvmDefaultGCMetricsLogger & MBeanStatsGenerator-->
      --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED <!--MBeanStatsGenerator-->
    </test.additional.args>
    <testReuseFork>true</testReuseFork>
    <testForkCount>4</testForkCount>
    <testRealAWS>false</testRealAWS>
    <testRetryCount>1</testRetryCount>
    <testJacocoAgentArgument/>
    <testHeapDumpPath>/tmp</testHeapDumpPath>
    <docker.organization>apachepulsar</docker.organization>
    <skipSourceReleaseAssembly>false</skipSourceReleaseAssembly>
    <skipBuildDistribution>false</skipBuildDistribution>
    <shadePluginPhase>package</shadePluginPhase>
    <narPluginPhase>package</narPluginPhase>

    <!-- apache commons -->
    <commons-compress.version>1.21</commons-compress.version>

    <bookkeeper.version>4.15.3</bookkeeper.version>
    <zookeeper.version>3.8.0</zookeeper.version>
    <commons-cli.version>1.5.0</commons-cli.version>
    <commons-text.version>1.10.0</commons-text.version>
    <snappy.version>1.1.8.4</snappy.version> <!-- ZooKeeper server -->
    <dropwizardmetrics.version>4.1.12.1</dropwizardmetrics.version> <!-- ZooKeeper server -->
    <curator.version>5.1.0</curator.version>
    <netty.version>4.1.77.Final</netty.version>
    <netty-iouring.version>0.0.15.Final</netty-iouring.version>
    <jetty.version>9.4.48.v20220622</jetty.version>
    <conscrypt.version>2.5.2</conscrypt.version>
    <jersey.version>2.34</jersey.version>
    <athenz.version>1.10.50</athenz.version>
    <prometheus.version>0.16.0</prometheus.version>
    <vertx.version>3.9.8</vertx.version>
    <rocksdb.version>6.29.4.1</rocksdb.version>
    <slf4j.version>1.7.32</slf4j.version>
    <commons.collections4.version>4.4</commons.collections4.version>
    <log4j2.version>2.18.0</log4j2.version>
    <bouncycastle.version>1.69</bouncycastle.version>
    <bouncycastle.bcpkix-fips.version>1.0.6</bouncycastle.bcpkix-fips.version>
    <bouncycastle.bc-fips.version>1.0.2.3</bouncycastle.bc-fips.version>
    <jackson.version>2.13.4.20221013</jackson.version>
    <reflections.version>0.9.11</reflections.version>
    <swagger.version>1.6.2</swagger.version>
    <puppycrawl.checkstyle.version>8.37</puppycrawl.checkstyle.version>
    <docker-maven.version>0.40.2</docker-maven.version>
    <docker.verbose>true</docker.verbose>
    <typetools.version>0.5.0</typetools.version>
    <protobuf3.version>3.19.6</protobuf3.version>
    <protoc3.version>${protobuf3.version}</protoc3.version>
    <grpc.version>1.45.1</grpc.version>
    <google-http-client.version>1.41.0</google-http-client.version>
    <perfmark.version>0.19.0</perfmark.version>
    <protoc-gen-grpc-java.version>${grpc.version}</protoc-gen-grpc-java.version>
    <gson.version>2.8.9</gson.version>
    <system-lambda.version>1.2.1</system-lambda.version>
    <sketches.version>0.8.3</sketches.version>
    <hbc-core.version>2.2.0</hbc-core.version>
    <cassandra.version>3.11.2</cassandra.version>
    <aerospike-client.version>4.4.20</aerospike-client.version>
    <kafka-client.version>2.7.2</kafka-client.version>
    <rabbitmq-client.version>5.5.3</rabbitmq-client.version>
    <aws-sdk.version>1.12.262</aws-sdk.version>
    <avro.version>1.10.2</avro.version>
    <joda.version>2.10.10</joda.version>
    <jclouds.version>2.5.0</jclouds.version>
    <guice.version>5.1.0</guice.version>
    <sqlite-jdbc.version>3.36.0.3</sqlite-jdbc.version>
    <mysql-jdbc.version>8.0.11</mysql-jdbc.version>
    <postgresql-jdbc.version>42.4.1</postgresql-jdbc.version>
    <clickhouse-jdbc.version>0.3.2</clickhouse-jdbc.version>
    <mariadb-jdbc.version>2.7.5</mariadb-jdbc.version>
    <openmldb-jdbc.version>0.4.4-hotfix1</openmldb-jdbc.version>
    <hdfs-offload-version3>3.3.3</hdfs-offload-version3>
    <json-smart.version>2.4.7</json-smart.version>
    <opensearch.version>1.2.4</opensearch.version>
    <elasticsearch-java.version>8.5.2</elasticsearch-java.version>
    <trino.version>363</trino.version>
    <scala.binary.version>2.13</scala.binary.version>
    <debezium.version>1.9.7.Final</debezium.version>
    <debezium.postgresql.version>42.5.0</debezium.postgresql.version>
    <debezium.mysql.version>8.0.30</debezium.mysql.version>
    <jsonwebtoken.version>0.11.1</jsonwebtoken.version>
    <opencensus.version>0.28.0</opencensus.version>
    <hbase.version>2.4.9</hbase.version>
    <guava.version>31.0.1-jre</guava.version>
    <jcip.version>1.0</jcip.version>
    <prometheus-jmx.version>0.16.1</prometheus-jmx.version>
    <confluent.version>7.0.1</confluent.version>
    <kafka.confluent.schemaregistryclient.version>5.3.0</kafka.confluent.schemaregistryclient.version>
    <kafka.confluent.avroserializer.version>5.3.0</kafka.confluent.avroserializer.version>
    <aircompressor.version>0.20</aircompressor.version>
    <asynchttpclient.version>2.12.1</asynchttpclient.version>
    <jcommander.version>1.82</jcommander.version>
    <commons-lang3.version>3.11</commons-lang3.version>
    <commons-configuration.version>1.10</commons-configuration.version>
    <commons-io.version>2.8.0</commons-io.version>
    <commons-codec.version>1.15</commons-codec.version>
    <javax.ws.rs-api.version>2.1</javax.ws.rs-api.version>
    <hdrHistogram.version>2.1.9</hdrHistogram.version>
    <javax.servlet-api>3.1.0</javax.servlet-api>
    <caffeine.version>3.1.2</caffeine.version>
    <java-semver.version>0.9.0</java-semver.version>
    <jline.version>2.14.6</jline.version>
    <jline3.version>3.21.0</jline3.version>
    <hppc.version>0.9.1</hppc.version>
    <spark-streaming_2.10.version>2.1.0</spark-streaming_2.10.version>
    <assertj-core.version>3.18.1</assertj-core.version>
    <lombok.version>1.18.24</lombok.version>
    <javax.annotation-api.version>1.3.2</javax.annotation-api.version>
    <jaxb-api>2.3.1</jaxb-api>
    <javax.activation.version>1.2.0</javax.activation.version>
    <jakarta.activation.version>1.2.2</jakarta.activation.version>
    <jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
    <jakarta.validation.version>2.0.2</jakarta.validation.version>
    <jna.version>5.12.1</jna.version>
    <kubernetesclient.version>12.0.1</kubernetesclient.version>
    <okhttp3.version>4.9.3</okhttp3.version>
    <!-- use okio version that matches the okhttp3 version -->
    <okio.version>2.8.0</okio.version>
    <!-- override kotlin-stdlib used by okio in order to address CVE-2020-29582 -->
    <kotlin-stdlib.version>1.4.32</kotlin-stdlib.version>
    <nsq-client.version>1.0</nsq-client.version>
    <cron-utils.version>9.1.6</cron-utils.version>
    <spring.version>5.3.20</spring.version>
    <apache-http-client.version>4.5.13</apache-http-client.version>
    <apache-httpcomponents.version>4.4.15</apache-httpcomponents.version>
    <jetcd.version>0.5.11</jetcd.version>
    <snakeyaml.version>1.32</snakeyaml.version>
    <ant.version>1.10.12</ant.version>
    <seancfoley.ipaddress.version>5.3.3</seancfoley.ipaddress.version>
    <disruptor.version>3.4.3</disruptor.version>
    <zstd-jni.version>1.5.2-3</zstd-jni.version>
    <netty-reactive-streams.version>2.0.6</netty-reactive-streams.version>

    <!-- test dependencies -->
    <testcontainers.version>1.17.6</testcontainers.version>
    <hamcrest.version>2.2</hamcrest.version>

    <!-- Set docker-java.version to the version of docker-java used in Testcontainers -->
    <docker-java.version>3.2.13</docker-java.version>
    <kerby.version>1.1.1</kerby.version>
    <testng.version>7.6.1</testng.version>
    <mockito.version>3.12.4</mockito.version>
    <javassist.version>3.25.0-GA</javassist.version>
    <skyscreamer.version>1.5.0</skyscreamer.version>
    <objenesis.version>3.1</objenesis.version>
    <awaitility.version>4.2.0</awaitility.version>
    <reload4j.version>1.2.22</reload4j.version>
    <jettison.version>1.5.1</jettison.version>
    <wiremock.version>2.33.2</wiremock.version>

    <!-- Plugin dependencies -->
    <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
    <exec-maven-plugin.version>3.0.0</exec-maven-plugin.version>
    <license-maven-plugin.version>4.1</license-maven-plugin.version>
    <directory-maven-plugin.version>1.0</directory-maven-plugin.version>
    <maven-enforcer-plugin.version>3.1.0</maven-enforcer-plugin.version>
    <!-- surefire.version is defined in apache parent pom -->
    <!-- it is used for surefire, failsafe and surefire-report plugins -->
    <!-- do not upgrade surefire.version to 3.0.0-M5 since it runs slowly and breaks tests. -->
    <surefire.version>3.0.0-M3</surefire.version>
    <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
    <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
    <maven-dependency-plugin.version>3.3.0</maven-dependency-plugin.version>
    <maven-modernizer-plugin.version>2.3.0</maven-modernizer-plugin.version>
    <maven-shade-plugin>3.4.0</maven-shade-plugin>
    <maven-antrun-plugin.version>3.0.0</maven-antrun-plugin.version>
    <properties-maven-plugin.version>1.0.0</properties-maven-plugin.version>
    <nifi-nar-maven-plugin.version>1.2.0</nifi-nar-maven-plugin.version>
    <maven-checkstyle-plugin.version>3.1.2</maven-checkstyle-plugin.version>
    <git-commit-id-plugin.version>4.0.2</git-commit-id-plugin.version>
    <wagon-ssh-external.version>3.4.3</wagon-ssh-external.version>
    <os-maven-plugin.version>1.7.0</os-maven-plugin.version>
    <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
    <spotbugs-maven-plugin.version>4.2.2</spotbugs-maven-plugin.version>
    <spotbugs.version>4.2.2</spotbugs.version>
    <errorprone.version>2.5.1</errorprone.version>
    <errorprone.javac.version>9+181-r4173-1</errorprone.javac.version>
    <errorprone-slf4j.version>0.1.4</errorprone-slf4j.version>
    <j2objc-annotations.version>1.3</j2objc-annotations.version>
    <lightproto-maven-plugin.version>0.4</lightproto-maven-plugin.version>
    <dependency-check-maven.version>7.1.0</dependency-check-maven.version>
    <roaringbitmap.version>0.9.15</roaringbitmap.version>
    <extra-enforcer-rules.version>1.6.1</extra-enforcer-rules.version>
    <lombok.plugin.version>1.18.20.0</lombok.plugin.version>

    <!-- Used to configure rename.netty.native. Libs -->
    <rename.netty.native.libs>rename-netty-native-libs.sh</rename.netty.native.libs>
  </properties>

  <dependencyManagement>
    <dependencies>

      <dependency>
        <groupId>org.jline</groupId>
        <artifactId>jline</artifactId>
        <version>${jline3.version}</version>
      </dependency>

      <dependency>
        <groupId>org.asynchttpclient</groupId>
        <artifactId>async-http-client</artifactId>
        <version>${asynchttpclient.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.typesafe.netty</groupId>
            <artifactId>netty-reactive-streams</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${testng.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.yaml</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest</artifactId>
        <version>${hamcrest.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.awaitility</groupId>
        <artifactId>awaitility</artifactId>
        <version>${awaitility.version}</version>
        <scope>test</scope>
      </dependency>

      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>${mockito.version}</version>
      </dependency>

      <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-inline</artifactId>
        <version>${mockito.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>${zookeeper.version}</version>
        <exclusions>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
          </exclusion>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-tcnative</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper-jute</artifactId>
        <version>${zookeeper.version}</version>
      </dependency>
      <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>${commons-cli.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${dropwizardmetrics.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-graphite</artifactId>
        <version>${dropwizardmetrics.version}</version>
      </dependency>
      <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-jvm</artifactId>
        <version>${dropwizardmetrics.version}</version>
      </dependency>
      <dependency>
        <groupId>org.xerial.snappy</groupId>
        <artifactId>snappy-java</artifactId>
        <version>${snappy.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <classifier>tests</classifier>
        <version>${zookeeper.version}</version>
        <exclusions>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
          </exclusion>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-tcnative</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>bookkeeper-server</artifactId>
        <version>${bookkeeper.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>*</artifactId>
          </exclusion>
          <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
          </exclusion>
          <exclusion>
            <artifactId>log4j</artifactId>
            <groupId>log4j</groupId>
          </exclusion>
          <exclusion>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
          </exclusion>
          <!-- exclude all netty dependencies, use whatever pulsar is using -->
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-*</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>cpu-affinity</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-core</artifactId>
        <version>${vertx.version}</version>
      </dependency>
      <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-web</artifactId>
        <version>${vertx.version}</version>
      </dependency>

      <dependency>
         <groupId>org.apache.curator</groupId>
         <artifactId>curator-recipes</artifactId>
         <version>${curator.version}</version>
         <exclusions>
             <exclusion>
                 <groupId>org.apache.zookeeper</groupId>
                 <artifactId>*</artifactId>
             </exclusion>
         </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>bookkeeper-common-allocator</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>bookkeeper-tools-framework</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <!-- reflection libs -->
      <dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>${reflections.version}</version>
      </dependency>

      <!-- exclude the grpc version from bookkeeper and use the one defined here -->
      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>stream-storage-java-client</artifactId>
        <version>${bookkeeper.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-testing</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okhttp</groupId>
            <artifactId>okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <!-- exclude the grpc version from bookkeeper and use the one defined here -->
      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>stream-storage-server</artifactId>
        <version>${bookkeeper.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okhttp</groupId>
            <artifactId>okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.inferred</groupId>
            <artifactId>freebuilder</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper</groupId>
        <artifactId>bookkeeper-common</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper.stats</groupId>
        <artifactId>bookkeeper-stats-api</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper.stats</groupId>
        <artifactId>datasketches-metrics-provider</artifactId>
        <version>${bookkeeper.version}</version>
        <exclusions>
          <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.bookkeeper.stats</groupId>
        <artifactId>prometheus-metrics-provider</artifactId>
        <version>${bookkeeper.version}</version>
      </dependency>

      <dependency>
        <groupId>org.rocksdb</groupId>
        <artifactId>rocksdbjni</artifactId>
        <version>${rocksdb.version}</version>
      </dependency>

      <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>${jetty.version}</version>
      </dependency>

      <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-alpn-conscrypt-server</artifactId>
        <version>${jetty.version}</version>
      </dependency>

      <dependency>
        <groupId>org.conscrypt</groupId>
        <artifactId>conscrypt-openjdk-uber</artifactId>
        <version>${conscrypt.version}</version>
      </dependency>

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

      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-bom</artifactId>
        <version>${netty.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>io.netty.incubator</groupId>
        <artifactId>netty-incubator-transport-classes-io_uring</artifactId>
        <version>${netty-iouring.version}</version>
      </dependency>
      <dependency>
        <groupId>io.netty.incubator</groupId>
        <artifactId>netty-incubator-transport-native-io_uring</artifactId>
        <version>${netty-iouring.version}</version>
      </dependency>
      <dependency>
        <groupId>io.netty.incubator</groupId>
        <artifactId>netty-incubator-transport-native-io_uring</artifactId>
        <version>${netty-iouring.version}</version>
        <classifier>linux-x86_64</classifier>
      </dependency>
      <dependency>
        <groupId>io.netty.incubator</groupId>
        <artifactId>netty-incubator-transport-native-io_uring</artifactId>
        <version>${netty-iouring.version}</version>
        <classifier>linux-aarch_64</classifier>
      </dependency>

      <dependency>
        <groupId>com.beust</groupId>
        <artifactId>jcommander</artifactId>
        <version>${jcommander.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>${guice.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.inject.extensions</groupId>
        <artifactId>guice-assistedinject</artifactId>
        <version>${guice.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>${commons-compress.version}</version>
      </dependency>

      <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>${commons-configuration.version}</version>
      </dependency>

      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons-io.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-text</artifactId>
        <version>${commons-text.version}</version>
      </dependency>

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

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

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

      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-bom</artifactId>
        <version>${log4j2.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons-codec.version}</version>
      </dependency>

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

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

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

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

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

      <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>${javax.ws.rs-api.version}</version>
      </dependency>

      <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
        <exclusions>
          <exclusion>
            <groupId>jakarta.activation</groupId>
            <artifactId>jakarta.activation-api</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

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

      <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>${jna.version}</version>
      </dependency>

      <dependency>
         <groupId>com.github.docker-java</groupId>
         <artifactId>docker-java-core</artifactId>
         <version>${docker-java.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.docker-java</groupId>
        <artifactId>docker-java-api</artifactId>
        <version>${docker-java.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.docker-java</groupId>
        <artifactId>docker-java-transport-zerodep</artifactId>
        <version>${docker-java.version}</version>
      </dependency>

      <dependency>
        <groupId>com.fasterxml.jackson</groupId>
        <artifactId>jackson-bom</artifactId>
        <version>${jackson.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>${jettison.version}</version>
      </dependency>


      <dependency>
        <groupId>org.hdrhistogram</groupId>
        <artifactId>HdrHistogram</artifactId>
        <version>${hdrHistogram.version}</version>
      </dependency>

      <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-core</artifactId>
        <version>${swagger.version}</version>
      </dependency>

      <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>${swagger.version}</version>
      </dependency>

      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${javax.servlet-api}</version>
      </dependency>

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

      <dependency>
        <groupId>com.yahoo.athenz</groupId>
        <artifactId>athenz-zts-java-client-core</artifactId>
        <version>${athenz.version}</version>
      </dependency>

      <dependency>
        <groupId>com.yahoo.athenz</groupId>
        <artifactId>athenz-zpe-java-client</artifactId>
        <version>${athenz.version}</version>
      </dependency>

      <dependency>
        <groupId>com.github.zafarkhaja</groupId>
        <artifactId>java-semver</artifactId>
        <version>${java-semver.version}</version>
      </dependency>

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

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_hotspot</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_log4j2</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_servlet</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_jetty</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_caffeine</artifactId>
        <version>${prometheus.version}</version>
      </dependency>

      <dependency>
        <groupId>com.carrotsearch</groupId>
        <artifactId>hppc</artifactId>
        <version>${hppc.version}</version>
      </dependency>

      <dependency>
        <groupId>io.etcd</groupId>
        <artifactId>jetcd-core</artifactId>
        <version>${jetcd.version}</version>
      </dependency>

      <dependency>
        <groupId>io.etcd</groupId>
        <artifactId>jetcd-test</artifactId>
        <version>${jetcd.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.10</artifactId>
        <version>${spark-streaming_2.10.version}</version>
        <exclusions>
          <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-codec-http</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-transport-native-epoll</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>${jsonwebtoken.version}</version>
      </dependency>
      <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>${jsonwebtoken.version}</version>
      </dependency>
      <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>${jsonwebtoken.version}</version>
      </dependency>

      <dependency>
        <groupId>net.jodah</groupId>
        <artifactId>typetools</artifactId>
        <version>${typetools.version}</version>
      </dependency>

      <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-bom</artifactId>
        <version>${grpc.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
        <version>${grpc.version}</version>
        <exclusions>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-testing</artifactId>
          </exclusion>
          <exclusion>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okhttp</groupId>
            <artifactId>okhttp</artifactId>
          </exclusion>
          <exclusion>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client</artifactId>
        <version>${google-http-client.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client-jackson2</artifactId>
        <version>${google-http-client.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client-gson</artifactId>
        <version>${google-http-client.version}</version>
      </dependency>

      <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>${perfmark.version}</version>
        <scope>runtime</scope>
        <exclusions>
          <exclusion>
            <artifactId>error_prone_annotations</artifactId>
            <groupId>com.google.errorprone</groupId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-bom</artifactId>
        <version>${protobuf3.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${gson.version}</version>
      </dependency>

      <dependency>
        <groupId>com.yahoo.datasketches</groupId>
        <artifactId>sketches-core</artifactId>
        <version>${sketches.version}</version>
      </dependency>

      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-bom</artifactId>
        <version>${aws-sdk.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>org.apache.distributedlog</groupId>
        <artifactId>distributedlog-core</artifactId>
        <version>${bookkeeper.version}</version>
        <exclusions>
          <!-- exclude bookkeeper, reply on the bookkeeper version that pulsar uses -->
          <exclusion>
            <groupId>org.apache.bookkeeper</groupId>
            <artifactId>bookkeeper-server</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>${commons.collections4.version}</version>
      </dependency>

      <!-- test dependencies -->
      <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>${disruptor.version}</version>
      </dependency>
      <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>testcontainers-bom</artifactId>
        <version>${testcontainers.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>${cassandra.version}</version>
      </dependency>
      <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>${assertj-core.version}</version>
      </dependency>

      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </dependency>

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

      <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>${jaxb-api}</version>
      </dependency>

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

      <dependency>
        <groupId>com.sun.activation</groupId>
        <artifactId>javax.activation</artifactId>
        <version>${javax.activation.version}</version>
      </dependency>

      <dependency>
        <groupId>com.sun.activation</groupId>
        <artifactId>jakarta.activation</artifactId>
        <version>${jakarta.activation.version}</version>
      </dependency>

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

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

      <dependency>
        <groupId>io.opencensus</groupId>
        <artifactId>opencensus-api</artifactId>
        <version>${opencensus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.opencensus</groupId>
        <artifactId>opencensus-contrib-http-util</artifactId>
        <version>${opencensus.version}</version>
      </dependency>

      <dependency>
        <groupId>io.opencensus</groupId>
        <artifactId>opencensus-contrib-grpc-metrics</artifactId>
        <version>${opencensus.version}</version>
      </dependency>

      <dependency>
        <groupId>org.opensearch.client</groupId>
        <artifactId>opensearch-rest-high-level-client</artifactId>
        <version>${opensearch.version}</version>
      </dependency>

      <dependency>
        <groupId>co.elastic.clients</groupId>
        <artifactId>elasticsearch-java</artifactId>
        <version>${elasticsearch-java.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>${javassist.version}</version>
      </dependency>

      <dependency>
        <groupId>net.jcip</groupId>
        <artifactId>jcip-annotations</artifactId>
        <version>${jcip.version}</version>
      </dependency>

      <dependency>
        <groupId>io.airlift</groupId>
        <artifactId>aircompressor</artifactId>
        <version>${aircompressor.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.objenesis</groupId>
        <artifactId>objenesis</artifactId>
        <version>${objenesis.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${apache-http-client.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>${apache-httpcomponents.version}</version>
      </dependency>

      <dependency>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-annotations</artifactId>
        <version>${spotbugs.version}</version>
        <scope>provided</scope>
        <optional>true</optional>
      </dependency>

      <dependency>
        <groupId>com.google.errorprone</groupId>
        <artifactId>error_prone_annotations</artifactId>
        <version>${errorprone.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.j2objc</groupId>
        <artifactId>j2objc-annotations</artifactId>
        <version>${j2objc-annotations.version}</version>
      </dependency>

      <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>${snakeyaml.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.ant</groupId>
        <artifactId>ant</artifactId>
        <version>${ant.version}</version>
      </dependency>

      <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>${okhttp3.version}</version>
      </dependency>
      <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp-urlconnection</artifactId>
        <version>${okhttp3.version}</version>
      </dependency>
      <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>logging-interceptor</artifactId>
        <version>${okhttp3.version}</version>
      </dependency>
      <dependency>
        <groupId>com.squareup.okio</groupId>
        <artifactId>okio</artifactId>
        <version>${okio.version}</version>
      </dependency>

      <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${kotlin-stdlib.version}</version>
      </dependency>
      <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-common</artifactId>
        <version>${kotlin-stdlib.version}</version>
      </dependency>

      <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>${kotlin-stdlib.version}</version>
      </dependency>

      <dependency>
        <groupId>com.github.luben</groupId>
        <artifactId>zstd-jni</artifactId>
        <version>${zstd-jni.version}</version>
      </dependency>

      <dependency>
          <groupId>com.typesafe.netty</groupId>
          <artifactId>netty-reactive-streams</artifactId>
          <version>${netty-reactive-streams.version}</version>
      </dependency>

      <dependency>
        <groupId>ch.qos.reload4j</groupId>
        <artifactId>reload4j</artifactId>
        <version>${reload4j.version}</version>
      </dependency>

      <dependency>
        <groupId>org.roaringbitmap</groupId>
        <artifactId>RoaringBitmap</artifactId>
        <version>${roaringbitmap.version}</version>
      </dependency>

    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- These dependencies are common to all the submodules -->
    <dependency>
      <groupId>org.apache.pulsar</groupId>
      <artifactId>buildtools</artifactId>
      <version>${project.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-inline</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.github.stefanbirkner</groupId>
      <artifactId>system-lambda</artifactId>
      <version>${system-lambda.version}</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <!-- We use MockedBookKeeper in many unit tests -->
      <groupId>org.apache.bookkeeper</groupId>
      <artifactId>bookkeeper-server</artifactId>
      <version>${bookkeeper.version}</version>
      <scope>test</scope>
      <classifier>tests</classifier>
      <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
          <artifactId>log4j</artifactId>
          <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

  <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <encoding>UTF-8</encoding>
          <showDeprecation>true</showDeprecation>
          <showWarnings>true</showWarnings>
          <optimize>true</optimize>
          <!-- workaround https://issues.apache.org/jira/browse/MCOMPILER-205 -->
          <useIncrementalCompilation>false</useIncrementalCompilation>
          <annotationProcessorPaths>
            <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>${lombok.version}</version>
            </path>
          </annotationProcessorPaths>
          <compilerArgs>
            <arg>-parameters</arg>
            <!-- enable 'all' lint warnings with some exclusions -->
            <arg>-Xlint:all</arg>
            <arg>-Xlint:-options</arg>
            <arg>-Xlint:-serial</arg>
            <arg>-Xlint:-classfile</arg>
            <arg>-Xlint:-processing</arg>
            <arg>-Xpkginfo:always</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <argLine>${testJacocoAgentArgument} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${testHeapDumpPath} -XX:+ExitOnOutOfMemoryError -Xmx1G -XX:+UseZGC
            -Dpulsar.allocator.pooled=true
            -Dpulsar.allocator.leak_detection=Advanced
            -Dpulsar.allocator.exit_on_oom=false
            -Dpulsar.allocator.out_of_memory_policy=FallbackToHeap
            -Dio.netty.tryReflectionSetAccessible=true
            ${test.additional.args}
          </argLine>
          <reuseForks>${testReuseFork}</reuseForks>
          <forkCount>${testForkCount}</forkCount>
          <shutdown>kill</shutdown>
          <redirectTestOutputToFile>${redirectTestOutputToFile}</redirectTestOutputToFile>
          <trimStackTrace>false</trimStackTrace>
          <systemPropertyVariables>
            <testRealAWS>${testRealAWS}</testRealAWS>
            <testRetryCount>${testRetryCount}</testRetryCount>
          </systemPropertyVariables>
          <properties>
            <property>
              <name>listener</name>
              <value>org.apache.pulsar.tests.PulsarTestListener,org.apache.pulsar.tests.AnnotationListener,org.apache.pulsar.tests.FailFastNotifier,org.apache.pulsar.tests.MockitoCleanupListener,org.apache.pulsar.tests.FastThreadLocalCleanupListener,org.apache.pulsar.tests.ThreadLeakDetectorListener</value>
            </property>
          </properties>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.commonjava.maven.plugins</groupId>
        <artifactId>directory-maven-plugin</artifactId>
        <version>${directory-maven-plugin.version}</version>
        <executions>
          <execution>
            <id>directories</id>
            <goals>
              <goal>directory-of</goal>
            </goals>
            <phase>initialize</phase>
            <configuration>
              <property>pulsar.basedir</property>
              <project>
                <groupId>org.apache.pulsar</groupId>
                <artifactId>pulsar</artifactId>
              </project>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>com.mycila</groupId>
        <artifactId>license-maven-plugin</artifactId>
        <version>${license-maven-plugin.version}</version>
        <configuration>
          <licenseSets>
            <licenseSet>
              <header>${pulsar.basedir}/src/license-header.txt</header>
              <excludes>
                <exclude>LICENSE</exclude>
                <exclude>NOTICE</exclude>
                <exclude>**/*.txt</exclude>
                <exclude>**/*.pem</exclude>
                <exclude>**/*.crt</exclude>
                <exclude>**/*.key</exclude>
                <exclude>**/*.csr</exclude>
                <exclude>**/*.log</exclude>
                <exclude>**/*.patch</exclude>
                <exclude>**/*.avsc</exclude>
                <exclude>**/*.versionsBackup</exclude>
                <exclude>**/*.pyc</exclude>
                <exclude>**/*.graffle</exclude>
                <exclude>**/*.hgrm</exclude>
                <exclude>**/src/main/java/org/apache/bookkeeper/mledger/proto/MLDataFormats.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/transaction/coordinator/proto/PulsarTransactionMetadata.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/broker/service/schema/proto/SchemaRegistryFormat.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/common/api/proto/*.java</exclude>
                <exclude>**/src/test/java/org/apache/pulsar/common/api/proto/*.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/io/kinesis/fbs/CompressionType.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/io/kinesis/fbs/EncryptionCtx.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/io/kinesis/fbs/EncryptionKey.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/io/kinesis/fbs/KeyValue.java</exclude>
                <exclude>**/src/main/java/org/apache/pulsar/io/kinesis/fbs/Message.java</exclude>
                <exclude>**/src/main/java/org/apache/bookkeeper/mledger/util/AbstractCASReferenceCounted.java</exclude>
                <exclude>**/ByteBufCodedInputStream.java</exclude>
                <exclude>**/ByteBufCodedOutputStream.java</exclude>
                <exclude>**/ahc.properties</exclude>
                <exclude>bin/proto/*</exclude>
                <exclude>conf/schema_example.conf</exclude>
                <exclude>data/**</exclude>
                <exclude>logs/**</exclude>
                <exclude>**/circe/**</exclude>
                <exclude>pulsar-broker/src/test/resources/authentication/basic/.htpasswd</exclude>
                <exclude>**/django/stats/migrations/*.py</exclude>
                <exclude>site2/**</exclude>
                <exclude>generated-site/**</exclude>
                <exclude>**/*.md</exclude>
                <exclude>**/.idea/**</exclude>
                <exclude>**/.mvn/**</exclude>
                <exclude>**/generated/**</exclude>
                <exclude>**/zk-3.5-test-data/*</exclude>
              </excludes>
            </licenseSet>
          </licenseSets>
          <mapping>
            <java>SLASHSTAR_STYLE</java>
            <proto>JAVADOC_STYLE</proto>
            <go>DOUBLESLASH_STYLE</go>
            <conf>SCRIPT_STYLE</conf>
            <ini>SCRIPT_STYLE</ini>
            <yaml>SCRIPT_STYLE</yaml>
            <tf>SCRIPT_STYLE</tf>
            <cfg>SCRIPT_STYLE</cfg>
            <Makefile>SCRIPT_STYLE</Makefile>
            <service>SCRIPT_STYLE</service>
            <cc>JAVADOC_STYLE</cc>
            <md>XML_STYLE</md>
            <txt>SCRIPT_STYLE</txt>
            <scss>JAVADOC_STYLE</scss>
            <Doxyfile>SCRIPT_STYLE</Doxyfile>
            <pulsar>SCRIPT_STYLE</pulsar>
            <pulsar-managed-ledger-admin>SCRIPT_STYLE</pulsar-managed-ledger-admin>
            <pulsar-daemon>SCRIPT_STYLE</pulsar-daemon>
            <pulsar-admin>SCRIPT_STYLE</pulsar-admin>
            <pulsar-perf>SCRIPT_STYLE</pulsar-perf>
            <pulsar-client>SCRIPT_STYLE</pulsar-client>
            <pulsar-shell>SCRIPT_STYLE</pulsar-shell>
            <bookkeeper>SCRIPT_STYLE</bookkeeper>
            <tfvars>SCRIPT_STYLE</tfvars>
          </mapping>
        </configuration>
        <executions>
          <execution>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <configuration>
          <excludes>
            <!-- Other license files -->
            <exclude>licenses/LICENSE-*.txt</exclude>
            <exclude>src/assemble/README.bin.txt</exclude>
            <exclude>src/assemble/LICENSE.bin.txt</exclude>
            <exclude>src/assemble/NOTICE.bin.txt</exclude>

            <!-- These files are generated automatically by the Protobuf compiler
                 and are included in source tree for convenience -->
            <exclude>src/main/java/org/apache/bookkeeper/mledger/proto/MLDataFormats.java</exclude>
            <exclude>src/main/java/org/apache/pulsar/broker/service/schema/proto/SchemaRegistryFormat.java</exclude>
            <exclude>bin/proto/MLDataFormats_pb2.py</exclude>

            <!-- These files are generated automatically by the Avro compiler
                 and are included in source tree for convenience -->
            <exclude>**/avro/generated/*.java</exclude>

            <!-- Avro schema definitions - JSON format -->
            <exclude>**/*.avsc</exclude>

            <!-- pulasr-io-connector kinesis : auto generated files from flatbuffer schema -->
            <exclude>src/main/java/org/apache/pulsar/io/kinesis/fbs/CompressionType.java</exclude>
            <exclude>src/main/java/org/apache/pulsar/io/kinesis/fbs/EncryptionCtx.java</exclude>
            <exclude>src/main/java/org/apache/pulsar/io/kinesis/fbs/EncryptionKey.java</exclude>
            <exclude>src/main/java/org/apache/pulsar/io/kinesis/fbs/KeyValue.java</exclude>
            <exclude>src/main/java/org/apache/pulsar/io/kinesis/fbs/Message.java</exclude>

            <!-- Imported from Netty - Apache License v2 -->
            <exclude>src/main/java/org/apache/bookkeeper/mledger/util/AbstractCASReferenceCounted.java</exclude>

            <!-- This is generated during maven build -->
            <exclude>dependency-reduced-pom.xml</exclude>

            <!-- These files is go module configs -->
            <exclude>pulsar-client-go/go.mod</exclude>
            <exclude>pulsar-client-go/go.sum</exclude>
            <exclude>pulsar-function-go/go.mod</exclude>
            <exclude>pulsar-function-go/go.sum</exclude>
            <exclude>pulsar-function-go/examples/go.mod</exclude>
            <exclude>pulsar-function-go/examples/go.sum</exclude>

            <!-- This is a text property file that contains just a class name -->
            <exclude>**/META-INF/services/com.scurrilous.circe.HashProvider</exclude>
            <exclude>**/META-INF/services/io.trino.spi.Plugin</exclude>

            <!-- Django generated code -->
            <exclude>**/django/stats/migrations/*.py</exclude>
            <exclude>**/conf/uwsgi_params</exclude>

            <!-- Exclude certificates used for tests -->
            <exclude>**/*.crt</exclude>
            <exclude>**/*.key</exclude>
            <exclude>**/*.csr</exclude>
            <exclude>**/*.pem</exclude>
            <exclude>**/*.json</exclude>
            <exclude>**/*.htpasswd</exclude>
            <exclude>src/test/resources/athenz.conf.test</exclude>
            <exclude>deployment/terraform-ansible/templates/myid</exclude>
            <exclude>certificate-authority/index.txt</exclude>
            <exclude>certificate-authority/serial</exclude>
            <exclude>certificate-authority/README.md</exclude>

            <!-- Exclude ZK test data file -->
            <exclude>**/zk-3.5-test-data/*</exclude>

            <!-- Python requirements files -->
            <exclude>**/requirements.txt</exclude>

            <!-- Configuration Templates -->
            <exclude>conf/schema_example.conf</exclude>
            <exclude>**/templates/*.tpl</exclude>

            <!-- helm files -->
            <exclude>**/.helmignore</exclude>
            <exclude>**/_helpers.tpl</exclude>

            <!-- project ignored files -->
            <exclude>**/*.md</exclude>
            <exclude>.github/**</exclude>
            <exclude>**/*.nar</exclude>
            <exclude>**/.terraform/**</exclude>
            <exclude>**/.gitignore</exclude>
            <exclude>**/.svn</exclude>
            <exclude>**/*.iws</exclude>
            <exclude>**/*.ipr</exclude>
            <exclude>**/*.iml</exclude>
            <exclude>**/*.cbp</exclude>
            <exclude>**/*.pyc</exclude>
            <exclude>**/.classpath</exclude>
            <exclude>**/.project</exclude>
            <exclude>**/.settings</exclude>
            <exclude>**/target/**</exclude>
            <exclude>**/*.log</exclude>
            <exclude>**/build/**</exclude>
            <exclude>**/file:/**</exclude>
            <exclude>**/SecurityAuth.audit*</exclude>
            <exclude>**/site2/**</exclude>
            <exclude>**/.idea/**</exclude>
            <exclude>**/.mvn/**</exclude>
            <exclude>**/*.a</exclude>
            <exclude>**/*.so</exclude>
            <exclude>**/*.so.*</exclude>
            <exclude>**/*.dylib</exclude>
            <exclude>src/test/resources/*.txt</exclude>
          </excludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>${maven-enforcer-plugin.version}</version>
        <executions>
            <execution>
                <id>enforce-maven</id>
                <goals>
                    <goal>enforce</goal>
                </goals>
              <configuration>
                <rules>
                  <requireJavaVersion>
                    <version>17</version>
                    <message>Java 17+ is required to build Pulsar.</message>
                  </requireJavaVersion>
                  <requireMavenVersion>
                    <version>3.6.1</version>
                  </requireMavenVersion>
                </rules>
              </configuration>
            </execution>
        </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>${maven-assembly-plugin.version}</version>
          <inherited>false</inherited>
          <executions>
              <execution>
                  <id>source-release-assembly-tar-gz</id>
                  <phase>generate-sources</phase>
                  <goals>
                      <goal>single</goal>
                  </goals>
                  <configuration>
                      <skipAssembly>${skipSourceReleaseAssembly}</skipAssembly>
                      <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
                      <descriptors>
                        <descriptor>src/assembly-source-package.xml</descriptor>
                      </descriptors>
                      <finalName>apache-pulsar-${project.version}-src</finalName>
                      <appendAssemblyId>false</appendAssemblyId>
                      <formats>
                          <format>tar.gz</format>
                      </formats>
                      <tarLongFileMode>posix</tarLongFileMode>
                  </configuration>
              </execution>
          </executions>
      </plugin>
    </plugins>

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven-compiler-plugin.version}</version>
          <configuration>
            <release>${pulsar.broker.compiler.release}</release>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.gaul</groupId>
          <artifactId>modernizer-maven-plugin</artifactId>
          <version>${maven-modernizer-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <includes>
                <include>${include}</include>
            </includes>
            <excludes>
                <exclude>**/*$*,${exclude}</exclude>
            </excludes>
            <groups>${groups}</groups>
            <excludedGroups>${excludedGroups}</excludedGroups>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>${maven-dependency-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>${maven-shade-plugin}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <configuration>
            <doclint>none</doclint>
            <notimestamp>true</notimestamp>
            <sourcepath>${project.build.directory}/generated-sources/delombok</sourcepath>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok-maven-plugin</artifactId>
          <version>${lombok.plugin.version}</version>
          <executions>
            <execution>
              <phase>generate-sources</phase>
              <goals>
                <goal>delombok</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>${maven-antrun-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>${exec-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.nifi</groupId>
          <artifactId>nifi-nar-maven-plugin</artifactId>
          <version>${nifi-nar-maven-plugin.version}</version>
          <extensions>true</extensions>
          <configuration>
            <finalName>${project.artifactId}-${project.version}</finalName>
          </configuration>
          <executions>
            <execution>
              <id>default-nar</id>
              <phase>${narPluginPhase}</phase>
              <goals>
                <goal>nar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>${maven-assembly-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-checkstyle-plugin</artifactId>
          <version>${maven-checkstyle-plugin.version}</version>
          <dependencies>
            <dependency>
              <groupId>com.puppycrawl.tools</groupId>
              <artifactId>checkstyle</artifactId>
              <version>${puppycrawl.checkstyle.version}</version>
            </dependency>
          </dependencies>
          <configuration>
            <configLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/checkstyle.xml</configLocation>
            <suppressionsLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/suppressions.xml</suppressionsLocation>
            <includeTestSourceDirectory>true</includeTestSourceDirectory>
            <encoding>UTF-8</encoding>
            <excludes>**/proto/*</excludes>
          </configuration>
        </plugin>
        <plugin>
          <groupId>pl.project13.maven</groupId>
          <artifactId>git-commit-id-plugin</artifactId>
          <version>${git-commit-id-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.github.spotbugs</groupId>
          <artifactId>spotbugs-maven-plugin</artifactId>
          <version>${spotbugs-maven-plugin.version}</version>
            <dependencies>
              <dependency>
                <groupId>com.github.spotbugs</groupId>
                <artifactId>spotbugs</artifactId>
                <version>${spotbugs.version}</version>
              </dependency>
            </dependencies>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>properties-maven-plugin</artifactId>
          <version>${properties-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>io.fabric8</groupId>
          <artifactId>docker-maven-plugin</artifactId>
          <version>${docker-maven.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh-external</artifactId>
        <version>${wagon-ssh-external.version}</version>
      </extension>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>${os-maven-plugin.version}</version>
      </extension>
    </extensions>
  </build>

  <profiles>
    <profile>
      <!-- used for running integration tests on Java 8 -->
      <id>integration-test-java8</id>
      <activation>
        <jdk>1.8</jdk>
      </activation>
      <properties>
        <test.additional.args/>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <pulsar.broker.compiler.release></pulsar.broker.compiler.release>
        <pulsar.client.compiler.release></pulsar.client.compiler.release>
      </properties>
    </profile>
    <profile>
      <id>coverage</id>
      <properties>
        <testJacocoAgentArgument>@{jacoco.agent.argument}</testJacocoAgentArgument>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco-maven-plugin.version}</version>
            <configuration>
              <propertyName>jacoco.agent.argument</propertyName>
            </configuration>
            <executions>
              <execution>
                <id>pre-unit-test</id>
                <goals>
                  <goal>prepare-agent</goal>
                </goals>
              </execution>
              <execution>
                <id>post-test</id>
                <phase>test</phase>
                <goals>
                  <goal>report</goal>
                </goals>
                <configuration>
                  <excludes>
                    <exclude>META-INF/**</exclude>
                  </excludes>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <reporting>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <configuration>
              <configLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/checkstyle.xml</configLocation>
              <suppressionsLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/suppressions.xml</suppressionsLocation>
              <encoding>UTF-8</encoding>
              <excludes>**/proto/*</excludes>
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
              <doclint>none</doclint>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <reportSets>
              <reportSet>
                <reports>
                  <report>report</report>
                </reports>
              </reportSet>
            </reportSets>
          </plugin>
        </plugins>
      </reporting>
    </profile>
    <profile>
      <id>docker</id>
      <modules>
        <module>docker</module>
        <module>tests</module>
      </modules>
    </profile>

    <profile>
      <!-- Checks style and licensing requirements. This is a good
           idea to run for contributions and for the release process. While it would
           be nice to run always these plugins can considerably slow the build and have
           proven to create unstable builds in our multi-module project and when building
           using multiple threads. The stability issues seen with Checkstyle in multi-module
           builds include false-positives and false negatives. -->
      <id>contrib-check</id>
         <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.rat</groupId>
                    <artifactId>apache-rat-plugin</artifactId>
                    <executions>
                      <execution>
                          <goals>
                              <goal>check</goal>
                          </goals>
                          <phase>verify</phase>
                      </execution>
                   </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-checkstyle-plugin</artifactId>
                    <executions>
                       <execution>
                          <id>check-style</id>
                          <phase>verify</phase>
                         <configuration>
                           <configLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/checkstyle.xml</configLocation>
                           <suppressionsLocation>${pulsar.basedir}/buildtools/src/main/resources/pulsar/suppressions.xml</suppressionsLocation>
                           <encoding>UTF-8</encoding>
                           <excludes>**/proto/*</excludes>
                         </configuration>
                          <goals>
                             <goal>check</goal>
                          </goals>
                       </execution>
                    </executions>
                </plugin>
             </plugins>
         </build>
    </profile>

    <profile>
      <id>windows</id>
      <activation>
        <os>
          <family>Windows</family>
        </os>
      </activation>
      <properties>
        <rename.netty.native.libs>rename-netty-native-libs.cmd</rename.netty.native.libs>
      </properties>

    </profile>
    <!-- Primary Module profile -->
    <profile>
      <id>main</id>
      <activation>
        <!-- always activate this profile by default. Use "-main" or "!main" in the "-P" parameter to exclude it -->
        <!-- for example use "-Pcore-modules,-main" to activate the core-modules profile -->
        <property>
          <name>disableMainProfile</name>
          <!-- always active unless true is passed as a value -->
          <value>!true</value>
        </property>
      </activation>
      <modules>
        <module>buildtools</module>
        <module>testmocks</module>
        <module>managed-ledger</module>
        <module>tiered-storage</module>
        <module>pulsar-common</module>
        <module>pulsar-broker-common</module>
        <module>pulsar-broker</module>
        <module>pulsar-client-api</module>
        <module>pulsar-client</module>
        <module>pulsar-client-shaded</module>
        <module>pulsar-client-1x-base</module>
        <module>pulsar-client-admin-api</module>
        <module>pulsar-client-admin</module>
        <module>pulsar-client-admin-shaded</module>
        <module>pulsar-client-tools-api</module>
        <module>pulsar-client-tools</module>
        <module>pulsar-client-tools-customcommand-example</module>
        <module>pulsar-client-tools-test</module>
        <module>pulsar-client-all</module>
        <module>pulsar-websocket</module>
        <module>pulsar-proxy</module>
        <module>pulsar-testclient</module>
        <module>pulsar-broker-auth-athenz</module>
        <module>pulsar-client-auth-athenz</module>
        <module>pulsar-sql</module>
        <module>pulsar-broker-auth-sasl</module>
        <module>pulsar-client-auth-sasl</module>
        <module>pulsar-config-validation</module>

        <module>structured-event-log</module>

        <!-- transaction related modules -->
        <module>pulsar-transaction</module>

        <!-- functions-related modules -->
        <module>pulsar-functions</module>

        <!-- connector-related modules -->
        <module>pulsar-io</module>

        <!-- kafka connect avro converter shaded, because version mismatch    -->
        <module>kafka-connect-avro-converter-shaded</module>

        <!-- Bouncy Castle Provider loaders-->
        <module>bouncy-castle</module>

        <module>pulsar-client-messagecrypto-bc</module>

        <module>pulsar-metadata</module>
        <module>jclouds-shaded</module>

        <!-- package management releated modules (begin) -->
        <module>pulsar-package-management</module>
        <!-- package management releated modules (end) -->

        <!-- all these 3 modules should be put at the end in this exact sequence -->
        <module>distribution</module>
        <module>docker</module>
        <module>tests</module>
      </modules>
    </profile>

    <!-- core profile focused of pulsar java modules -->
    <profile>
      <id>core-modules</id>
      <properties>
        <skipSourceReleaseAssembly>true</skipSourceReleaseAssembly>
      </properties>
      <modules>
        <module>buildtools</module>
        <module>testmocks</module>
        <module>managed-ledger</module>
        <module>pulsar-common</module>
        <module>pulsar-broker-common</module>
        <module>pulsar-broker</module>
        <module>pulsar-client-api</module>
        <module>pulsar-client</module>
        <module>pulsar-client-admin-api</module>
        <module>pulsar-client-admin</module>
        <module>pulsar-client-tools-api</module>
        <module>pulsar-client-tools</module>
        <module>pulsar-client-tools-customcommand-example</module>
        <module>pulsar-client-tools-test</module>
        <module>pulsar-websocket</module>
        <module>pulsar-proxy</module>
        <module>pulsar-testclient</module>
        <module>pulsar-broker-auth-sasl</module>
        <module>pulsar-client-auth-sasl</module>
        <module>pulsar-config-validation</module>

        <!-- transaction related modules -->
        <module>pulsar-transaction</module>

        <!-- functions-related modules -->
        <module>pulsar-functions</module>

        <!-- connector-related modules -->
        <module>pulsar-io</module>

        <!-- Bouncy Castle Provider loaders-->
        <module>bouncy-castle</module>

        <module>pulsar-client-messagecrypto-bc</module>

        <!-- all these modules should be put at the end in this exact sequence -->
        <module>distribution</module>
        <module>pulsar-metadata</module>

        <!-- package management releated modules (begin) -->
        <module>pulsar-package-management</module>
        <!-- package management releated modules (end) -->
      </modules>
    </profile>

    <!--
         Configure Google Error Prone static code analyser, http://errorprone.info

         usage:
         activate profile "errorprone"

         It is required to add "lombok.addJavaxGeneratedAnnotation = true" to lombok.config
         temporarily before running the analysis.

         usage example:
         echo lombok.addJavaxGeneratedAnnotation=true >> lombok.config
         mvn -Perrorprone,main compile

         Revisiting warnings and errors is possible in IntelliJ after activating
         errorprone and main in "Maven->Profiles" and choosing
         "Build->Rebuild Project"
         Compiling all Pulsar projects in IntelliJ requires some manual tweaks to get the
         shaded projects to pass compilation. In some cases, it's better to mark the project
         ignored in IntelliJ by right clicking the project in IntelliJ's maven view and
         choosing "Ignore Projects". After "Reload All Maven Projects" and a rebuild, it might
         be possible to proceed compiling the remaining projects.
    -->
    <profile>
      <id>errorprone</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <fork>true</fork>
              <meminitial>128m</meminitial>
              <maxmem>1024m</maxmem>
              <optimize>false</optimize>
              <compilerArgs combine.children="append">
                <arg>-XDcompilePolicy=simple</arg>
                <arg>-Xlint:-options</arg>
                <!-- configure Error Prone . Disable some checks that crash the compiler or are annoying -->
                <!-- the following argument must be kept on one line when building with JDK8 -->
                <arg>-Xplugin:ErrorProne -XepExcludedPaths:.*/target/generated-sources/.* -XepDisableWarningsInGeneratedCode -Xep:UnusedVariable:OFF -Xep:FallThrough:OFF -Xep:OverrideThrowableToString:OFF -Xep:UnusedMethod:OFF -Xep:StringSplitter:OFF -Xep:CanonicalDuration:OFF -Xep:Slf4jDoNotLogMessageOfExceptionExplicitly:WARN -Xep:Slf4jSignOnlyFormat:WARN -Xep:Slf4jFormatShouldBeConst:WARN -Xep:Slf4jLoggerShouldBePrivate:WARN -Xep:Slf4jLoggerShouldBeNonStatic:OFF</arg>
              </compilerArgs>
              <annotationProcessorPaths combine.children="append">
                <path>
                  <groupId>com.google.errorprone</groupId>
                  <artifactId>error_prone_core</artifactId>
                  <version>${errorprone.version}</version>
                </path>
                <path>
                  <groupId>org.mockito</groupId>
                  <artifactId>mockito-errorprone</artifactId>
                  <version>${mockito.version}</version>
                </path>
                <!-- add https://github.com/KengoTODA/errorprone-slf4j Error Prone plugin -->
                <!-- detects slf4j misusage. -->
                <path>
                  <groupId>jp.skypencil.errorprone.slf4j</groupId>
                  <artifactId>errorprone-slf4j</artifactId>
                  <version>${errorprone-slf4j.version}</version>
                </path>
              </annotationProcessorPaths>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>integrationTests</id>
      <modules>
        <module>tests</module>
      </modules>
    </profile>
    <profile>
      <id>skip-all</id>
      <properties>
        <maven.main.skip>true</maven.main.skip>
        <maven.test.skip>true</maven.test.skip>
        <skipSourceReleaseAssembly>true</skipSourceReleaseAssembly>
        <skipBuildDistribution>true</skipBuildDistribution>
        <spotbugs.skip>true</spotbugs.skip>
        <license.skip>true</license.skip>
        <rat.skip>true</rat.skip>
        <assembly.skipAssembly>true</assembly.skipAssembly>
        <shadePluginPhase>none</shadePluginPhase>
        <narPluginPhase>none</narPluginPhase>
        <skipDocker>true</skipDocker>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
              <execution>
                <id>default-testCompile</id>
                <goals>
                  <goal>testCompile</goal>
                </goals>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <executions>
              <execution>
                <id>default-test</id>
                <goals>
                  <goal>test</goal>
                </goals>
                <phase>none</phase>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>owasp-dependency-check</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.owasp</groupId>
            <artifactId>dependency-check-maven</artifactId>
            <version>${dependency-check-maven.version}</version>
            <configuration>
              <suppressionFiles>
                <suppressionFile>${pulsar.basedir}/src/owasp-dependency-check-false-positives.xml</suppressionFile>
                <suppressionFile>${pulsar.basedir}/src/owasp-dependency-check-suppressions.xml</suppressionFile>
              </suppressionFiles>
              <failBuildOnCVSS>7</failBuildOnCVSS>
              <msbuildAnalyzerEnabled>false</msbuildAnalyzerEnabled>
              <nodeAnalyzerEnabled>false</nodeAnalyzerEnabled>
              <yarnAuditAnalyzerEnabled>false</yarnAuditAnalyzerEnabled>
              <pyDistributionAnalyzerEnabled>false</pyDistributionAnalyzerEnabled>
              <pyPackageAnalyzerEnabled>false</pyPackageAnalyzerEnabled>
              <pipAnalyzerEnabled>false</pipAnalyzerEnabled>
              <pipfileAnalyzerEnabled>false</pipfileAnalyzerEnabled>
              <retireJsAnalyzerEnabled>false</retireJsAnalyzerEnabled>
              <msbuildAnalyzerEnabled>false</msbuildAnalyzerEnabled>
              <mixAuditAnalyzerEnabled>false</mixAuditAnalyzerEnabled>
              <nugetconfAnalyzerEnabled>false</nugetconfAnalyzerEnabled>
              <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
            </configuration>
            <executions>
              <execution>
                <goals>
                  <goal>aggregate</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <reporting>
        <plugins>
          <plugin>
            <groupId>org.owasp</groupId>
            <artifactId>dependency-check-maven</artifactId>
            <version>${dependency-check-maven.version}</version>
            <reportSets>
              <reportSet>
                <reports>
                  <report>aggregate</report>
                </reports>
              </reportSet>
            </reportSets>
          </plugin>
        </plugins>
      </reporting>
    </profile>

    <profile>
      <id>pulsar-io-tests</id>
      <modules>
        <module>pulsar-io</module>
      </modules>
    </profile>

    <profile>
      <id>pulsar-sql-tests</id>
      <modules>
        <module>pulsar-sql</module>
      </modules>
    </profile>
  </profiles>

  <repositories>
    <repository>
      <id>central</id>
      <layout>default</layout>
      <url>https://repo1.maven.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>confluent</id>
      <url>https://packages.confluent.io/maven/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>maven.restlet.org</id>
      <name>maven.restlet.org</name>
      <url>https://maven.restlet.talend.com</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

</project>