<!--
    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.aries</groupId>
        <artifactId>java5-parent</artifactId>
        <version>1.0.0</version>
        <relativePath />
    </parent>

    <groupId>org.apache.aries.jmx</groupId>
    <artifactId>org.apache.aries.jmx.core</artifactId>
    <packaging>bundle</packaging>
    <name>Apache Aries JMX Core</name>
    <version>1.0.1</version>
    <description>
        This bundle contains the core implementation 
		of the JMX Control specification
    </description>

     <scm>
         <connection>scm:svn:http://svn.apache.org/repos/asf/aries/tags/org.apache.aries.jmx.core-1.0.1</connection>
         <developerConnection>scm:svn:https://svn.apache.org/repos/asf/aries/tags/org.apache.aries.jmx.core-1.0.1</developerConnection>
         <url>http://svn.apache.org/viewvc/aries/tags/org.apache.aries.jmx.core-1.0.1</url>
     </scm>

    <properties>
        <aries.osgi.activator>
            org.apache.aries.jmx.Activator
        </aries.osgi.activator>
        <aries.osgi.import>
            !org.apache.aries.jmx*,
            org.osgi.framework;version="[1.5.0,2.0)",
            org.osgi.service.cm;version="[1.3.0,2.0)";resolution:="optional",
            org.osgi.service.permissionadmin;version="[1.2.0,2.0)";resolution:="optional",
            org.osgi.service.provisioning;version="[1.2.0,2.0)";resolution:="optional",
            org.osgi.service.useradmin;version="[1.1.0,2.0)";resolution:="optional",
            org.osgi.util.tracker,
            org.osgi.jmx;version="[1.0.0,2.0)",
            org.osgi.jmx.framework;version="[1.5.0,1.6.0)",
            org.osgi.jmx.service.cm;version="[1.3.0,1.4.0)",
            org.osgi.jmx.service.permissionadmin;version="[1.2.0,1.3.0)",
            org.osgi.jmx.service.provisioning;version="[1.2.0,1.3.0)",
            org.osgi.jmx.service.useradmin;version="[1.1.0,1.2.0)",
            *
        </aries.osgi.import>
        <!-- Export package versions are maintained in packageinfo files -->

        <aries.osgi.export.pkg>
            org.apache.aries.jmx.codec
        </aries.osgi.export.pkg>
        <aries.osgi.private.pkg>
            org.apache.aries.jmx*
        </aries.osgi.private.pkg>
        <aries.osgi.import.service>
            javax.management.MBeanServer
        </aries.osgi.import.service>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.aries.jmx</groupId>
            <artifactId>org.apache.aries.jmx.api</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.aries</groupId>
            <artifactId>org.apache.aries.util</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
            <version>1.8.2</version>
        </dependency>
        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
        </dependency>

    </dependencies>

 </project>
