<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.apache.sling</groupId>
        <artifactId>sling</artifactId>
        <version>38</version>
        <relativePath />
    </parent>

    <artifactId>sling-archetype-parent</artifactId>
    <packaging>pom</packaging>
    <version>8-SNAPSHOT</version>

    <name>Apache Sling Archetype Parent</name>
    <description>The parent project for Apache Sling archetypes.</description>

    <properties>
        <!-- plugin versions to use in generated archetypes -->
        <bndplugin.version>5.0.1</bndplugin.version>
        <jarplugin.version>3.2.0</jarplugin.version>
        <compilerplugin.version>3.8.1</compilerplugin.version>
        <slingplugin.version>2.4.2</slingplugin.version>
        <launchpadplugin.version>2.3.2</launchpadplugin.version>
        <jarplugin.version>3.2.0</jarplugin.version>
        <warplugin.version>3.2.3</warplugin.version>
        <jettyplugin.version>6.1.23</jettyplugin.version>
        
        <!-- various properties which influence generated archetypes -->
        <archetype.java.version>11</archetype.java.version>
        
        <!-- dependency versions to use in generated archetypes -->
        <junit.version>4.12</junit.version>
        <slingapi.version>2.22.0</slingapi.version>
        <slf4japi.version>1.7.25</slf4japi.version>
        <versionannotations.version>1.1.0</versionannotations.version>
        <componentannotations.version>1.4.0</componentannotations.version>
        <metatypeannotations.version>1.4.0</metatypeannotations.version>
        
        <!-- define archetype tooling version in a central place -->
        <archetype.version>3.1.2</archetype.version>
        
    </properties>

    <scm>
        <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-archetype-parent.git</connection>
        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-archetype-parent.git</developerConnection>
        <url>https://gitbox.apache.org/repos/asf?p=sling-archetype-parent.git</url>
      <tag>HEAD</tag>
  </scm>
    
    <build>
        <resources>
            <resource>
                <!-- filter pom.xml -->
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/pom.xml</include>
                </includes>
            </resource>
            <!-- Don't filter anything else -->
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>**/pom.xml</exclude>
                </excludes>
            </resource>
        </resources>    
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <!-- 
                        allow defining un-filtered resources in the pom.xml
                        For example, the artifactId should not be escaped:
                        
                        <artifact>\${artifactId}</artifactId>
                     -->
                    <configuration>
                        <escapeString>\</escapeString>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-archetype-plugin</artifactId>
                    <version>${archetype.version}</version>
                    <extensions>true</extensions>
                    <!-- Verify archetype invocation was successful as part of the verify phase -->
                    <configuration>
                        <postBuildHookScript>verify.groovy</postBuildHookScript>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.rat</groupId>
                    <artifactId>apache-rat-plugin</artifactId>
                    <configuration>
                        <excludes>
                            <exclude>src/test/resources/projects/*/goal.txt</exclude>
                        </excludes>
                    </configuration>
                </plugin>                
            </plugins>
        </pluginManagement>
    </build>

</project>
