<!-- 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.aries</groupId>
		<artifactId>parent</artifactId>
		<version>2.0.1</version>
		<relativePath>../parent/pom.xml</relativePath>
	</parent>
	<groupId>org.apache.aries.tx-control</groupId>
	<artifactId>tx-control</artifactId>
	<version>0.0.1</version>
	<packaging>pom</packaging>
	<description>Transaction Control service, including Resource Provider implementations.</description>
	<scm>
		<connection>
			scm:svn:http://svn.apache.org/repos/asf/aries/tags/tx-control-0.0.1
		</connection>
		<developerConnection>
			scm:svn:https://svn.apache.org/repos/asf/aries/tags/tx-control-0.0.1
		</developerConnection>
		<url>
			http://svn.apache.org/viewvc/aries/tags/tx-control-0.0.1
		</url>
	</scm>

	<profiles>
		<profile>
			<id>jdk18</id>
			<activation>
				<jdk>1.8</jdk>
			</activation>
			<modules>
				<module>tx-control-api</module>
				<module>tx-control-service-common</module>
				<module>tx-control-service-local</module>
				<module>tx-control-service-xa</module>
				<module>tx-control-provider-jdbc-common</module>
				<module>tx-control-provider-jdbc-local</module>
				<module>tx-control-provider-jdbc-xa</module>
				<module>tx-control-provider-jpa-local</module>
				<module>tx-control-provider-jpa-xa</module>
				<module>tx-control-itests</module>
				<module>tx-control-jpa-itests</module>
			</modules>
		</profile>
	</profiles>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.aries.versioning</groupId>
				<artifactId>org.apache.aries.versioning.plugin</artifactId>
				<executions>
					<execution>
						<id>default-verify</id>
						<phase>verify</phase>
						<goals>
							<goal>version-check</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>3.0.1</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<configuration>
					<source>1.8</source>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>