<?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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.apache.felix</groupId>
		<artifactId>dependencymanager-reactor</artifactId>
		<version>3.0.0-SNAPSHOT</version>
	</parent>

	<name>Apache Felix Dependency Manager Shell</name>
	<artifactId>org.apache.felix.dependencymanager.shell</artifactId>
	<packaging>bundle</packaging>

	<dependencies>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
		</dependency>
		
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.shell</artifactId>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.dependencymanager</artifactId>
		</dependency>
		<dependency>
			<groupId>${pom.groupId}</groupId>
			<artifactId>org.apache.felix.gogo.runtime</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.eclipse.equinox</groupId>
			<artifactId>osgi</artifactId>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>org.apache.felix.dm.shell</Bundle-SymbolicName>
						<Bundle-Activator>org.apache.felix.dm.shell.Activator</Bundle-Activator>
						<Bundle-Name>Apache Felix Dependency Manager Shell</Bundle-Name>
						<Bundle-Description>Shell command for the dependency manager.</Bundle-Description>
						<Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
						<Export-Package></Export-Package>
						<Private-Package>org.apache.felix.dm.shell</Private-Package>
						<Import-Package>org.apache.felix.dm;version="[3.0.0,4.0.0)",org.apache.felix.shell;version="1.0";resolution:=optional,org.osgi.framework;version="1.3",org.eclipse.osgi.framework.console;resolution:=optional,org.apache.felix.service.command;resolution:=optional</Import-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>
