<!--
    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>felix-parent</artifactId>
        <version>6</version>
        <relativePath>../../pom/pom.xml</relativePath>
    </parent>

    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.scr.bnd</artifactId>

    <version>1.9.4</version>
    <packaging>jar</packaging>

    <name>Bnd SCR Plugin</name>
    <description>
		Implements a Bnd scrplugin to generate Declarative Services
		and Metatype Service descriptors from Java 5 annotations 
		and/or JavaDoc tags.
	</description>

    <scm>
        <connection>scm:svn:http://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.bnd-1.9.4</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.bnd-1.9.4</developerConnection>
        <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.scr.bnd-1.9.4</url>
    </scm>

    <properties>
        <felix.java.version>6</felix.java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.generator</artifactId>
            <version>1.18.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.felix</groupId>
            <artifactId>org.apache.felix.scr.annotations</artifactId>
            <version>1.12.0</version>
            <scope>compile</scope>
        </dependency>
        <!-- bndlib is provided at runtime (it neither needs to be considered by the maven-shade-plugin nor as transitive dependency by Maven) -->
        <dependency>
            <groupId>biz.aQute.bnd</groupId>
            <artifactId>bndlib</artifactId>
            <version>2.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Use a shade plugin in order to append META-INF/service SPI resources into target artifact -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                            </transformers>
                            <!-- exclude provided dependencies -->
                            <artifactSet>
                                <excludes>
                                    <!-- Don't include anything from bndlib (as this is always part of the classpath) -->
                                    <exclude>biz.aQute.bnd:bndlib</exclude>
                                </excludes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <artifact>org.osgi</artifact>
                                    <!-- exclude everything which is already included in bndlib -->
                                    <excludes>
                                        <exclude>org/osgi/resource</exclude>
                                        <exclude>org/osgi/service/component/annotations</exclude>
                                        <exclude>org/osgi/service/metatype/annotations</exclude>
                                        <exclude>org/osgi/service/repository</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>

                <!-- Update to version 1.16 to be compatible with latest ASM version -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>animal-sniffer-maven-plugin</artifactId>
                    <version>1.16</version>
                </plugin>

            </plugins>
        </pluginManagement>
    </build>

</project>
