<!--
	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>Tagger</artifactId>
	<version>2.3.1-SNAPSHOT</version>
  <name>UIMA Annotator: ${project.artifactId}</name>
  <description>An implementation of a Hidden Markov Model (HMM) statistical tagger</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/HmmTagger.xml</pearMainDescriptor>
    <bookNameRoot>hmmTaggerUsersGuide</bookNameRoot>
  </properties>
  
	<dependencies>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-core</artifactId>
      <version>2.3.1-SNAPSHOT</version>
      <scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-test-util</artifactId>
      <version>2.3.1-SNAPSHOT</version>
      <scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-component-test-util</artifactId>
      <version>2.3.1-SNAPSHOT</version>
      <scope>test</scope>
		</dependency>
    
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>WhitespaceTokenizer</artifactId>
			<version>2.3.1-SNAPSHOT</version>
   	</dependency>
	</dependencies>
  
  <build>
    <finalName>uima-an-tagger</finalName>
    
    <!-- don't use resources from normal spot, and
         use resources from proj/resources -->
    <resources>
      <resource>
        <directory>resources</directory>
      </resource>
    </resources>
    
    <!-- don't use test resources from normal spot, and
         use resources from proj/desc -->
    <testResources>
      <testResource>
        <directory>desc</directory>
      </testResource>
    </testResources>
    
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <argLine>-Xmx500M</argLine>
        </configuration>
      </plugin>  
      
      <!-- 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/test/resources/moby-tag-list.txt</exclude> <!-- test data -->
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>      
      
    </plugins>
  </build>
</project>

