<!--
	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>TikaAnnotator</artifactId>
	<packaging>jar</packaging>
	<version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
	<name>Apache UIMA TikaAnnotator</name>

  <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-document-annotation</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-core</artifactId>
      <version>0.4</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-parsers</artifactId>
      <version>0.4</version>
      <exclusions>
        <exclusion>
          <groupId>pdfbox</groupId>
          <artifactId>pdfbox</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  </dependencies>
  
	<build>
		<finalName>uima-an-tika</finalName>
    
    <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/apache/uima/tika/AttributeFS.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/AttributeFS_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/FeatureValue.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/FeatureValue_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/MarkupAnnotation.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/MarkupAnnotation_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/SourceDocumentAnnotation.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/SourceDocumentAnnotation_Type.java</exclude> <!-- generated -->
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>            
    </plugins>

	</build>
</project>