<!--
	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>WhitespaceTokenizer</artifactId>
	<packaging>jar</packaging>
	<version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
	<name>Apache UIMA Java Annotator - WhitespaceTokenizer</name>

  <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>
  
	<dependencies>
		<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-wst</finalName>
    
    <!-- add the contents of desc to the jar.  
         This puts the WhitespaceTokenizer.xml file into the Jar
         and makes it easier for users to run this, without installing a pear. 
         The Tagger project uses this technique, for instance -->
    
    <!--resources>
      <resource>
        <directory>desc</directory>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources-->
    
    <!-- add desc to resources 
         test case for Tagger expects to find the desc on the classpath -->
		<testResources>
			<testResource>
				<directory>desc</directory>
			</testResource>
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>
		</testResources>

		<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/WhitespaceTokenizer.xml</mainComponentDesc> 
          </configuration>
        </execution></executions>
      </plugin>              
      
			<!--plugin>
				<groupId>org.apache.uima</groupId>
				<artifactId>PearPackagingMavenPlugin</artifactId>
				<extensions>true</extensions>
				<executions>
					<execution>
						<phase>package</phase>
						<configuration>
							<mainComponentDesc>
								desc/WhitespaceTokenizer.xml
							</mainComponentDesc>
							<componentId>
								WhitespaceTokenizer
							</componentId>
						</configuration>
						<goals>
							<goal>package</goal>
						</goals>
					</execution>
				</executions>
			</plugin-->
		</plugins>
	</build>
</project>
