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]