<!--
   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.    
-->

<!-- this POM holds common, factored-out settings for all the eclipse plugins
     Those project's POMs refer to this as their "parent"
     This POM refers to the uimaj pom as its parent
  -->

<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>
  <!-- thru testing, discovered that "inheriting" the groupId isn't done
       when scanning for projects -->
  <groupId>org.apache.uima</groupId>
  <artifactId>uimaj-as-eclipse-plugins</artifactId>
  <packaging>pom</packaging>
  <!-- note this version is different from the rest of the versions
       in that it has a "." instead of a "-" before the "incubating" 
       word.  In Maven, the "-" is the convention, but in Eclipse,
       a "." is required -->
  <!-- thru testing, discovered that $ { } vars are not substituted, when "scanning for projects" -->
  <version>2.3.0.incubating</version> <!-- this comment is a flag for changeVersion - eclipse -->
  
  <name>Apache UIMA-AS Java SDK common Eclipse plugin settings</name>
  <description>Holds common, factored out settings for eclipse plugins</description>

  <parent>
    <groupId>org.apache.uima</groupId>
    <artifactId>uimaj-as</artifactId>
    <version>2.3.0-incubating</version> <!-- this comment is a flag for changeVersion -->
    <relativePath>..</relativePath>
  </parent> 
   
  <build>
    <!-- resources are "merged" -->
    <!-- needed to copy resources, icons, and the plugin.xml to the result -->
    <resources>
      <resource>
        <directory>.</directory>
        <includes>
          <include>plugin.xml</include>
          <include>icons/*.*</include>
        </includes>
      </resource>
      <!-- need the following, is not "merged" from the overall maven superPom -->
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <manifest>.ignore</manifest>
          <pde>true</pde>
          <!-- set next to false because refs to runtime project
               as a project don't work (because it is a library project,
               and has no sources of its own 
            
            A consequence of this: If you change code a plugin depends on,
            run "mvn install" on the changed code to get your plugin to
            pick up the changes 
            -->
          <useProjectReferences>false</useProjectReferences>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <!-- listing the modules here allows running mvn xxx on this pom
    and having it recurse into all the children -->
      
  <modules>
    <module>../../uimaj-ep-deployeditor</module>
    <module>../../uimaj-ep-runtime-deployeditor</module>
    <module>../../uimaj-as-osgi-runtime</module>    
  </modules>
</project>