<?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>4.6.1</version>
	</parent>
	<artifactId>jena-jdbc-driver-mem</artifactId>
	<name>Apache Jena - JDBC In-Memory Driver</name>
	<description>A Jena JDBC driver that uses an ARQ in-memory endpoint, intended primarily for testing purposes.</description>

	<properties>
		<plugin.license.headerPath>${project.parent.basedir}</plugin.license.headerPath>
		<automatic.module.name>org.apache.jena.jdbc.driver.mem</automatic.module.name>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-core</artifactId>
			<version>4.6.1</version>
		</dependency>

		<!-- Test Dependencies -->
		<dependency>
			<groupId>org.apache.jena</groupId>
			<artifactId>jena-jdbc-core</artifactId>
			<version>4.6.1</version>
			<classifier>tests</classifier>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>test-jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

			<!-- Javadoc Plugin -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<configuration>
          
          <!-- Compensate for java11 issues; remove at java17 -->
          <source>8</source>

					<quiet>true</quiet>
					<encoding>UTF-8</encoding>
					<charset>UTF-8</charset>
					<docencoding>UTF-8</docencoding>
				</configuration>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<!-- Produce Javadoc JARs for each module -->
							<goal>jar</goal>
							<goal>test-jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
