<?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>

  <groupId>org.apache.maven.its.it0012</groupId>
  <artifactId>maven-it-it0012</artifactId>
  <version>3.8.1</version>
  <packaging>pom</packaging>

  <name>Maven Integration Test :: it0012</name> 
  <description>Test simple POM interpolation</description>

  <properties>
    <test>
POM content (available with 3 prefixes):
  project.version: ${project.version}
  pom.version: ${pom.version}
  version: ${version}

basedir (available with 2 prefixes):
  basedir: ${basedir}
  project.basedir: ${project.basedir}
  pom.basedir: ${pom.basedir}

baseUri (available with 2 prefixes):
  project.baseUri: ${project.baseUri}
  pom.baseUri: ${pom.baseUri}

build.timestamp (only if build start time defined):
  build.timestamp: ${build.timestamp}
  maven.build.timestamp: ${maven.build.timestamp}
  project.build.timestamp: ${project.build.timestamp}

model properties:
  any.property: ${any.property}

Java system properties:
  user.dir: ${user.dir}
  java.home: ${java.home}

environment properties (available with 2 prefixes):
  env.PATH: ${env.PATH}
  PATH: ${PATH}

Not replaced:
  baseUri (not supported): ${baseUri}
  any.undefined.property: ${any.undefined.property}
  settings.localRepository: ${settings.localRepository} (only replaced during parameter expression evaluation)
    </test>
    <any.property>any value</any.property>
  </properties>

  <modules>
    <module>child-project</module>
  </modules>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-it-plugin-touch</artifactId>
        <groupId>org.apache.maven.its.plugins</groupId>
        <version>2.1-SNAPSHOT</version>
        <configuration>
          <pluginFile>touch-${project.version}.txt</pluginFile>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
