<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ 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.deltaspike.core</groupId>
        <artifactId>core-project</artifactId>
        <version>1.7.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <groupId>org.apache.deltaspike.core</groupId>
    <artifactId>deltaspike-core-impl</artifactId>
    <packaging>bundle</packaging>

    <name>Apache DeltaSpike Core-Implementation</name>

    <properties>
        <deltaspike.osgi.export.pkg>
            org.apache.deltaspike.core.impl.*
        </deltaspike.osgi.export.pkg>
        <deltaspike.osgi.import>
            !org.apache.deltaspike.core.impl.*,
            *
        </deltaspike.osgi.import>
        <deltaspike.osgi.require.capability>
            osgi.extender; filter:="(osgi.extender=pax.cdi)",
            org.ops4j.pax.cdi.extension; filter:="(extension=deltaspike-core-api)"
        </deltaspike.osgi.require.capability>
        <deltaspike.osgi.provide.capability>
            org.ops4j.pax.cdi.extension; extension=deltaspike-core-impl
        </deltaspike.osgi.provide.capability>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.deltaspike.core</groupId>
            <artifactId>deltaspike-core-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.deltaspike.test</groupId>
            <artifactId>test-utils</artifactId>
            <version>${project.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-ejb_3.1_spec</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- Allows to create beans.xml files with certain content -->        
        <dependency>
            <groupId>org.jboss.shrinkwrap.descriptors</groupId>
            <artifactId>shrinkwrap-descriptors-impl-javaee</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

