<?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>
	<groupId>org.apache.uima</groupId>
	<artifactId>Lucas</artifactId>
	<name>Apache UIMA Lucene CAS Indexer</name>
	<version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
	<description>Writes information contained in CAS objects to fields of a Lucene search index; mapping is done in a mapping file.</description>
  
  <parent>
    <groupId>org.apache.uima</groupId>
    <artifactId>SandboxDistr-pearBuilder</artifactId>
    <version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
    <relativePath>../SandboxDistr/pear-builder-pom</relativePath>
  </parent>
  
	<build>
    <plugins>
      
      <!-- build pear plugin, most settings inherited from parent POM -->      
      <plugin>
        <groupId>org.apache.uima</groupId>
        <artifactId>PearPackagingMavenPlugin</artifactId>
        <executions><execution>
          <id>buildPear</id>
          <configuration>
            <mainComponentDesc>desc/LuceneCASIndexer.xml</mainComponentDesc> 
          </configuration>
        </execution></executions>
      </plugin>              
    
      
      <!--plugin>
        <groupId>org.apache.uima</groupId>
        <artifactId>PearPackagingMavenPlugin</artifactId>
        <extensions>true</extensions>
        <executions>
          <execution>
            <phase>package</phase>
            <configuration>
              <classpath>
                $main_root/lib/google-collections-0.9.jar;$main_root/lib/log4j-1.2.14.jar;$main_root/lib/lucene-core-2.4.1.jar;$main_root/lib/lucene-snowball-2.4.1.jar
              </classpath>
  
              <mainComponentDesc>
                desc/${componentId}.xml
              </mainComponentDesc>
  
              <componentId>
                ${componentId}
              </componentId>
            </configuration>
            <goals>
              <goal>package</goal>
            </goals>
          </execution>
        </executions>
      </plugin-->
      
      <!-- disable some tests -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>**/TestableLuceneCASIndexer.java</exclude>
          </excludes>
        </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>docs/html/images/*.svg</exclude> <!-- generated image files for docbook -->
                <exclude>src/test/java/org/apache/uima/lucas/indexer/types/test/*.java</exclude> <!-- generated -->
                <exclude>src/test/resources/hypernyms.txt</exclude> <!-- test data -->
                <exclude>src/test/resources/stopwords.txt</exclude> <!-- test data -->
                <exclude>src/test/resources/tokenMapping.txt</exclude> <!-- test data -->
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>
      
    </plugins>
	</build>
  
	<properties>
		<componentId>LuceneCASIndexer</componentId>
	</properties>
 
	<dependencies>
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>2.4.1</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
      <!-- 1.2.15 has problems -->
			<version>1.2.14</version>
		</dependency>
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-snowball</artifactId>
			<version>2.4.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.easymock</groupId>
			<artifactId>easymockclassextension</artifactId>
			<version>2.4</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.4</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.google.collections</groupId>
			<artifactId>google-collections</artifactId>
			<version>0.9</version>
		</dependency>
	</dependencies>
</project>