<!--

    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.taverna</groupId>
		<artifactId>apache-taverna-parent</artifactId>
		<version>2-incubating-SNAPSHOT</version>
	</parent>
	<groupId>org.apache.taverna.osgi</groupId>
	<artifactId>apache-taverna-osgi</artifactId>
	<version>0.2.1-incubating-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Apache Taverna OSGi plugin system</name>
	<description>OSGi-based plugin system, including
online updates. Written for Apache Taverna,
probably usable for any OSGi-based
command line/desktop product.</description>
	<scm>
		<connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-osgi.git</connection>
		<developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-osgi.git</developerConnection>
		<url>https://github.com/apache/incubator-taverna-osgi</url>
		<tag>HEAD</tag>
	</scm>
	<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>xml-parser-service</module>
		<module>xml-transformer-service</module>
		<module>taverna-osgi-launcher</module>
		<module>taverna-app-configuration-api</module>
		<module>taverna-app-configuration-impl</module>
		<module>taverna-configuration-api</module>
		<module>taverna-configuration-impl</module>
		<module>taverna-download-api</module>
		<module>taverna-download-impl</module>
		<module>taverna-maven-plugin</module>
		<module>taverna-plugin-api</module>
		<module>taverna-plugin-impl</module>
		<module>taverna-update-api</module>
		<module>taverna-update-impl</module>
		<module>taverna-osgi-schemas</module>
	</modules>
</project>
