<?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.opennlp</groupId>
		<artifactId>opennlp</artifactId>
		<version>1.8.1</version>
		<relativePath>../pom.xml</relativePath>
	</parent>

	<artifactId>opennlp-distr</artifactId>
	<packaging>pom</packaging>
	<name>Apache OpenNLP Distribution</name>

	<!--  Versions will automatically be updated by the release plugin -->
	<dependencies>
		<dependency>
			<groupId>org.apache.opennlp</groupId>
			<artifactId>opennlp-tools</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.opennlp</groupId>
			<artifactId>opennlp-uima</artifactId>
		</dependency>
		<dependency>
            <groupId>org.apache.opennlp</groupId>
            <artifactId>opennlp-morfologik-addon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.opennlp</groupId>
            <artifactId>opennlp-brat-annotator</artifactId>
        </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<executions>
					<execution>
						<id>bundle-project-sources</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
						<configuration>
							<descriptors>
								<descriptor>src/main/assembly/bin.xml</descriptor>
								<descriptor>src/main/assembly/src.xml</descriptor>
							</descriptors>
							<!-- Tar package is only compatible with gnu tar,
							     many file have more than 100 chars.
							     Right now only javadoc files are too long.
							 -->
							 <tarLongFileMode>posix</tarLongFileMode>
							 
							 <finalName>apache-opennlp-${project.version}</finalName>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin> 
	        <artifactId>maven-antrun-plugin</artifactId> 
	        <version>1.6</version> 
	        <executions> 
	          <execution> 
	            <id>generate checksums for binary artifacts</id> 
	            <goals><goal>run</goal></goals> 
	            <phase>verify</phase> 
	            <configuration> 
	              <target> 
	                <checksum algorithm="sha1" format="MD5SUM"> 
	                  <fileset dir="${project.build.directory}"> 
	                    <include name="*.zip" /> 
	                    <include name="*.gz" /> 
	                  </fileset> 
	                </checksum> 
	                <checksum algorithm="md5" format="MD5SUM"> 
	                  <fileset dir="${project.build.directory}"> 
	                    <include name="*.zip" /> 
	                    <include name="*.gz" /> 
	                  </fileset> 
	                </checksum> 
	              </target> 
	            </configuration> 
	          </execution> 
	        </executions> 
	      </plugin>
		</plugins>
	</build>
	
	<profiles>
    <profile>
      <id>apache-release</id>
      
      <build>
        <!-- Run jira report -->
        <!-- depends on having -DjiraVersion set -->
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-changes-plugin</artifactId>
			  <version>2.12.1</version>
            <executions>
              <execution>
              <id>default-cli</id>
              <phase>generate-resources</phase> 
              <goals><goal>jira-report</goal></goals>
                <configuration>
                  <onlyCurrentVersion>true</onlyCurrentVersion>
                  <outputDirectory>${basedir}/target/issuesFixed/</outputDirectory>
                  <maxEntries>1000</maxEntries> <!-- hopefully, bigger than ever needed -->
                </configuration>
              </execution>
            </executions>  
          </plugin>
        </plugins>     
      </build>
    </profile>
  </profiles> 
  
</project>
