<?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 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>30</version>
  </parent>
  <groupId>org.apache.logging</groupId>
  <artifactId>logging-parent</artifactId>
  <version>10.1.1</version>
  <packaging>pom</packaging>
  <name>Apache Logging Parent</name>
  <description>Parent project internally used in Maven-based projects of the Apache Logging Services</description>
  <url>https://logging.apache.org/logging-parent</url>
  <inceptionYear>1999</inceptionYear>
  <licenses>
    <license>
      <name>Apache-2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>ggregory</id>
      <name>Gary Gregory</name>
      <email>ggregory@apache.org</email>
      <url>https://www.garygregory.com</url>
      <organization>The Apache Software Foundation</organization>
      <organizationUrl>https://www.apache.org/</organizationUrl>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>America/New_York</timezone>
    </developer>
    <developer>
      <id>grobmeier</id>
      <name>Christian Grobmeier</name>
      <email>grobmeier@apache.org</email>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>Europe/Berlin</timezone>
    </developer>
    <developer>
      <id>mattsicker</id>
      <name>Matt Sicker</name>
      <email>mattsicker@apache.org</email>
      <organization>Apple</organization>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>America/Chicago</timezone>
    </developer>
    <developer>
      <id>pkarwasz</id>
      <name>Piotr P. Karwasz</name>
      <email>pkarwasz@apache.org</email>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>Europe/Warsaw</timezone>
    </developer>
    <developer>
      <id>vy</id>
      <name>Volkan Yazıcı</name>
      <email>vy@apache.org</email>
      <roles>
        <role>PMC Chair</role>
      </roles>
      <timezone>Europe/Amsterdam</timezone>
    </developer>
  </developers>
  <mailingLists>
    <mailingList>
      <name>log4j-user</name>
      <subscribe>log4j-user-subscribe@logging.apache.org</subscribe>
      <unsubscribe>log4j-user-unsubscribe@logging.apache.org</unsubscribe>
      <post>log4j-user@logging.apache.org</post>
      <archive>https://lists.apache.org/list.html?log4j-user@logging.apache.org</archive>
    </mailingList>
    <mailingList>
      <name>dev</name>
      <subscribe>dev-subscribe@logging.apache.org</subscribe>
      <unsubscribe>dev-unsubscribe@logging.apache.org</unsubscribe>
      <post>dev@logging.apache.org</post>
      <archive>https://lists.apache.org/list.html?dev@logging.apache.org</archive>
    </mailingList>
  </mailingLists>
  <scm>
    <connection>scm:git:git@github.com:apache/logging-parent.git</connection>
    <developerConnection>scm:git:git@github.com:apache/logging-parent.git</developerConnection>
    <url>https://github.com/apache/logging-parent</url>
  </scm>
  <issueManagement>
    <system>GitHub Issues</system>
    <url>https://github.com/apache/logging-parent/issues</url>
  </issueManagement>
  <ciManagement>
    <system>GitHub Actions</system>
    <url>https://github.com/apache/logging-parent/actions</url>
  </ciManagement>
  <properties>
    <maven.compiler.release>8</maven.compiler.release>
    <xml-maven-plugin.version>1.1.0</xml-maven-plugin.version>
    <spotbugs-annotations.version>4.7.3</spotbugs-annotations.version>
    <bnd-maven-plugin.version>6.4.0</bnd-maven-plugin.version>
    <bnd-extra-package-options></bnd-extra-package-options>
    <findsecbugs-plugin.version>1.12.0</findsecbugs-plugin.version>
    <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
    <osgi.annotation.version>8.1.0</osgi.annotation.version>
    <asciidoctor-maven-plugin.version>2.2.4</asciidoctor-maven-plugin.version>
    <osgi.annotation.bundle.version>2.0.0</osgi.annotation.bundle.version>
    <log4j-changelog-maven-plugin.version>0.4.0</log4j-changelog-maven-plugin.version>
    <bnd.annotation.version>6.4.1</bnd.annotation.version>
    <error-prone.version>2.22.0</error-prone.version>
    <minimalJavaBuildVersion>[17,18)</minimalJavaBuildVersion>
    <beanshell-maven-plugin.version>1.4</beanshell-maven-plugin.version>
    <maven.compiler.source>8</maven.compiler.source>
    <build-helper-maven-plugin.version>3.4.0</build-helper-maven-plugin.version>
    <maven-artifact-plugin.version>3.4.1</maven-artifact-plugin.version>
    <org.eclipse.jgit.version>6.7.0.202309050840-r</org.eclipse.jgit.version>
    <bnd-module-name>$[Bundle-SymbolicName]</bnd-module-name>
    <revision>10.1.1</revision>
    <spotbugs-maven-plugin.version>4.7.3.6</spotbugs-maven-plugin.version>
    <spotless-maven-plugin.version>2.40.0</spotless-maven-plugin.version>
    <maven.compiler.target>8</maven.compiler.target>
    <bnd-multi-release>false</bnd-multi-release>
    <bnd-extra-module-options></bnd-extra-module-options>
    <sign-maven-plugin.version>1.0.1</sign-maven-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>biz.aQute.bnd.annotation</artifactId>
        <version>${bnd.annotation.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-annotations</artifactId>
        <version>${spotbugs-annotations.version}</version>
      </dependency>
      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>osgi.annotation</artifactId>
        <version>${osgi.annotation.version}</version>
      </dependency>
      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.annotation.bundle</artifactId>
        <version>${osgi.annotation.bundle.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.asciidoctor</groupId>
          <artifactId>asciidoctor-maven-plugin</artifactId>
          <version>${asciidoctor-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <artifactId>maven-artifact-plugin</artifactId>
          <version>${maven-artifact-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>flatten-maven-plugin</artifactId>
          <version>${flatten-maven-plugin.version}</version>
          <configuration>
            <outputDirectory>${project.build.directory}</outputDirectory>
          </configuration>
        </plugin>
        <plugin>
          <groupId>com.github.spotbugs</groupId>
          <artifactId>spotbugs-maven-plugin</artifactId>
          <version>${spotbugs-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>xml-maven-plugin</artifactId>
          <version>${xml-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.diffplug.spotless</groupId>
          <artifactId>spotless-maven-plugin</artifactId>
          <version>${spotless-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.github.genthaler</groupId>
          <artifactId>beanshell-maven-plugin</artifactId>
          <version>${beanshell-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-changelog-maven-plugin</artifactId>
          <version>${log4j-changelog-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-maven-plugin</artifactId>
          <version>${bnd-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>build-helper-maven-plugin</artifactId>
          <version>${build-helper-maven-plugin.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>flatten-maven-plugin</artifactId>
        <version>${flatten-maven-plugin.version}</version>
        <executions>
          <execution>
            <id>flatten-revision</id>
            <phase>process-resources</phase>
            <goals>
              <goal>flatten</goal>
            </goals>
            <configuration>
              <updatePomFile>true</updatePomFile>
              <flattenMode>resolveCiFriendliesOnly</flattenMode>
            </configuration>
          </execution>
          <execution>
            <id>flatten-bom</id>
            <phase>none</phase>
            <goals>
              <goal>flatten</goal>
            </goals>
            <configuration>
              <flattenMode>bom</flattenMode>
              <pomElements>
                <properties>remove</properties>
                <repositories>remove</repositories>
                <distributionManagement>remove</distributionManagement>
                <dependencyManagement>interpolate</dependencyManagement>
              </pomElements>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>${maven.compiler.source}</source>
          <release>${maven.compiler.release}</release>
          <target>${maven.compiler.target}</target>
          <encoding>${project.build.sourceEncoding}</encoding>
          <parameters>true</parameters>
          <compilerArgs>
            <arg>-Xlint:all</arg>
            <arg>-XDcompilePolicy=simple</arg>
            <arg>-Xplugin:ErrorProne</arg>
          </compilerArgs>
          <annotationProcessorPaths>
            <path>
              <groupId>com.google.errorprone</groupId>
              <artifactId>error_prone_core</artifactId>
              <version>${error-prone.version}</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-enforcer-plugin</artifactId>
        <executions>
          <execution>
            <id>enforce-upper-bound-deps</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps />
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>default-spotbugs</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <plugins>
            <plugin>
              <groupId>com.h3xstream.findsecbugs</groupId>
              <artifactId>findsecbugs-plugin</artifactId>
              <version>${findsecbugs-plugin.version}</version>
            </plugin>
          </plugins>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <executions>
          <execution>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <consoleOutput>true</consoleOutput>
          <excludes>
            <exclude>.java-version</exclude>
            <exclude>.mvn/jvm.config</exclude>
            <exclude>**/*.txt</exclude>
            <exclude>src/changelog/**/*.xml</exclude>
            <exclude>.github/ISSUE_TEMPLATE/*.md</exclude>
            <exclude>.github/pull_request_template.md</exclude>
          </excludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>default-spotless</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <java>
            <licenseHeader>
              <content>/*
 * 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.
 */</content>
            </licenseHeader>
            <trimTrailingWhitespace />
            <endWithNewline />
            <removeUnusedImports />
            <indent>
              <spaces>true</spaces>
              <spacesPerTab>4</spacesPerTab>
            </indent>
            <importOrder>
              <order>java,javax,jakarta,,\#java,\#javax,\#jakarta,\#</order>
            </importOrder>
          </java>
          <pom>
            <licenseHeader>
              <content>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!--
  ~ 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.
  --></content>
              <delimiter>&lt;project</delimiter>
            </licenseHeader>
            <sortPom>
              <expandEmptyElements>false</expandEmptyElements>
              <spaceBeforeCloseEmptyElement>true</spaceBeforeCloseEmptyElement>
            </sortPom>
          </pom>
          <formats>
            <format>
              <includes>
                <include>src/**/*.xml</include>
              </includes>
              <excludes>
                <exclude>src/changelog/**/*.xml</exclude>
              </excludes>
              <licenseHeader>
                <content>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!--
  ~ 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.
  --></content>
                <delimiter>&lt;(!DOCTYPE|\w)</delimiter>
              </licenseHeader>
              <endWithNewline />
              <trimTrailingWhitespace />
            </format>
            <format>
              <includes>
                <include>src/**/*.properties</include>
              </includes>
              <licenseHeader>
                <content>#
# 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.
#</content>
                <delimiter>(##|[^#])</delimiter>
              </licenseHeader>
              <endWithNewline />
            </format>
          </formats>
          <yaml>
            <includes>
              <include>.asf.yaml</include>
              <include>.github/**/*.yaml</include>
              <include>.github/**/*.yml</include>
              <include>src/**/*.yaml</include>
              <include>src/**/*.yml</include>
            </includes>
            <licenseHeader>
              <content>#
# 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.
#</content>
              <delimiter>(##|[^#])</delimiter>
            </licenseHeader>
            <endWithNewline />
            <trimTrailingWhitespace />
          </yaml>
          <lineEndings>UNIX</lineEndings>
        </configuration>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-maven-plugin</artifactId>
        <extensions>true</extensions>
        <executions>
          <execution>
            <id>default-jar</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <bnd># `Bundle-DocURL` uses `project.url`.
                # This is set to `${project.parent.url}${project.artifactId}` through Maven's inheritance assembly[1].
                # This eventually produces incorrect values.
                # Hence, we remove them from the produced descriptor.
                #
                # `Bundle-SCM` uses `project.scm.url` and suffers from the same inheritance problem `Bundle-DocURL` has.
                #
                # [1] https://maven.apache.org/ref/3.9.4/maven-model-builder/#inheritance-assembly
                #     Inheritance assembly can be disabled for certain properties, e.g., `project.url`.
                #     Though this would necessitate changes in the root `pom.xml`s of parented projects.
                #
                # `Bundle-Developers` is removed, since it is nothing but noise and occupies quite some real estate.
                -removeheaders: Bundle-DocURL,Bundle-SCM,Bundle-Developers

                # Create OSGi and JPMS module names based on the `groupId` and `artifactId`.
                # This almost agrees with `maven-bundle-plugin`, but replaces non-alphanumeric characters
                # with full stops `.`.
                Bundle-SymbolicName: $[project.groupId].$[subst;$[subst;$[project.artifactId];log4j-];[^A-Za-z0-9];.]
                -jpms-module-info: $[bnd-module-name];access=0

                # Prevents an execution error in multi-release jars:
                -fixupmessages: "Classes found in the wrong directory";restrict:=error;is:=warning

                # 1. OSGI modules do not make sense in JPMS
                # 2. BND has a problem detecting the name of multi-release JPMS modules
                -jpms-module-info-options: org.osgi.core;static=true;transitive=false,\
                  org.osgi.framework;static=true;transitive=false,\
                  org.apache.logging.log4j;substitute="log4j-api",\
                  org.apache.logging.log4j.core;substitute="log4j-core",\
                  $[bnd-extra-module-options]

                # Import all packages by default:
                Import-Package: $[bnd-extra-package-options],*

                # Allow each project to override the `Multi-Release` header:
                Multi-Release: $[bnd-multi-release]

                # Add manifests and modules for each multi-release version:
                -jpms-multi-release: $[bnd-multi-release]</bnd>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <profiles>
    <profile>
      <id>changelog-validate</id>
      <activation>
        <file>
          <exists>src/changelog</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xml-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>validate-changelog</id>
                <goals>
                  <goal>validate</goal>
                </goals>
                <configuration>
                  <skip>true</skip>
                  <validationSets>
                    <validationSet>
                      <dir>src/changelog</dir>
                      <includes>**/*.xml</includes>
                      <publicId>http://logging.apache.org/log4j/changelog</publicId>
                      <systemId>https://logging.apache.org/log4j/changelog-0.1.1.xsd</systemId>
                      <validating>true</validating>
                    </validationSet>
                  </validationSets>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>changelog-export</id>
      <activation>
        <file>
          <exists>src/changelog</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-changelog-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>export-changelog</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>export</goal>
                </goals>
                <configuration>
                  <outputDirectory>src/site</outputDirectory>
                  <indexTemplates>
                    <template>
                      <source>.index.adoc.ftl</source>
                      <target>_release-notes.adoc</target>
                    </template>
                  </indexTemplates>
                  <changelogTemplates>
                    <template>
                      <source>.release-notes.adoc.ftl</source>
                      <target>_release-notes/_%v.adoc</target>
                    </template>
                  </changelogTemplates>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>changelog-release</id>
      <build>
        <defaultGoal>log4j-changelog:release generate-sources</defaultGoal>
        <plugins>
          <plugin>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-changelog-maven-plugin</artifactId>
            <version>${log4j-changelog-maven-plugin.version}</version>
            <configuration>
              <releaseVersion>${project.version}</releaseVersion>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>distribution</id>
      <build>
        <defaultGoal>enforcer:enforce bsh:run</defaultGoal>
        <plugins>
          <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <configuration>
              <rules>
                <requireProperty>
                  <property>attachmentFilepathPattern</property>
                  <message>You must set an `attachmentFilepathPattern` property for the regex pattern matched against the full filepath for determining attachments to be included in the distribution!</message>
                </requireProperty>
                <requireProperty>
                  <property>attachmentCount</property>
                  <message>You must set an `attachmentCount` property for the number of attachments expected to be found!</message>
                </requireProperty>
              </rules>
              <fail>true</fail>
            </configuration>
          </plugin>
          <plugin>
            <groupId>com.github.genthaler</groupId>
            <artifactId>beanshell-maven-plugin</artifactId>
            <dependencies>
              <dependency>
                <groupId>org.eclipse.jgit</groupId>
                <artifactId>org.eclipse.jgit</artifactId>
                <version>${org.eclipse.jgit.version}</version>
              </dependency>
            </dependencies>
            <configuration>
              <script>import java.io.*;
                import java.nio.file.*;
                import java.util.*;
                import java.util.function.*;
                import java.util.stream.*;
                import java.util.zip.*;

                import org.eclipse.jgit.dircache.*;
                import org.eclipse.jgit.lib.Repository;
                import org.eclipse.jgit.storage.file.FileRepositoryBuilder;

                long timestampMillis = java.time.Instant.parse("${project.build.outputTimestamp}").toEpochMilli();
                zip(String zipFileName, Map pathByFile) {
                    OutputStream outputStream = new FileOutputStream(zipFileName);
                    ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
                    try {
                        for (String file : pathByFile.keySet()) {
                            Path path = pathByFile.get(file);
                            ZipEntry zipEntry = new ZipEntry(file);
                            zipEntry.setTime(timestampMillis);
                            zipOutputStream.putNextEntry(zipEntry);
                            zipOutputStream.write(Files.readAllBytes(path));
                            zipOutputStream.closeEntry();
                        }
                    } catch (Exception error) {
                        // Supplement diagnostics
                        error.printStackTrace(System.err);
                        throw error;
                    } finally {
                        zipOutputStream.close();
                    }
                }

                // Find Git-tracked files
                SortedMap pathByFile = new TreeMap();
                Repository repo = new FileRepositoryBuilder().readEnvironment().findGitDir().build();
                DirCache repoCache = repo.readDirCache();
                String repoDirectoryParent = repo.getDirectory().getParent();
                for (int repoCacheEntryIndex = 0; repoCacheEntryIndex &lt; repoCache.getEntryCount(); repoCacheEntryIndex++) {
                    DirCacheEntry repoCacheEntry = repoCache.getEntry(repoCacheEntryIndex);
                    String repoCacheEntryPath = repoCacheEntry.getPathString();
                    pathByFile.put(repoCacheEntryPath, new File(repoDirectoryParent, repoCacheEntryPath).toPath());
                }

                // Create the source distribution using Git-tracked files
                zip("target/src.zip", pathByFile);
                System.out.format("Generated the source distribution (`src.zip`) containing %d files.%n", new Object[]{pathByFile.size()});

                // Short-circuit if there is no binary distribution expected
                if (${attachmentCount} == 0) {
                    return;
                }

                // Find auxiliary files that will go into the binary distribution
                SortedMap pathByFile = new TreeMap();
                pathByFile.put("RELEASE-NOTES.adoc", new File("src/site/_release-notes/_${project.version}.adoc").toPath());
                pathByFile.put("README.adoc", new File("README.adoc").toPath());
                pathByFile.put("NOTICE.txt", new File("NOTICE.txt").toPath());
                pathByFile.put("LICENSE.txt", new File("LICENSE.txt").toPath());

                // Find attachments that will go into the binary distribution
                String attachmentFilepathPattern = "${attachmentFilepathPattern}";
                System.out.format("Locating attachments matching the provided pattern: `%s`%n", new Object[] {attachmentFilepathPattern});
                SortedMap attachmentPathByFile = new TreeMap();
                Stream paths = Files.walk(new File(repoDirectoryParent).toPath(), 8, /* required for BSH method resolution: */ new FileVisitOption[0]);
                try {
                    paths.forEach(new Consumer() {
                        public void accept(Path path) {
                            if (Files.isRegularFile(path, /* required for BSH method resolution: */ new LinkOption[0]) &amp;&amp;
                                    path.toAbsolutePath().toString().matches(attachmentFilepathPattern)) {
                                attachmentPathByFile.put(path.getFileName().toString(), path);
                            }
                        }
                    });
                } catch (Exception error) {
                    // Supplement diagnostics
                    error.printStackTrace(System.err);
                    throw error;
                } finally {
                    paths.close();
                }

                // Check if no attachments were found
                if (${attachmentCount} != attachmentPathByFile.size()) {
                    System.err.println("Attachments:");
                    int[] i = {0};
                    attachmentPathByFile.values().forEach(new Consumer() {
                        public void accept(Path path) {
                            System.err.format("  [%2d] %s%n", new Object[]{++i[0], path});
                        }
                    });
                    System.err.format(
                            "Error: Was expecting %d attachments, found %d!%n",
                            new Object[]{${attachmentCount}, attachmentPathByFile.size()});
                    System.err.println("Tip: Have you already executed the Maven `package` goal?");
                    System.exit(1);
                }

                // Create the binary distribution
                pathByFile.putAll(attachmentPathByFile);
                zip("target/bin.zip", pathByFile);
                System.out.format("Generated the binary distribution (`bin.zip`) containing following %d files:%n", new Object[] {pathByFile.size()});
                for (String file : pathByFile.keySet()) {
                    System.out.println("-> " + file);
                }</script>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>deploy</id>
      <build>
        <defaultGoal>deploy</defaultGoal>
        <plugins>
          <plugin>
            <groupId>org.simplify4u.plugins</groupId>
            <artifactId>sign-maven-plugin</artifactId>
            <version>${sign-maven-plugin.version}</version>
            <executions>
              <execution>
                <goals>
                  <goal>sign</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <properties>
        <spotbugs.skip>true</spotbugs.skip>
        <installAtEnd>true</installAtEnd>
        <deployAtEnd>true</deployAtEnd>
        <skipTests>true</skipTests>
        <spotless.check.skip>true</spotless.check.skip>
      </properties>
    </profile>
    <profile>
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
              <execution>
                <id>enforce-no-snapshots</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <requireReleaseDeps>
                      <message>SNAPSHOT dependencies are not allowed for releases</message>
                      <onlyWhenRelease>true</onlyWhenRelease>
                    </requireReleaseDeps>
                    <requireReleaseVersion>
                      <message>A release cannot be a SNAPSHOT version</message>
                    </requireReleaseVersion>
                  </rules>
                  <fail>true</fail>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>constants-tmpl-adoc</id>
      <activation>
        <file>
          <exists>src/site/_constants.tmpl.adoc</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>parse-version</id>
                <phase>validate</phase>
                <goals>
                  <goal>parse-version</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <id>copy-constants-adoc</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>run</goal>
                </goals>
                <configuration>
                  <target>
                    <copy tofile="${project.build.directory}/constants-adoc/_constants.adoc" overwrite="true" verbose="true">
                      <fileset file="src/site/_constants.tmpl.adoc" />
                    </copy>
                  </target>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
              <execution>
                <id>filter-constants-adoc</id>
                <phase>process-sources</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <outputDirectory>src/site</outputDirectory>
                  <resources>
                    <resource>
                      <directory>${project.build.directory}/constants-adoc</directory>
                      <filtering>true</filtering>
                    </resource>
                  </resources>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>asciidoc</id>
      <activation>
        <file>
          <exists>src/site</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.asciidoctor</groupId>
            <artifactId>asciidoctor-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>export-asciidoc-to-html</id>
                <phase>site</phase>
                <goals>
                  <goal>process-asciidoc</goal>
                </goals>
                <configuration>
                  <sourceDirectory>src/site</sourceDirectory>
                  <outputDirectory>${project.build.directory}/site</outputDirectory>
                  <preserveDirectories>true</preserveDirectories>
                  <attributes>
                    <source-highlighter>coderay</source-highlighter>
                    <toc>left</toc>
                    <icons>font</icons>
                  </attributes>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <properties>
        <asciidoctor-maven-plugin.version>2.2.4</asciidoctor-maven-plugin.version>
        <maven.site.skip>true</maven.site.skip>
        <maven.site.deploy.skip>true</maven.site.deploy.skip>
      </properties>
    </profile>
  </profiles>
</project>
