<!--
 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>jar</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.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestFile>src/main/manifest/Manifest.mf</manifestFile>
            <manifest>
              <mainClass>org.apache.felix.main.Main</mainClass>
            </manifest>
          </archive>
        </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}/lib"/>
                <mkdir dir="${basedir}/lib"/>
                <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}/../framework/target/org.apache.felix.framework-${pom.version}.jar"
      todir="${basedir}/lib"/>
<copy file="${basedir}/../org.osgi.core/target/org.osgi.core-${pom.version}.jar"
      todir="${basedir}/lib"/>
<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>
