<!--
 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>
 <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix</artifactId>
    <version>0.8.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>Apache Felix Main</name>
  <artifactId>org.apache.felix.main</artifactId>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.apache.felix.framework</artifactId>
      <version>${pom.version}</version>
    </dependency>
  </dependencies>
  <properties>
    <property name="install.home" value="${basedir.absolutePath}"/>
  </properties>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Main-Class>org.apache.felix.main.Main</Main-Class>
            <Bundle-Name>Apache Felix</Bundle-Name>
            <Bundle-Description>OSGi R4 framework.</Bundle-Description>
            <Private-Package>org.apache.felix.*,org.osgi.*</Private-Package>
            <Import-Package>!*</Import-Package>
            <Include-Resource>{src/main/resources/}</Include-Resource>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>install</phase>
            <configuration>
              <tasks>
                <delete dir="${basedir}/bin"/>
                <mkdir dir="${basedir}/bin"/>
                <delete dir="${basedir}/conf"/>
                <mkdir dir="${basedir}/conf"/>
                <delete dir="${basedir}/bundle"/>
                <mkdir dir="${basedir}/bundle"/>
<copy file="${basedir}/target/org.apache.felix.main-${pom.version}.jar"
      tofile="${basedir}/bin/felix.jar"/>
<copy file="${basedir}/target/classes/config.properties"
      todir="${basedir}/conf"/>
<copy file="${basedir}/../shell/target/org.apache.felix.shell-${pom.version}.jar"
      todir="${basedir}/bundle"/>
<copy file="${basedir}/../shell.tui/target/org.apache.felix.shell.tui-${pom.version}.jar"
      todir="${basedir}/bundle"/>
<copy file="${basedir}/../bundlerepository/target/org.apache.felix.bundlerepository-${pom.version}.jar"
      todir="${basedir}/bundle"/>
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources> 
  </build>
</project>
