<!--

  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.uima</groupId>
    <artifactId>parent-pom</artifactId>
    <version>6</version>
    <relativePath/>
  </parent>

  <artifactId>uima-build-resources</artifactId>
  <version>6-SNAPSHOT</version>

  <name>Apache UIMA ${project.artifactId}</name>
  <description>This Jar contains resources
    referred to by maven coordinates,
    needed during building
  </description>

  <inceptionYear>2010</inceptionYear>

  <scm>
    <connection>
      scm:git:https://github.com/apache/uima-build-resources
    </connection>
    <developerConnection>
      scm:git:https://github.com/apache/uima-build-resources
    </developerConnection>
    <url>
      https://github.com/apache/uima-build-resources/tree/master
    </url>
  </scm>

  <properties>
    <jiraVersion>12321548</jiraVersion>
    <uimaWebsiteUrl>http://uima.apache.org</uimaWebsiteUrl>
    <uimaWebsiteDistributionUrl>scp://people.apache.org/www/uima.apache.org/</uimaWebsiteDistributionUrl>
  </properties>

  <build>
    <plugins>
      <!-- Call the Bundle goal for the remote-resources plugin -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>bundle</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>apache-release</id>
      <properties>
        <sourceReleaseAssemblyDescriptor>source-release</sourceReleaseAssemblyDescriptor>
      </properties>
      <build>
        <plugins>
          <!-- use "standard" source-release assembly -->
          <plugin>
            <artifactId>maven-changes-plugin</artifactId>
            <executions>
              <execution>
                <id>default-cli</id>
                <configuration>
                  <fixVersionIds>${jiraVersion}</fixVersionIds>
                  <sortColumnNames>Status, Key, Type</sortColumnNames>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>