<!--
	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.uima</groupId>
    <artifactId>parent-pom-annotator</artifactId>
    <version>1-SNAPSHOT</version>
    <relativePath/>
  </parent>
  
	<artifactId>WhitespaceTokenizer</artifactId>
	<packaging>jar</packaging>
	<version>2.3.1-SNAPSHOT</version>
  <name>UIMA Annotator: ${project.artifactId}</name>
  <description>A simple white-space annotator to identify Tokens in text using whitespace as the delimiters</description>
<url>${uimaWebsiteUrl}</url>

  <!-- Special inheritance note
       even though the <scm> element that follows is exactly the 
       same as those in super poms, it cannot be inherited because 
       there is some special code that computes the connection elements
       from the chain of parent poms, if this is omitted. 
       
       Keeping this a bit factored allows cutting/pasting the <scm>
       element, and just changing the following two properties -->  
  <scm>
    <connection>
      scm:svn:http://svn.apache.org/repos/asf/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </connection>
    <developerConnection>
      scm:svn:https://svn.apache.org/repos/asf/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </developerConnection>
    <url>
      http://svn.apache.org/viewvc/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </url>
  </scm>
  
  <properties>
    <uimaScmRoot>sandbox</uimaScmRoot>
    <uimaScmProject>${project.artifactId}</uimaScmProject>
    <uimaDependencyVersion>2.3.1-SNAPSHOT</uimaDependencyVersion>
    <pearMainDescriptor>desc/${project.artifactId}.xml</pearMainDescriptor>
  </properties>
  
	<dependencies>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-core</artifactId>
	    <version>${uimaDependencyVersion}</version>
      <scope>provided</scope>
  	</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-test-util</artifactId>
      <version>${uimaDependencyVersion}</version>
      <scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-component-test-util</artifactId>
      <version>${uimaDependencyVersion}</version>
      <scope>test</scope>
		</dependency>
	</dependencies>
  
	<build>
		<finalName>uima-an-wst</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              <excludes>
                <exclude>src/test/resources/tabs*.txt</exclude> <!-- test data -->
                <exclude>src/test/resources/testdoc*.txt</exclude> <!-- test data -->
              </excludes>              
            </configuration>
          </execution>
        </executions>
      </plugin>   
    </plugins>
        
	</build>
</project>
