<!--
 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">
  <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix-parent</artifactId>
    <version>1.2.1</version>
    <relativePath>../../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <artifactId>org.apache.felix.ipojo.online.manipulator</artifactId>
  <version>1.7.0-SNAPSHOT</version>
  <name>Apache Felix iPOJO URL Handler</name>

  <description>
  iPOJO online manipulator allowing install time manipulation of iPOJO bundle.
  </description>
  <url>http://felix.apache.org/site/apache-felix-ipojo-online-manipulator.html</url>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>1.4.3</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Private-Package>org.apache.felix.ipojo.online.manipulator</Private-Package>
            <Bundle-DocURL>
              http://felix.apache.org/site/apache-felix-ipojo-online-manipulator.html
            </Bundle-DocURL>
            <Export-Package> org.apache.felix.ipojo.manipulator,
              org.apache.felix.ipojo.xml.parser,
              org.apache.felix.ipojo.manipulation,
              org.apache.felix.ipojo.manipulation.annotations,
              org.objectweb.asm.commons, org.objectweb.asm </Export-Package>
            <Import-Package> !org.objectweb.asm.tree, !sun.io, org.osgi.framework;version=1.3, *
            </Import-Package>
            <Include-Resource>
              META-INF/LICENSE=LICENSE,
              META-INF/LICENSE.asm=LICENSE.asm,
              META-INF/NOTICE=NOTICE,
              META-INF/DEPENDENCIES=DEPENDENCIES
             </Include-Resource>
            <!-- <Embed-Dependency>xercesImpl|xml-resolver</Embed-Dependency> -->
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-ipojo-plugin</artifactId>
        <version>1.8.0</version>
        <executions>
          <execution>
            <goals>
              <goal>ipojo-bundle</goal>
            </goals>
            <configuration>
              <ignoreAnnotations>true</ignoreAnnotations>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>rat-maven-plugin</artifactId>
        <configuration>
          <excludeSubProjects>false</excludeSubProjects>
          <useEclipseDefaultExcludes>true</useEclipseDefaultExcludes>
          <useMavenDefaultExcludes>true</useMavenDefaultExcludes>
          <excludes>
            <param>doc/**/*</param>
            <param>maven-eclipse.xml</param>
            <param>.checkstyle</param>
            <param>.externalToolBuilders/*</param>
            <param>LICENSE.asm</param>
          </excludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <configuration>
          <configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.apache.felix</groupId>
      <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
      <version>1.8.0</version>
    </dependency>
    <dependency>
      <groupId>asm</groupId>
      <artifactId>asm-all</artifactId>
      <version>3.0</version>
      <exclusions>
        <exclusion>
          <groupId>asm</groupId>
          <artifactId>asm-tree</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.osgi</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>4.0.0</version>
    </dependency>
  </dependencies>
</project>
