<?xml version="1.0"?>
<!--
   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/maven-v4_0_0.xsd">
  <parent>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-parent</artifactId>
    <version>52</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>commons-daemon</groupId>
  <artifactId>commons-daemon</artifactId>
  <version>1.3.0</version>
  <name>Apache Commons Daemon</name>
  <!-- Daemon started in Commons in 2002 with an import of code from Tomcat,
       which is why the NOTICE file has an earlier date than the inceptionYear -->
  <inceptionYear>2002</inceptionYear>
  <description>
    Apache Commons Daemon software is a set of utilities and Java support
    classes for running Java applications as server processes. These are
    commonly known as 'daemon' processes in Unix terminology (hence the
    name). On Windows they are called 'services'.
  </description>
  <url>https://commons.apache.org/proper/commons-daemon/</url>

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

  <scm>
    <connection>scm:git:https://gitbox.apache.org/repos/asf/commons-daemon.git</connection>
    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/commons-daemon.git</developerConnection>
    <url>https://gitbox.apache.org/repos/asf?p=commons-daemon.git</url>
  </scm>

  <developers>
    <developer>
      <name>Jean-Frederic Clere</name>
      <id>jfclere</id>
      <email>jfclere at apache.org</email>
    </developer>

    <developer>
      <name>Remy Maucherat</name>
      <id>remm</id>
      <email>remm at apache.org</email>
    </developer>

    <developer>
      <name>Yoav Shapira</name>
      <id>yoavs</id>
      <email>yoavs at apache.org</email>
    </developer>

    <developer>
      <name>Bill Barker</name>
      <id>billbarker</id>
      <email>billbarker at apache.org</email>
    </developer>
    <developer>
      <name>Mladen Turk</name>
      <id>mturk</id>
      <email>mturk at apache.org</email>
    </developer>

    <developer>
      <name>Pier Fumagalli</name>
      <id>pier</id>
      <email>pier at apache.org</email>
    </developer>
  </developers>

  <contributors>
    <contributor>
      <name>Nick Griffiths</name>
      <email>nicobrevin@gmail.com</email>
    </contributor>
  </contributors>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <properties>
    <!-- Apache Commons Daemon is used by Apache Tomcat. The oldest currently
         supported Tomcat version is Tomcat 8 which has a minimum Java version
         of Java 7. It is therefore advisable to check with the Apache Tomcat
         community before increasing these values. -->
    <animal-sniffer.signature>java17</animal-sniffer.signature>
    <commons.daemon.javaversion>1.7</commons.daemon.javaversion>
    <maven.compiler.source>${commons.daemon.javaversion}</maven.compiler.source>
    <maven.compiler.target>${commons.daemon.javaversion}</maven.compiler.target>
    <commons.componentid>daemon</commons.componentid>
    <commons.module.name>org.apache.commons.daemon</commons.module.name>
    <commons.release.version>1.3.0</commons.release.version>
    <commons.rc.version>RC1</commons.rc.version>
    <commons.bc.version>1.2.4</commons.bc.version>
    <commons.jira.id>DAEMON</commons.jira.id>
    <commons.jira.pid>12310468</commons.jira.pid>
    <commons.jacoco.version>0.8.7</commons.jacoco.version>
    <commons.japicmp.version>0.15.4</commons.japicmp.version>
    <commons.spotbugs.version>4.5.3.0</commons.spotbugs.version>
  </properties>

  <build>
  <defaultGoal>clean verify apache-rat:check japicmp:cmp javadoc:javadoc</defaultGoal>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
          <configuration>
            <excludes>
              <!-- Free Software (see header) -->
              <exclude>src/native/unix/configure</exclude>
              <!-- GPL with applicable exception that allows ALv2 -->
              <exclude>src/native/unix/support/config.guess</exclude>
              <exclude>src/native/unix/support/config.sub</exclude>
              <!-- Files created by Configure -->
              <!-- Excluded from Git but may be present locally -->
              <exclude>src/native/unix/config.nice</exclude>
              <exclude>src/native/unix/config.status</exclude>
              <exclude>src/native/unix/config.log</exclude>
            </excludes>
          </configuration>
        </plugin>
        <plugin>
          <groupId>com.github.spotbugs</groupId>
          <artifactId>spotbugs-maven-plugin</artifactId>
          <version>${commons.spotbugs.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>src/assembly/native-src.xml</descriptor>
            <descriptor>src/assembly/bin.xml</descriptor>
            <descriptor>src/assembly/src.xml</descriptor>
            <descriptor>src/assembly/win.xml</descriptor>
          </descriptors>
          <tarLongFileMode>gnu</tarLongFileMode>
        </configuration>
      </plugin>
      <!-- Force detach-distributions to execute *after* Nexus deploy -->
      <!-- we want these distributions deployed to both Nexus and dist.a.o -->
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-release-plugin</artifactId>
        <executions>
          <execution>
            <id>detatch-distributions</id>
            <phase>deploy</phase>
            <goals>
              <goal>detach-distributions</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <profiles>
    <profile>
      <id>jdk12-plus-no-java6</id>
      <activation>
        <jdk>[1.12,)</jdk>
      </activation>
      <properties>
        <commons.daemon.javaversion>1.7</commons.daemon.javaversion>
      </properties>
    </profile>
  </profiles>
</project>
