<!--
	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>BSFAnnotator</artifactId>
	<packaging>jar</packaging>
	<version>${uimaj-release-version}</version>
	<name>Apache UIMA Java Annotator - BSFAnnotator</name>
	<url>http://incubator.apache.org/uima</url>
  
  <parent>
    <groupId>org.apache.uima</groupId>
    <artifactId>SandboxDistr</artifactId>
    <version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
    <relativePath>../SandboxDistr</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>
    
		<dependency>
			<groupId>bsf</groupId>
			<artifactId>bsf</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>org.beanshell</groupId>
			<artifactId>bsh</artifactId>
			<version>2.0b4</version>
		</dependency>
		<dependency>
			<groupId>rhino</groupId>
			<artifactId>js</artifactId>
			<version>1.6R7</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
      <!-- don't use 1.2.15 - google:
        Resolving log4j 1.2.15 dependency problems in Maven using exclusions -->
			<version>1.2.14</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging-api</artifactId>
			<version>1.0.4</version>
		</dependency>
	</dependencies>
  
	<build>
		<finalName>uimaj-an-bsf</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/annotator/bsf/types/*.java</exclude>
                  <exclude>src/test/resources/Nicknames.txt</exclude>
                  <exclude>src/test/resources/NicknamesRef.txt</exclude>
                  <exclude>src/test/resources/testdoc.txt</exclude>
                  <exclude>src/test/resources/testdocRef.txt</exclude>
                </excludes>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
	</build>
</project>
