<?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.taverna</groupId>
		<artifactId>apache-taverna-parent</artifactId>
		<version>2-incubating</version>
	</parent>
	<groupId>org.apache.taverna.commandline</groupId>
	<artifactId>apache-taverna-commandline</artifactId>
	<version>3.1.0-incubating-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Apache Taverna Commandline</name>
	  <properties>
	    <taverna.language.version>0.15.1-incubating</taverna.language.version>
	    <taverna.osgi.version>0.2.1-incubating</taverna.osgi.version>
	    <taverna.engine.version>3.1.0-incubating-SNAPSHOT</taverna.engine.version>
	    <taverna.commonactivities.version>2.1.0-incubating-SNAPSHOT</taverna.commonactivities.version>

            <!-- 
            Update below version number to match the <version> above.

            This osgiversion is required for passing the parsed
            org.apache.taverna.commandline.options.CommandLineOptions
            from the taverna-commandline-launcher (running outside OSGi)
            to taverna-commandline-common (running inside OSGi)
            and therefore must be a falid x.y.z.0 OSGi version number
            corresponding to the ${pom.version} - but without -SNAPSHOT
            or -incubating
            -->
            <taverna.commandline.osgiversion>3.1.0.0</taverna.commandline.osgiversion>
            <commons.cli.version>1.3.1</commons.cli.version>
	    <osgi.felix.version>4.6.1</osgi.felix.version>
	  </properties>
	<modules>
    <module>taverna-commandline-api</module>
    <module>taverna-commandline-common</module>
    <module>taverna-commandline-launcher</module>
    <module>taverna-commandline-product</module>
    <!--
    <module>taverna-commandline-tests</module>
    -->
  </modules>
  <scm>
    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-commandline.git</connection>
    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-taverna-commandline.git</developerConnection>
    <url>https://github.com/apache/incubator-taverna-commandline</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>
</project>
