<!--
    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.whiteboard</artifactId>
    <packaging>bundle</packaging>
    <name>Apache Aries JMX Core via Whiteboards</name>
    <version>1.1.1</version>
    <description>
        This bundle contains an implementation of the JMX Core specification which registers the
        MBeans as services in the service registry. This allows the whiteboard module to be
        used to register the MBeans.
    </description>

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

    <properties>
        <aries.osgi.activator>
            org.apache.aries.jmx.core.whiteboard.Activator
        </aries.osgi.activator>
        <!-- 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.dynamic>
            org.osgi.jmx.service.cm;version="[1.3,2)",
            org.osgi.jmx.service.permissionadmin;version="[1.2,2)",
            org.osgi.jmx.service.provisioning;version="[1.2,2)",
            org.osgi.jmx.service.useradmin;version="[1.1,2)",
            org.osgi.service.cm;version="[1.4,2)",
            org.osgi.service.permissionadmin;version="[1.2,2)",
            org.osgi.service.provisioning;version="[1.2,2)",
            org.osgi.service.useradmin;version="[1.1,2)"
        </aries.osgi.dynamic>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.aries.jmx</groupId>
            <artifactId>org.apache.aries.jmx.api</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.aries.jmx</groupId>
            <artifactId>org.apache.aries.jmx.core</artifactId>
            <version>1.1.1</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>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.aries.versioning</groupId>
                <artifactId>org.apache.aries.versioning.plugin</artifactId>
                <version>0.1.0</version>
                <executions>
                    <execution>
                        <id>default-verify</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>version-check</goal>
                        </goals>
                        <configuration>
                            <oldArtifact>org.apache.aries.jmx:org.apache.aries.jmx.core.whiteboard:1.1.0</oldArtifact>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 </project>
