<?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.logging.log4j</groupId>
    <artifactId>log4j-bom</artifactId>
    <version>${revision}</version>
  </parent>

  <!-- Using `log4j` instead of `log4j-parent` for backward compatibility: -->
  <artifactId>log4j</artifactId>
  <packaging>pom</packaging>

  <name>Apache Log4j Parent</name>
  <description>Apache Log4j Parent</description>

  <properties>
    <!-- ██     ██  █████  ██████  ███    ██ ██ ███    ██  ██████  ██
         ██     ██ ██   ██ ██   ██ ████   ██ ██ ████   ██ ██       ██
         ██  █  ██ ███████ ██████  ██ ██  ██ ██ ██ ██  ██ ██   ███ ██
         ██ ███ ██ ██   ██ ██   ██ ██  ██ ██ ██ ██  ██ ██ ██    ██
          ███ ███  ██   ██ ██   ██ ██   ████ ██ ██   ████  ██████  ██

         Dependency and plugin version properties might have many implications beyond their simple appearance!
         Walk through the following checklist before making a change in these properties!

         1. Follow the `<artifactId>.version` naming convention
         2. Make sure properties are sorted in alphabetical order
         3. Check parent POMs for any associations.
            For instance, Maven Surefire Plugin version property is such an exception.
            It is named as `surefire.version` rather than `maven-surefire-plugin.version`, since `surefire.version` is already employed by `apache.org:apache` parent POM.
         4. Think of consequences when users _import_ this POM along with, e.g., `spring-boot-dependencies` BOM -->

    <!-- =================================================
         Plugin version properties (in alphabetical order)
         ================================================= -->
    <asciidoctor-maven-plugin.version>2.2.4</asciidoctor-maven-plugin.version>
    <docker-maven-plugin.version>0.45.0</docker-maven-plugin.version>
    <exam-maven-plugin.version>4.13.5</exam-maven-plugin.version>
    <maven-taglib-plugin.version>2.4</maven-taglib-plugin.version>
    <!-- `surefire.version` property used in `apache.org:apache`: -->
    <surefire.version>3.5.0</surefire.version>

    <!-- =====================================================
         Direct dependency version properties (in alphabetical order)
         ===================================================== -->
    <activemq.version>6.1.3</activemq.version>
    <angus-activation.version>2.0.2</angus-activation.version>
    <angus-mail.version>2.0.3</angus-mail.version>
    <assertj.version>3.26.3</assertj.version>
    <awaitility.version>4.2.2</awaitility.version>
    <bsh.version>2.0b6</bsh.version>
    <cassandra.version>3.11.17</cassandra.version>
    <cassandra-driver.version>3.11.5</cassandra-driver.version>
    <commons-codec.version>1.17.1</commons-codec.version>
    <commons-compress.version>1.27.1</commons-compress.version>
    <commons-csv.version>1.11.0</commons-csv.version>
    <commons-dbcp2.version>2.12.0</commons-dbcp2.version>
    <commons-io.version>2.16.1</commons-io.version>
    <commons-lang3.version>3.17.0</commons-lang3.version>
    <commons-logging.version>1.3.4</commons-logging.version>
    <!-- `com.conversantmedia:disruptor` version 1.2.16 requires Java 9: -->
    <conversant.disruptor.version>1.2.15</conversant.disruptor.version>
    <disruptor.version>3.4.4</disruptor.version>
    <elasticsearch-java.version>8.15.0</elasticsearch-java.version>
    <embedded-ldap.version>0.9.0</embedded-ldap.version>
    <felix.version>7.0.5</felix.version>
    <flapdoodle-embed.version>4.13.1</flapdoodle-embed.version>
    <flapdoodle-reverse.version>1.8.0</flapdoodle-reverse.version>
    <groovy.version>3.0.22</groovy.version>
    <guava.version>33.3.0-jre</guava.version>
    <h2.version>2.2.224</h2.version>
    <hamcrest.version>3.0</hamcrest.version>
    <HdrHistogram.version>2.2.2</HdrHistogram.version>
    <hsqldb.version>2.7.3</hsqldb.version>
    <jackson-bom.version>2.17.2</jackson-bom.version>
    <!-- Override the version in Jakarta EE 9 BOM: -->
    <jakarta-activation.version>2.1.3</jakarta-activation.version>
    <jakarta-mail.version>2.1.3</jakarta-mail.version>
    <!-- BOM with Jakarta EE 9 APIs: -->
    <jakartaee-bom.version>9.1.0</jakartaee-bom.version>
    <!-- No BOM for Java EE 8 APIs, so we list them separately: -->
    <javax-activation.version>1.2.0</javax-activation.version>
    <javax-inject.version>1</javax-inject.version>
    <javax-jms.version>2.0.1</javax-jms.version>
    <javax-mail.version>1.6.2</javax-mail.version>
    <javax-persistence.version>2.2</javax-persistence.version>
    <javax-servlet.version>4.0.1</javax-servlet.version>
    <javax-servlet-jsp.version>2.3.3</javax-servlet-jsp.version>
    <jansi.version>2.4.1</jansi.version>
    <java-allocation-instrumenter.version>3.3.4</java-allocation-instrumenter.version>
    <jconsole.version>1.7.0</jconsole.version>
    <jctools.version>4.0.5</jctools.version>
    <jeromq.version>0.6.0</jeromq.version>
    <jetty.version>9.4.55.v20240627</jetty.version>
    <jmdns.version>3.5.12</jmdns.version>
    <jmh.version>1.37</jmh.version>
    <json-unit.version>2.40.1</json-unit.version>
    <junit.version>4.13.2</junit.version>
    <junit-jupiter.version>5.10.3</junit-jupiter.version>
    <junit-pioneer.version>1.9.1</junit-pioneer.version>
    <kafka.version>3.8.0</kafka.version>
    <lightcouch.version>0.2.0</lightcouch.version>
    <log4j.version>1.2.17</log4j.version>
    <log4j2-cachefile-transformer.version>2.15.0</log4j2-cachefile-transformer.version>
    <log4j2-ecs-layout.version>1.6.0</log4j2-ecs-layout.version>
    <logback.version>1.3.14</logback.version>
    <maven.version>3.9.9</maven.version>
    <mockito.version>4.11.0</mockito.version>
    <nashorn.version>15.4</nashorn.version>
    <org.eclipse.osgi.version>3.20.0</org.eclipse.osgi.version>
    <org.eclipse.persistence.version>2.7.15</org.eclipse.persistence.version>
    <oro.version>2.0.8</oro.version>
    <!-- The OSGi API version MUST always be the MINIMUM version Log4j supports: -->
    <osgi.api.version>6.0.0</osgi.api.version>
    <pax-exam.version>4.13.5</pax-exam.version>
    <plexus-utils.version>3.5.1</plexus-utils.version>
    <spring-boot.version>2.7.18</spring-boot.version>
    <spring-framework.version>5.3.39</spring-framework.version>
    <system-stubs.version>2.0.3</system-stubs.version>
    <tomcat-juli.version>10.0.27</tomcat-juli.version>
    <velocity.version>1.7</velocity.version>
    <wiremock.version>2.35.2</wiremock.version>
    <xmlunit.version>2.10.0</xmlunit.version>
    <xz.version>1.10</xz.version>
    <zstd.version>1.5.6-5</zstd.version>

    <!-- =====================================================
         Pinned transitive dependency version properties (in alphabetical order)

         These are not directly used in the code, but ensure
         the independence of transitive dependencies from the order
         of dependencies (requireUpperBoundDeps rule).
         ===================================================== -->
    <asm.version>9.6</asm.version>
    <byte-buddy.version>1.14.9</byte-buddy.version>
    <commons-pool2.version>2.12.0</commons-pool2.version>
    <httpclient.version>4.5.14</httpclient.version>
    <httpcore.version>4.4.16</httpcore.version>
    <jna.version>5.14.0</jna.version>

  </properties>

  <dependencyManagement>
    <dependencies>

      <!-- BEGIN: Modules that are not published (and hence missing in the BOM) -->

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

      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-layout-template-json-test</artifactId>
        <version>${project.version}</version>
      </dependency>

      <!-- END: Modules that are not published (and hence missing in the BOM) -->

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

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

      <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-bom</artifactId>
        <version>${jakartaee-bom.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

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

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

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

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-framework-bom</artifactId>
        <version>${spring-framework.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

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

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

      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-broker</artifactId>
        <version>${activemq.version}</version>
      </dependency>

      <dependency>
        <groupId>org.eclipse.angus</groupId>
        <artifactId>angus-activation</artifactId>
        <version>${angus-activation.version}</version>
      </dependency>

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

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

      <dependency>
        <groupId>org.apache-extras.beanshell</groupId>
        <artifactId>bsh</artifactId>
        <version>${bsh.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.cassandra</groupId>
        <artifactId>cassandra-all</artifactId>
        <version>${cassandra.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
          </exclusion>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
          </exclusion>
          <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>${cassandra-driver.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.cassandra</groupId>
        <artifactId>cassandra-thrift</artifactId>
        <version>${cassandra.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
          </exclusion>
          <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

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

      <!-- Used for compressing to formats other than `zip` and `gz`: -->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-compress</artifactId>
        <version>${commons-compress.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>${commons-dbcp2.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-lang3</artifactId>
        <version>${commons-lang3.version}</version>
      </dependency>

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

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

      <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>${flapdoodle-embed.version}</version>
      </dependency>

      <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.process</artifactId>
        <version>${flapdoodle-embed.version}</version>
      </dependency>

      <dependency>
        <groupId>de.flapdoodle.reverse</groupId>
        <artifactId>de.flapdoodle.reverse</artifactId>
        <version>${flapdoodle-reverse.version}</version>
      </dependency>

      <dependency>
        <groupId>com.conversantmedia</groupId>
        <artifactId>disruptor</artifactId>
        <version>${conversant.disruptor.version}</version>
      </dependency>

      <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>${disruptor.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.zapodot</groupId>
        <artifactId>embedded-ldap-junit</artifactId>
        <version>${embedded-ldap.version}</version>
      </dependency>

      <!-- Transitive dependency: setting upper bound of declared versions -->
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
      </dependency>

      <dependency>
        <groupId>com.google.guava</groupId>
        <!-- https://javadoc.io/doc/com.google.guava/guava-testlib/latest/com/google/common/testing/TestLogHandler.html used in log4j-to-jul tests -->
        <artifactId>guava-testlib</artifactId>
        <version>${guava.version}</version>
      </dependency>

      <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>${h2.version}</version>
      </dependency>

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

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

      <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-library</artifactId>
        <version>${hamcrest.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>${hsqldb.version}</version>
        <classifier>jdk8</classifier>
      </dependency>

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

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

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

      <dependency>
        <groupId>org.eclipse.angus</groupId>
        <artifactId>jakarta.mail</artifactId>
        <version>${angus-mail.version}</version>
      </dependency>

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

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

      <!-- Used for garbage-free tests: -->
      <dependency>
        <groupId>com.google.code.java-allocation-instrumenter</groupId>
        <artifactId>java-allocation-instrumenter</artifactId>
        <version>${java-allocation-instrumenter.version}</version>
      </dependency>

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

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

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

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

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

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

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

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

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

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

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

      <!-- Zeroconf advertiser tests: -->
      <dependency>
        <groupId>org.jmdns</groupId>
        <artifactId>jmdns</artifactId>
        <version>${jmdns.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.openjdk.jmh</groupId>
        <artifactId>jmh-generator-annprocess</artifactId>
        <version>${jmh.version}</version>
      </dependency>

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

      <dependency>
        <groupId>net.javacrumbs.json-unit</groupId>
        <artifactId>json-unit</artifactId>
        <version>${json-unit.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.junit-pioneer</groupId>
        <artifactId>junit-pioneer</artifactId>
        <version>${junit-pioneer.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>${kafka.version}</version>
      </dependency>

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

      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>

      <!-- Used for testing `JsonTemplateLayout`: -->
      <dependency>
        <groupId>co.elastic.logging</groupId>
        <artifactId>log4j2-ecs-layout</artifactId>
        <version>${log4j2-ecs-layout.version}</version>
      </dependency>

      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
      </dependency>

      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
        <type>test-jar</type>
      </dependency>

      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
      </dependency>

      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
        <type>test-jar</type>
      </dependency>

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

      <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-model</artifactId>
        <version>${maven.version}</version>
      </dependency>

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

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

      <dependency>
        <groupId>org.eclipse.platform</groupId>
        <artifactId>org.eclipse.osgi</artifactId>
        <version>${org.eclipse.osgi.version}</version>
      </dependency>

      <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.jpa</artifactId>
        <version>${org.eclipse.persistence.version}</version>
        <exclusions>
          <!-- A copy of `javax.persistence:javax.persistence-api`: -->
          <exclusion>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>jakarta.persistence</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>${osgi.api.version}</version>
      </dependency>

      <dependency>
        <groupId>oro</groupId>
        <artifactId>oro</artifactId>
        <version>${oro.version}</version>
      </dependency>

      <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam</artifactId>
        <version>${pax-exam.version}</version>
      </dependency>

      <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam-container-native</artifactId>
        <version>${pax-exam.version}</version>
      </dependency>

      <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam-junit4</artifactId>
        <version>${pax-exam.version}</version>
      </dependency>

      <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam-link-assembly</artifactId>
        <version>${pax-exam.version}</version>
      </dependency>

      <dependency>
        <groupId>org.ops4j.pax.exam</groupId>
        <artifactId>pax-exam-spi</artifactId>
        <version>${pax-exam.version}</version>
      </dependency>

      <dependency>
        <groupId>org.codehaus.plexus</groupId>
        <artifactId>plexus-utils</artifactId>
        <version>${plexus-utils.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>${spring-boot.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>${spring-boot.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
        <version>${spring-boot.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>${spring-boot.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-framework.version}</version>
        <exclusions>
          <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jcl</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

      <dependency>
        <groupId>uk.org.webcompere</groupId>
        <artifactId>system-stubs-core</artifactId>
        <version>${system-stubs.version}</version>
      </dependency>

      <!-- Environment and system properties support for JUnit Jupiter: -->
      <dependency>
        <groupId>uk.org.webcompere</groupId>
        <artifactId>system-stubs-jupiter</artifactId>
        <version>${system-stubs.version}</version>
      </dependency>

      <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-juli</artifactId>
        <version>${tomcat-juli.version}</version>
      </dependency>

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

      <!-- Used for testing `HttpAppender`: -->
      <dependency>
        <groupId>com.github.tomakehurst</groupId>
        <artifactId>wiremock-jre8</artifactId>
        <version>${wiremock.version}</version>
      </dependency>

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

      <dependency>
        <groupId>org.xmlunit</groupId>
        <artifactId>xmlunit-matchers</artifactId>
        <version>${xmlunit.version}</version>
      </dependency>

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

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

    </dependencies>
  </dependencyManagement>

  <!-- Common annotations used in all the modules -->
  <dependencies>

    <dependency>
      <groupId>biz.aQute.bnd</groupId>
      <artifactId>biz.aQute.bnd.annotation</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.google.errorprone</groupId>
      <artifactId>error_prone_annotations</artifactId>
      <version>${error-prone.version}</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.osgi</groupId>
      <artifactId>osgi.annotation</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.osgi</groupId>
      <artifactId>org.osgi.annotation.bundle</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs-annotations</artifactId>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <pluginManagement>
      <plugins>

        <!-- used by `docker` profile in `log4j-layout-template-json-test`: -->
        <plugin>
          <groupId>io.fabric8</groupId>
          <artifactId>docker-maven-plugin</artifactId>
          <version>${docker-maven-plugin.version}</version>
        </plugin>

        <!-- used by OSGi tests -->
        <plugin>
          <groupId>org.ops4j.pax.exam</groupId>
          <artifactId>exam-maven-plugin</artifactId>
          <version>${exam-maven-plugin.version}</version>
        </plugin>

        <!-- used to generate taglib documentation -->
        <plugin>
          <groupId>net.sourceforge.maven-taglib</groupId>
          <artifactId>maven-taglib-plugin</artifactId>
          <version>${maven-taglib-plugin.version}</version>
        </plugin>

      </plugins>
    </pluginManagement>

    <plugins>

      <!--
        ~ A previous `generate-module-descriptors` execution leaves:
        ~  * `target/classes/module-info.class` files, which interferes with `maven-compiler-plugin`,
        ~  * `target/classes/META-INF/versions` folder, which switch `bnd-maven-plugin` into MRJ mode.
        ~
        ~ TODO: test BND multi-release mode in 2.23.0.
        -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-clean-plugin</artifactId>
        <executions>
          <execution>
            <id>delete-module-descriptors</id>
            <goals>
              <goal>clean</goal>
            </goals>
            <phase>process-sources</phase>
            <configuration>
              <excludeDefaultDirectories>true</excludeDefaultDirectories>
              <filesets>
                <fileset>
                  <directory>${project.build.outputDirectory}</directory>
                  <includes>
                    <include>module-info.class</include>
                    <include>META-INF/versions/**</include>
                  </includes>
                </fileset>
              </filesets>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!--
        ~ Some external logging bridges can interfere with our tests, giving false negatives.
        -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <executions>
          <execution>
            <id>ban-logging-dependencies</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <bannedDependencies>
                  <excludes>
                    <!-- JCL replacements -->
                    <exclude>org.slf4j:jcl-over-slf4j</exclude>
                    <exclude>org.springframework:spring-jcl</exclude>
                    <!-- Log4j 1.x replacements -->
                    <exclude>org.slf4j:log4j-over-slf4j</exclude>
                    <exclude>ch.qos.reload4j:reload4j</exclude>
                    <!-- Bridges to Log4j 1.x -->
                    <exclude>org.slf4j:slf4j-log4j12</exclude>
                    <exclude>org.slf4j:slf4j-reload4j</exclude>
                    <!-- PAX Logging just to be safe -->
                    <exclude>org.ops4j.pax.logging:*</exclude>
                    <!-- Logback -->
                    <exclude>ch.qos.logback:*</exclude>
                  </excludes>
                </bannedDependencies>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>
  </build>

  <profiles>

    <!-- `plugin-processing` profile containing configuration specific to `@Plugin`-annotated members -->
    <profile>

      <id>plugin-processing</id>

      <!-- Profile gets activated using a file instead of, say, a property defined by the child `pom.xml`.
           Since a Maven property lookup requires model interpolation and that happens after the profile activation phase.
           See: https://maven.apache.org/ref/3.9.6/maven-model-builder -->
      <activation>
        <file>
          <exists>.log4j-plugin-processing-activator</exists>
        </file>
      </activation>

      <properties>
        <log4j.docgen.pluginDescriptorsDir.skipped>${maven.multiModuleProjectDirectory}/target/plugin-descriptors/skipped</log4j.docgen.pluginDescriptorsDir.skipped>
        <log4j.docgen.pluginDescriptorsDir>${log4j.docgen.pluginDescriptorsDir.phase2}</log4j.docgen.pluginDescriptorsDir>
      </properties>

      <build>
        <plugins>

          <!-- This is a workaround to effectively disable Log4j Docgen `DescriptorGenerator` plugin processor.
               Once Log4j Docgen `>0.9.0` is released (containing the new `log4j.docgen.skip` argument to `DescriptorGenerator`):
               1. Remove this `build-helper:bsh-property` execution
               2. Remove the `log4j.docgen.pluginDescriptorsDir.skipped` property
               3. In the `PluginProcessor` execution configuration
                  - Add `-Alog4j.docgen.skip=${log4j.docgen.skip}` argument
                  - Set `-Alog4j.docgen.descriptorFilePath=${log4j.docgen.pluginDescriptorsDir}/${project.artifactId}-plugins.xml` argument -->
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>define-log4jDocgenDescriptorFilepath</id>
                <goals>
                  <goal>bsh-property</goal>
                </goals>
                <phase>process-resources</phase>
                <configuration>
                  <properties>
                    <property>log4jDocgenDescriptorFilepath</property>
                  </properties>
                  <source><![CDATA[
                    Properties properties = project.getProperties();
                    String pluginDescriptorsDir = "true".equals(properties.getProperty("log4j.docgen.skip"))
                            ? properties.getProperty("log4j.docgen.pluginDescriptorsDir.skipped")
                            : properties.getProperty("log4j.docgen.pluginDescriptorsDir");
                    String log4jDocgenDescriptorFilepath = String.format("%s/%s-plugins.xml", new Object[] {
                        pluginDescriptorsDir, project.getArtifactId()
                    });
                  ]]></source>
                </configuration>
              </execution>
            </executions>
          </plugin>

          <!-- We will compile sources as usual and make a second pass to process plugins, because...
               `log4j-core` contains `PluginProcessor`, that is responsible for generating `Log4j2Plugins.dat` from `@Plugin`-annotated members.
               `log4j-core` also contains `@Plugin`-annotated members too.
               That is, we need `log4j-core` to build `log4j-core`.
               To work around this chicken-and-egg problem, we build as follows:

               1. Compile sources using the `default-compile` default compilation execution.
                  This will generate the `PluginProcessor` class.

               2. Make a second compilation pass using the generated `PluginProcessor`. -->
          <plugin>

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

            <executions>

              <!-- 1st pass: compile sources as usual.
                   This needs to be explicitly stated here to set the order of execution. -->
              <execution>
                <id>default-compile</id>
              </execution>

              <!-- 1st pass for tests: compile sources as usual.
                   This needs to be explicitly stated here to set the order of execution. -->
              <execution>
                <id>default-testCompile</id>
              </execution>

              <!-- 2nd pass: exclusively generate plugin descriptors -->
              <execution>
                <id>generate-plugin-descriptors</id>
                <goals>
                  <goal>compile</goal>
                  <goal>testCompile</goal>
                </goals>
                <configuration combine.self="override">
                  <annotationProcessorPaths>
                    <!-- Include `org.apache.logging.log4j.docgen.processor.DescriptorGenerator` that generates `<artifactId>-plugins.xml` -->
                    <path>
                      <groupId>org.apache.logging.log4j</groupId>
                      <artifactId>log4j-docgen</artifactId>
                      <version>${log4j-docgen.version}</version>
                    </path>
                    <!-- Include `log4j-core` providing `org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor` that generates `Log4j2Plugins.dat` -->
                    <path>
                      <groupId>org.apache.logging.log4j</groupId>
                      <artifactId>log4j-core</artifactId>
                      <version>${project.version}</version>
                    </path>
                  </annotationProcessorPaths>
                  <annotationProcessors>
                    <!-- Process sources using `org.apache.logging.log4j.docgen.processor.DescriptorGenerator` to generate `<artifactId>-plugins.xml`.
                         `DescriptorGenerator` must precede `PluginProcessor`, since the latter *claims* the `@Plugin`.
                         Once claimed, `javac` doesn't pass those sources to other processors. -->
                    <processor>org.apache.logging.log4j.docgen.processor.DescriptorGenerator</processor>
                    <!-- Process sources using `org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor` to generate `Log4j2Plugins.dat` -->
                    <processor>org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor</processor>
                  </annotationProcessors>
                  <compilerArgs>
                    <!-- Provide `org.apache.logging.log4j.docgen.processor.DescriptorGenerator` arguments: -->
                    <arg>-Alog4j.docgen.descriptorFilePath=${log4jDocgenDescriptorFilepath}</arg>
                    <arg>-Alog4j.docgen.groupId=${project.groupId}</arg>
                    <arg>-Alog4j.docgen.artifactId=${project.artifactId}</arg>
                    <arg>-Alog4j.docgen.version=${project.version}</arg>
                    <arg>-Alog4j.docgen.description=${project.description}</arg>
                    <arg>-Alog4j.docgen.typeFilter.excludePattern=${log4j.docgen.typeFilter.excludePattern}</arg>
                  </compilerArgs>
                  <proc>only</proc>
                </configuration>
              </execution>

            </executions>

          </plugin>

        </plugins>
      </build>

    </profile>

  </profiles>

</project>
