<?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/maven-v4_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.
 */


  ON MVN COMPILE NOT WORKING

  If you wondering why 'mvn compile' does not work building HBase
  (in particular, if you are doing it for the first time), instead do
  'mvn package'.  If you are interested in the full story, see
  https://issues.apache.org/jira/browse/HBASE-6795.

-->
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.hbase.thirdparty</groupId>
    <artifactId>hbase-thirdparty</artifactId>
    <version>3.4.0</version>
    <relativePath>..</relativePath>
  </parent>
  <artifactId>hbase-shaded-netty</artifactId>
  <name>Apache HBase Relocated (Shaded) Netty Libs</name>
  <description>
    Pulls down netty.io, relocates nd then makes a fat new jar with them all in it.
  </description>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <configuration>
          <filesets>
            <fileset>
              <directory>${basedir}</directory>
              <includes>
                <include>dependency-reduced-pom.xml</include>
              </includes>
            </fileset>
          </filesets>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <shadeSourcesContent>true</shadeSourcesContent>
              <createSourcesJar>true</createSourcesJar>
              <relocations>
                <relocation>
                  <pattern>io.netty</pattern>
                  <shadedPattern>${rename.offset}.io.netty</shadedPattern>
                </relocation>
              </relocations>
              <artifactSet>
                <excludes>
                  <!--Exclude protobuf itself. We get a patched version in adjacent module.
                        Exclude other dependencies of guava, netty, etc.
                    -->
                  <exclude>com.google.protobuf:protobuf-java</exclude>
                  <exclude>com.google.code.findbugs:jsr305</exclude>
                  <exclude>com.google.errorprone:error_prone_annotations</exclude>
                  <exclude>com.google.j2objc:j2objc-annotations</exclude>
                  <exclude>org.codehaus.mojo:animal-sniffer-annotations</exclude>
                  <exclude>org.codehaus.mojo:animal-sniffer-annotations</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <!--This trick from
             https://stackoverflow.com/questions/33825743/rename-files-inside-a-jar-using-some-maven-plugin

            The netty jar has a .so in it. Shading requires rename of the .so and then passing a system
            property so netty finds the renamed .so and associates it w/ the relocated netty files.

            Add this define when running unit tests:
            
               mvn test -Dorg.apache.hbase.thirdparty.io.netty.packagePrefix=org.apache.hbase.thirdparty. -Dtest=TestNettyIPC

            See toward the end of this issue for how to pass config:
            
              https://github.com/netty/netty/issues/6665

            TODO: Ensure native works.
            NOTE: The 'tofile' in the move command below has the relocation hard-coded
            with '-' instead of '.' separators. If change the relocation, need to change here too.
          -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>unpack</id>
            <phase>package</phase>
            <configuration>
              <target>
                <echo message="unjar" />
                <unzip src="${project.build.directory}/${project.artifactId}-${project.version}.jar" dest="${project.build.directory}/unpacked/" />
                <echo message="Rename netty .so in META-INF" />
                <move file="${project.build.directory}/unpacked/META-INF/native/libnetty_transport_native_epoll_x86_64.so" tofile="${project.build.directory}/unpacked/META-INF/native/liborg_apache_hbase_thirdparty_netty_transport_native_epoll_x86_64.so" />
                <echo message="Redo jar" />
                <jar destfile="${project.build.directory}/${project.artifactId}-${project.version}.jar" basedir="${project.build.directory}/unpacked" />
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>${netty.version}</version>
    </dependency>
  </dependencies>
</project>
