<!--
  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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.apache.hivemall</groupId>
		<artifactId>hivemall</artifactId>
		<version>0.6.0-incubating-SNAPSHOT</version>
		<relativePath>../pom.xml</relativePath>
	</parent>

	<artifactId>hivemall-mixserv</artifactId>
	<name>Hivemall Mix Server</name>
	<packaging>jar</packaging>

	<properties>
		<main.basedir>${project.parent.basedir}</main.basedir>
	</properties>

	<dependencies>
		<!-- provided scope -->
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<scope>provided</scope>
			<exclusions>
				<exclusion>
					<artifactId>jdk.tools</artifactId>
					<groupId>jdk.tools</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-mapreduce-client-core</artifactId>
			<scope>provided</scope>
			<exclusions>
				<exclusion>
					<artifactId>jdk.tools</artifactId>
					<groupId>jdk.tools</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-exec</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.jdo</groupId>
			<artifactId>jdo2-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- compile scope -->
		<dependency>
			<groupId>org.apache.hivemall</groupId>
			<artifactId>hivemall-core</artifactId>
			<version>${project.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<!-- optionally provided for RUNTIME retention -->
			<groupId>com.google.code.findbugs</groupId>
			<artifactId>jsr305</artifactId>
			<version>1.3.9</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>commons-cli</groupId>
			<artifactId>commons-cli</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<!-- required for mixing -->
			<groupId>io.netty</groupId>
			<artifactId>netty-all</artifactId>
			<version>${netty.version}</version>
			<scope>compile</scope>
		</dependency>

		<!-- test scope -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-all</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- hivemall-mixserv-xx-fat.jar including all dependencies -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<executions>
					<execution>
						<id>jar-with-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<finalName>${project.artifactId}-${project.version}-fat</finalName>
							<outputDirectory>${project.parent.build.directory}</outputDirectory>
							<minimizeJar>true</minimizeJar>
							<createDependencyReducedPom>false</createDependencyReducedPom>
							<artifactSet>
								<includes>
									<include>org.apache.hivemall:hivemall-core</include>
									<include>commons-cli:commons-cli</include>
									<include>commons-logging:commons-logging</include>
									<include>log4j:log4j</include>
									<include>io.netty.netty-all</include>
								</includes>
							</artifactSet>
							<!-- maven-shade-plugin cannot handle the dependency of log4j because 
								commons-logging invokes log4j through Java reflection. 'filers' clauses avoid 
								this issue as described in the URL below http://stackoverflow.com/questions/8817257/minimize-an-uber-jar-correctly-using-shade-plugin -->
							<filters>
								<filter>
									<artifact>*:*</artifact>
									<excludes>
										<exclude>META-INF/LICENSE.txt</exclude>
										<exclude>META-INF/NOTICE.txt</exclude>
									</excludes>
								</filter>
								<filter>
									<artifact>commons-logging:commons-logging</artifact>
									<includes>
										<include>**</include>
									</includes>
								</filter>
								<filter>
									<artifact>log4j:log4j</artifact>
									<includes>
										<include>**</include>
									</includes>
								</filter>
							</filters>
							<transformers>
								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<manifestEntries>
										<Main-Class>hivemall.mix.server.MixServer</Main-Class>
										<Implementation-Title>${project.name}</Implementation-Title>
										<Implementation-Version>${project.version}</Implementation-Version>
										<Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
									</manifestEntries>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>
