<!--
	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>
  
	<groupId>org.apache.uima</groupId>
	<artifactId>SnowballAnnotator</artifactId>
	<packaging>jar</packaging>
	<version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
	<name>Apache UIMA Java Annotator - Snowball Annotator</name>
	<url>http://incubator.apache.org/uima</url>
  
  <parent>
    <groupId>org.apache.uima</groupId>
    <artifactId>SandboxDistr</artifactId>
    <version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
    <relativePath>../uimaj</relativePath>
  </parent>
  
	<dependencies>
    <!-- versions from parent -->
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-test-util</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-component-test-util</artifactId>
		</dependency>
	</dependencies>
  
	<build>
		<finalName>uima-an-snowball</finalName>
    <!-- add desc to test resources -->
		<testResources>
			<testResource>
				<directory>desc</directory>
			</testResource>
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>
		</testResources>
    
    <plugins>
      <!-- Release Audit Tool checks -->
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              <excludes>
                <exclude>src/main/java/org/tartarus/snowball/*.java</exclude> <!-- copied from Snowball source under license -->
                <exclude>src/main/java/org/tartarus/snowball/ext/*.java</exclude> <!-- copied from Snowball source under license -->
                <exclude>src/test/resources/englishRef.txt</exclude> <!-- test data -->
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>      
    </plugins>
	</build>
	
</project>
