I have been attempting to "shade"[1] the AWS Java SDK[2] version 1.10.1, specifically the S3 SDK, to relocate the Apache HTTPCompontents[3] libraries. I am attempting to do this in order to resolve a dependency conflict with another more complicated project which is also dependent on an older version of HTTPComponents. So far I have been unsuccessful and can't determine if it is misconfiguration or an issue with the plugin. I hope it is the former.

First I added a Maven Shade configuration to the aws-java-sdk-core pom.xml:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4</version>
   <configuration>
      <artifactSet>
         <includes>
            <include>com.amazonaws:*</include>
<include>org.apache.httpcomponents:*</include>
         </includes>
      </artifactSet>
      <relocations>
         <relocation>
            <pattern>org.apache.http</pattern>
<shadedPattern>org.shaded.http</shadedPattern>
         </relocation>
      </relocations>
   </configuration>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
      </execution>
   </executions>
</plugin>

This seems to work fine and produces a jar that seems to be as expected when I build the project using "mvn clean install -Dgpg.skip=true -DskipTests=true", although I haven't tested it. Second, I modify the aws-java-sdk-s3 pom.xml as follows:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4</version>
   <configuration>
      <shadeSourcesContent>true</shadeSourcesContent>
      <createSourcesJar>true</createSourcesJar>
      <artifactSet>
         <includes>
            <include>com.amazonaws:*</include>
<include>org.apache.httpcomponents:*</include>
         </includes>
      </artifactSet>
      <relocations>
         <relocation>
            <pattern>org.apache.http</pattern>
<shadedPattern>org.shaded.http</shadedPattern>
         </relocation>
      </relocations>
   </configuration>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
      </execution>
   </executions>
</plugin>

By itself this produces build errors like this:
[ERROR] \dev\CSJ\aws\aws-sdk-java-1.10.1\aws-java-sdk-s3\src\main\java\com\amazonaws\services\s3\model\S3ObjectInputStream.java:[20,29] error: package org.apache.http.client does not exist

So I added an explicit dependency on HTTPComponents to the S3 pom.xml:
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.3.6</version>
</dependency>

When I build I get only one error:
[ERROR] \dev\CSJ\aws\aws-sdk-java-1.10.1\aws-java-sdk-s3\src\main\java\com\amazonaws\services\s3\internal\S3ObjectResponseHandler.java:[54,26] error: no suitable constructor found for S3ObjectInputStream(InputStream,org.shaded.http.client.methods.HttpRequestBase)

It appears to me that the "shading" is not actually relocating the http.client.methods.HttpRequestBase argument to the S3ObjectInputStream class within the code. Running javap confirms this: $ javap target/classes/com/amazonaws/services/s3/model/S3ObjectInputStream.class
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Compiled from "S3ObjectInputStream.java"
public class com.amazonaws.services.s3.model.S3ObjectInputStream extends com.amazonaws.internal.SdkFilterInputStream { public com.amazonaws.services.s3.model.S3ObjectInputStream(java.io.InputStream, org.apache.http.client.methods.HttpRequestBase); public com.amazonaws.services.s3.model.S3ObjectInputStream(java.io.InputStream, org.apache.http.client.methods.HttpRequestBase, boolean);
  public void abort();
  public org.apache.http.client.methods.HttpRequestBase getHttpRequest();
  public int available() throws java.io.IOException;
}

Can anyone point out if my configuration is wrong, my methodology is wrong, or the Maven Shade plugin is actually not behaving as expected?

[1] http://maven.apache.org/plugins/maven-shade-plugin/index.html
[2] https://github.com/aws/aws-sdk-java
[3] https://hc.apache.org/

Thanks,
--
Michael

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to