<?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>
	<groupId>org.apache.jena</groupId>
	<artifactId>jena-jdbc</artifactId>
	<version>3.1.0</version>
	<packaging>pom</packaging>
	<name>Apache Jena - JDBC Parent</name>
	<description>This is the parent module for the Jena JDBC modules.  These modules provide JDBC Type 4 drivers for in-memory and TDB datasets as well as remote SPARQL endpoints.</description>

	<parent>
		<groupId>org.apache.jena</groupId>
		<artifactId>jena-parent</artifactId>
		<version>16</version>
		<relativePath>../jena-parent</relativePath>
	</parent>

	<!-- Need if the parent is a snapshot -->
	<repositories>
		<repository>
			<id>apache.snapshots</id>
			<name>Apache Snapshot Repository</name>
			<url>http://repository.apache.org/snapshots</url>
			<releases>
				<enabled>false</enabled>
			</releases>
		</repository>
	</repositories>

	<modules>
		<module>jena-jdbc-core</module>
		<module>jena-jdbc-driver-remote</module>
		<module>jena-jdbc-driver-tdb</module>
		<module>jena-jdbc-driver-mem</module>
		<module>jena-jdbc-driver-bundle</module>
	</modules>

	<properties>
		<plugin.license.version>1.9.0</plugin.license.version>
		<plugin.license.headerPath>${project.basedir}</plugin.license.headerPath>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.6.12</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- Compiler Plugin -->
			<plugin>
			  <groupId>org.apache.maven.plugins</groupId>
			  <artifactId>maven-compiler-plugin</artifactId>
			</plugin>
			<!-- License Plugin -->
			<plugin>
				<groupId>com.mycila.maven-license-plugin</groupId>
				<artifactId>maven-license-plugin</artifactId>
				<version>${plugin.license.version}</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<header>${plugin.license.headerPath}/license-header.txt</header>
					<failIfMissing>true</failIfMissing>
					<aggregate>true</aggregate>
					<excludes>
						<exclude>**/*.xml</exclude>
						<exclude>**/*.properties</exclude>
						<exclude>**/LICENSE</exclude>
						<exclude>**/NOTICE</exclude>
					</excludes>
					<useDefaultMapping>true</useDefaultMapping>
					<strictCheck>true</strictCheck>
				</configuration>
			</plugin>

			<!-- Sources Plugin -->
			<plugin>
				<artifactId>maven-source-plugin</artifactId>
				<version>2.1.1</version>
				<executions>
					<execution>
						<id>bundle-sources</id>
						<phase>package</phase>
						<goals>
							<!-- produce source artifact for main project sources -->
							<goal>jar-no-fork</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

			<!-- AspectJ Plugin - Used to support method entry and exit trace logging 
				for debugging purposes - ->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>aspectj-maven-plugin</artifactId>
				<version>1.4</version>
				<configuration>
					<source>1.7</source>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal> <!- - use this goal to weave all your main classes - ->
							<goal>test-compile</goal> <!- - use this goal to weave all your test classes - ->
						</goals>
					</execution>
				</executions>
				<dependencies>
					<!- - Ensure aspectj tools version used by compiler is the same version 
						used as dependency. Avoids warning. https://bugs.eclipse.org/bugs/show_bug.cgi?id=368190 - ->
					<dependency>
						<groupId>org.aspectj</groupId>
						<artifactId>aspectjtools</artifactId>
						<version>1.6.12</version>
					</dependency>
				</dependencies>
			</plugin>
        --> 
		</plugins>
	</build>
</project>