<?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>

  <parent>
    <groupId>org.apache.helix.recipes</groupId>
    <artifactId>recipes</artifactId>
    <version>0.9.0.1</version>
  </parent>

  <artifactId>distributed-lock-manager</artifactId>
  <packaging>bundle</packaging>
  <name>Apache Helix :: Recipes :: distributed lock manager</name>

  <properties>
    <osgi.import>
      org.apache.helix*,
      org.slf4j*;version="[1.6,2)",
      *
    </osgi.import>
    <osgi.export>org.apache.helix.lockmanager*;version="${project.version};-noimport:=true</osgi.export>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.helix</groupId>
      <artifactId>helix-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.14</version>
      <classifier>sources</classifier>
      <exclusions>
        <exclusion>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
        </exclusion>
        <exclusion>
          <groupId>javax.jms</groupId>
          <artifactId>jms</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jdmk</groupId>
          <artifactId>jmxtools</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.sun.jmx</groupId>
          <artifactId>jmxri</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>appassembler-maven-plugin</artifactId>
          <configuration>
            <!-- Set the target configuration directory to be used in the bin scripts -->
            <!-- <configurationDirectory>conf</configurationDirectory> -->
            <!-- Copy the contents from "/src/main/config" to the target configuration
              directory in the assembled application -->
            <!-- <copyConfigurationDirectory>true</copyConfigurationDirectory> -->
            <!-- Include the target configuration directory in the beginning of
              the classpath declaration in the bin scripts -->
            <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
            <assembleDirectory>${project.build.directory}/${project.artifactId}-pkg</assembleDirectory>
            <!-- Extra JVM arguments that will be included in the bin scripts -->
            <extraJvmArguments>-Xms512m -Xmx512m</extraJvmArguments>
            <!-- Generate bin scripts for windows and unix pr default -->
            <platforms>
              <platform>windows</platform>
              <platform>unix</platform>
            </platforms>
          </configuration>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>assemble</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.rat</groupId>
          <artifactId>apache-rat-plugin</artifactId>
            <configuration>
              <excludes combine.children="append">
              </excludes>
            </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>appassembler-maven-plugin</artifactId>
        <configuration>
          <programs>
            <program>
              <mainClass>org.apache.helix.lockmanager.LockManagerDemo</mainClass>
              <name>lock-manager-demo</name>
            </program>
          </programs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
