<?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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.apache.jena</groupId>
		<artifactId>jena-jdbc</artifactId>
		<version>3.11.0</version>
	</parent>
	<artifactId>jena-jdbc-driver-bundle</artifactId>
	<name>Apache Jena - JDBC Driver Bundle</name>
	<description>An artifact which bundles up the standard Jena JDBC drivers into a single shaded JAR file to provide a convenience dependency</description>

	<properties>
		<plugin.license.headerPath>${project.parent.basedir}</plugin.license.headerPath>
		<!-- Note that we actually skip tests in this module because this module 
			simply bundles up the other modules BUT it contains a JUnit suite primarily 
			as a convenience for being able to perform code coverage analysis easily 
			on all the modules. This is essentially a compromise to work around the Eclipse 
			EMMA plugin having limited configurability and making it otherwise impossible 
			to easily analyse code coverage on a multi-module project short of running 
			the Emma plugin on your Jenkins server, however doing that loses the visual 
			benefit of being able to see in Eclipse what code is and isn't covered -->
		<skipTests>true</skipTests>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-mem</artifactId>
			<version>3.11.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>3.11.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>3.11.0</version>
		</dependency>

		<!-- Test Dependencies -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-mem</artifactId>
			<version>3.11.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-remote</artifactId>
			<version>3.11.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-driver-tdb</artifactId>
			<version>3.11.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-core</artifactId>
			<version>3.11.0</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-fuseki-main</artifactId>
			<version>3.11.0</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- Shade Plugin -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>2.1</version>
				<configuration>
					<transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
						<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
						<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
							<addHeader>false</addHeader>
						</transformer>
					</transformers>
					<createDependencyReducedPom>false</createDependencyReducedPom>
				</configuration>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

			<!-- Javadoc Plugin -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<configuration>
					<quiet>true</quiet>
					<encoding>UTF-8</encoding>
					<charset>UTF-8</charset>
					<docencoding>UTF-8</docencoding>

					<additionalDependencies>
						<additionalDependency>
							<groupId>log4j</groupId>
							<artifactId>log4j</artifactId>
							<version>${ver.log4j}</version>
						</additionalDependency>
					</additionalDependencies>
					<!-- Include only JDBC dependencies -->
					<includeDependencySources>true</includeDependencySources>
					<includeTransitiveDependencySources>true</includeTransitiveDependencySources>
					<dependencySourceIncludes>
						<dependencySourceInclude>org.apache.jena:jena-jdbc*</dependencySourceInclude>
					</dependencySourceIncludes>

					<groups>
						<group>
							<title>JDBC Core</title>
							<packages>org.apache.jena.jdbc*</packages>
						</group>
						<group>
							<title>In-Memory Driver</title>
							<packages>org.apache.jena.jdbc.mem*</packages>
						</group>
						<group>
							<title>TDB Driver</title>
							<packages>org.apache.jena.jdbc.tdb*</packages>
						</group>
						<group>
							<title>Remote Endpoint Driver</title>
							<packages>org.apache.jena.jdbc.remote*</packages>
						</group>
					</groups>
				</configuration>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
