<?xml version="1.0"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!--
  /**
   * 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.
   */
  -->
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>hbase</artifactId>
    <groupId>org.apache.hbase</groupId>
    <version>1.7.0</version>
    <relativePath>..</relativePath>
  </parent>

  <artifactId>hbase-archetypes</artifactId>
  <packaging>pom</packaging>

  <name>Apache HBase - Archetypes</name>
  <description>Maven archetypes for generation of fully-configured HBase client projects</description>

  <modules>
    <module>hbase-client-project</module>
    <module>hbase-shaded-client-project</module>
    <!-- For new archetype, add exemplar project above this comment.
         (See hbase-archetypes/README.md for details on adding new archetype.)  -->
    <module>hbase-archetype-builder</module>
  </modules>

  <build>
    <pluginManagement>
      <plugins>
        <!-- This entry overrides the excludeFileFilter element in the findbugs
             configuration of the hbase/pom.xml file. This override specifies that
             the excluded-filter-file is found TWO levels up from a grandchild project. -->
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>findbugs-maven-plugin</artifactId>
          <configuration>
            <excludeFilterFile>${project.basedir}/../../dev-support/findbugs-exclude.xml</excludeFilterFile>
            <findbugsXmlOutput>true</findbugsXmlOutput>
            <xmlOutput>true</xmlOutput>
            <effort>Max</effort>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <!-- Special configuration for findbugs just in the parent, emulating the setup in
           hbase/pom.xml. Note that exclude-file-filter is found ONE level up from this project. -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <executions>
          <execution>
            <inherited>false</inherited>
            <goals>
              <goal>findbugs</goal>
            </goals>
            <configuration>
              <excludeFilterFile>${project.basedir}/../dev-support/findbugs-exclude.xml</excludeFilterFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
