<!-- 
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>1.0.2</version>
    <relativePath>../../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>Apache Felix Example Dictionary Service Integration Test</name>
  <artifactId>org.apache.felix.examples.dictionaryservice.itest</artifactId>
  <version>0.9.0-SNAPSHOT</version>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.osgi.core</artifactId>
      <version>1.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.apache.felix.examples.dictionaryservice</artifactId>
      <version>0.9.0-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>

    <!-- Added to test exclusions: its not a bundle so we want to exclude it -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>provided</scope>
    </dependency>
    
  </dependencies>
  <build>
    <plugins>
    
      <plugin>
        <groupId>org.apache.felix.plugins</groupId>
        <artifactId>maven-felix-plugin</artifactId>
        <version>0.9.0-SNAPSHOT</version>
        <executions>
          <execution>
             <id>run</id>
             <configuration>
               <felixCacheDir>${basedir}/target/.felix</felixCacheDir>
               <exclusions>
                 <exclusion>junit:junit</exclusion>
               </exclusions>
             </configuration>
             <goals>
               <goal>run</goal>
             </goals>
          </execution>
        </executions>
      </plugin>
    
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>1.4.0</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
            <Private-Package>
              org.apache.felix.examples.dictionaryservice.itest.*
            </Private-Package>
            <Bundle-Name>Example Dictionary Integration Test</Bundle-Name>
            <Bundle-Vendor>Apache Software Foundation</Bundle-Vendor>
            <Bundle-Description>
              A bundle using the dictionary service to test it.
            </Bundle-Description>
            <Bundle-Activator>
              org.apache.felix.examples.dictionaryservice.itest.Activator
            </Bundle-Activator>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
