##    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.
##
## Note: Above Velocity comment should NOT be included in generated
## pom.xml from the archetype
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>\${groupId}</groupId>
		<artifactId>\${rootArtifactId}</artifactId>
		<version>\${version}</version>
	</parent>
	<artifactId>\${artifactId}</artifactId>
	<packaging>taverna-plugin</packaging>
	<name>\${classPrefix} Taverna plugin</name>
	<description>Description of Example Taverna plugin</description>
	<dependencies>
		<dependency>
			<groupId>\${project.groupId}</groupId>
			<artifactId>\${rootArtifactId}-activity</artifactId>
			<version>\${version}</version>
		</dependency>
		<!-- Enable for Workbench integration
		<dependency>
			<groupId>\${project.groupId}</groupId>
			<artifactId>\${rootArtifactId}-activity-ui</artifactId>
			<version>\${version}</version>
		</dependency>
		-->
	</dependencies>
</project>
