<!--

    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>5</version>
    <relativePath>../parent-pom</relativePath>
  </parent>
  
  <artifactId>uima-build-resources</artifactId>
  <version>5</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:svn:http://svn.apache.org/repos/asf/uima/build/tags/parent-pom-5-rc1/uima-build-resources
    </connection>
    <developerConnection>
      scm:svn:https://svn.apache.org/repos/asf/uima/build/tags/parent-pom-5-rc1/uima-build-resources
    </developerConnection>
    <url>
      http://svn.apache.org/viewvc/uima/build/tags/parent-pom-5-rc1/uima-build-resources
    </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>