<?xml version="1.0" encoding="UTF-8"?>
<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/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>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-shaded</artifactId>
    <version>2.4.17</version>
    <relativePath>..</relativePath>
  </parent>

  <artifactId>hbase-shaded-testing-util</artifactId>
  <name>Apache HBase - Shaded - Testing Util</name>

  <dependencies>
    <!-- test-jar dependencies -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-app</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-common</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-server</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <groupId>javax.xml.bind</groupId>
          <artifactId>jaxb-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-asyncfs</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-zookeeper</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-hadoop-compat</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-hadoop2-compat</artifactId>
      <type>test-jar</type>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-jaxrs</artifactId>
      <version>1.9.13</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-testing-util</artifactId>
      <version>${project.version}</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <groupId>javax.xml.bind</groupId>
          <artifactId>jaxb-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-site-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
      <plugin>
        <!--Make it so assembly:single does nothing in here-->
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <skipAssembly>true</skipAssembly>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
            <id>aggregate-into-a-jar-with-relocated-third-parties</id>
            <configuration>
              <artifactSet>
                <excludes>
                  <!-- exclude J2EE modules that come in for JDK11+ (since
                                         hadoop-3.2.0) or modules that come in for JDK8+ but
                                         need not be included -->
                  <exclude>javax.annotation:javax.annotation-api</exclude>
                  <exclude>javax.activation:javax.activation-api</exclude>
                  <exclude>jakarta.ws.rs:jakarta.ws.rs-api</exclude>
                  <exclude>jakarta.annotation:jakarta.annotation-api</exclude>
                  <exclude>jakarta.validation:jakarta.validation-api</exclude>
                  <exclude>org.glassfish.hk2.external:jakarta.inject</exclude>
                  <!--
                                      Tell the shade plugin that in this case we want to include hadoop
                                      by leaving out the exclude.
                                      -->
                  <!-- The rest of these should be kept in sync with the parent pom -->
                  <exclude>org.apache.hbase:hbase-resource-bundle</exclude>
                  <exclude>org.slf4j:*</exclude>
                  <exclude>com.google.code.findbugs:*</exclude>
                  <exclude>com.github.stephenc.findbugs:*</exclude>
                  <exclude>com.github.spotbugs:*</exclude>
                  <exclude>org.apache.htrace:*</exclude>
                  <exclude>org.apache.yetus:*</exclude>
                  <exclude>log4j:*</exclude>
                  <exclude>ch.qos.reload4j:*</exclude>
                  <exclude>commons-logging:*</exclude>
                  <exclude>org.javassist:*</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>
