<?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>3-incubating</version>
	</parent>
	<groupId>org.apache.taverna.commandline</groupId>
	<artifactId>apache-taverna-commandline</artifactId>
	<version>3.1.1-incubating-SNAPSHOT</version>
	<packaging>pom</packaging>
	<name>Apache Taverna Command-line Tool</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</taverna.engine.version>
	    <taverna.commonactivities.version>2.1.0-incubating</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.1.0</taverna.commandline.osgiversion>
	    <!--OSGi runtime: Felix  -->
	    <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>
        <build>
                <plugins>
                      <plugin>
                        <groupId>org.apache.rat</groupId>
                        <artifactId>apache-rat-plugin</artifactId>
                        <configuration>
                                <excludes combine.children="append">
                                        <exclude>**/src/test/resources/workflows/</exclude> <!-- workflow files and expected inputs/outputs -->
                                        <exclude>**/src/main/resources/help.txt</exclude> <!-- shown verbatim in -h -->
                                </excludes>
                        </configuration>
                        </plugin>

            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <links>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-language/</link>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-osgi/</link>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-engine/</link>
                        <link>https://taverna.incubator.apache.org/javadoc/taverna-common-activities/</link>
                    </links>
                </configuration>
            </plugin>



                </plugins>
        </build>

  <scm>
    <connection>scm:git:https://gitbox.apache.org/repos/asf/incubator-taverna-commandline.git</connection>
    <developerConnection>scm:git:git@github.com:apache/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>https://repository.apache.org/snapshots</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
  </repositories>
</project>
