<!--
   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>
  <groupId>org.apache.uima</groupId>
  <artifactId>uimaj-ep-runtime-deployeditor</artifactId>
  <packaging>bundle</packaging>
  <version>${uimaj-as-release-eclipse-version}</version>
  <name>Apache UIMA Runtime Fragment for the Deployment Descriptor Editor Eclipse Plugin</name>
  <url>http://incubator.apache.org/uima</url>
  <parent>
    <groupId>org.apache.uima</groupId>
    <artifactId>uimaj-as-eclipse-plugins</artifactId>
    <version>2.3.0.incubating</version> <!-- this comment is a flag for changeVersion -->
    <relativePath>../uimaj-as/eclipse-plugin-superPom</relativePath>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.apache.uima</groupId>
      <artifactId>uimaj-ep-runtime</artifactId>
      <version>${uimaj-release-eclipse-version}</version>
      <!-- don't use provided scope here, because then
           eclipse:eclipse is set up to ref the uimaj-ep-runtime
           project directly, and it has no content
           "compile" makes eclipse:eclipse ref the
           jar that maven built in the local repository -->
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.eclipse.core</groupId>
      <artifactId>variables</artifactId>
      <version>3.1.100-v20060605</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>

    <finalName>org.apache.uima.runtime.fragments.deployeditor_${uimaj-as-release-eclipse-version}</finalName>

    <plugins>

      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <!-- version 1.4.0 to support _nouses instruction -->
        <version>1.4.0</version>
        <extensions>true</extensions>
        <configuration>
          <manifestLocation>META-INF</manifestLocation>
          <instructions>
            <!-- turn off "uses" generation because Eclipse 3.2.x doesn't work with them -->
            <_nouses>true</_nouses>
            <Export-Package>
              org.apache.uima.aae.deployment,
              org.apache.uima.aae.deployment.impl,
              org.apache.uima.application.metadata,
              org.apache.uima.application.metadata.impl,
              org.apache.uima.application.util,
              org.apache.uima.cpe.model,
              org.apache.uima.tools.debug.util
            </Export-Package>

            <Bundle-SymbolicName>org.apache.uima.runtime.fragments.deployeditor;singleton:=true</Bundle-SymbolicName>

            <Fragment-Host>org.apache.uima.runtime;bundle-version="2.3.0"</Fragment-Host>
          </instructions>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <manifest>.ignore</manifest>
          <pde>true</pde>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>
