maven-shade-plugin icon indicating copy to clipboard operation
maven-shade-plugin copied to clipboard

[MSHADE-197] Shade fails to relocate packages for all classes

Open jira-importer opened this issue 10 years ago • 3 comments

Michael McCarthy opened MSHADE-197 and commented

I attempted to relocate the org.apache.http.* packages using the shade plugin on the AWS Java SDK. This fails to update the location for at least one class, com.amazonaws.services.s3.model.S3ObjectInputStream. I manually updated the source code to use the shaded location and it compiled without issue:

import org.shaded.http.client.HttpClient;
import org.shaded.http.client.methods.HttpRequestBase;
import org.shaded.http.conn.EofSensorInputStream;

Before making the above change, the error I get is:

[ERROR] 
\dev\CSJ\aws\temp\aws-sdk-java\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)

The configuration I used in pom.xml was:

<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>

See http://mail-archives.apache.org/mod_mbox/maven-users/201506.mbox/%3C558BE1C5.2020400%40tribloom.com%3E for more details. This thread has instructions on how to reproduce as well as links to a Github project with the changes already made and the error easy to reproduce.


Affects: 2.4

jira-importer avatar Jul 02 '15 13:07 jira-importer

Alexander Kriegisch commented

I also do source shading sometimes and improved something in MSHADE-252, which was just merged yesterday. I stumbled across this one and whated to verify if it is still an issue with Shade 3.2.4, both before and after my changes.

Before I look into this in more detail, please explain what you are trying to achieve:

  • It looks as if you try to build (part of) the original AWS Java SDK from scratch, trying to compile relocated sources. Why would you do that? Are you one of the committers in that project?
  • Normally, you would depend on the AWS SDK binaries in your own project and shade those. The sources are not meant to be recompiled (except for maybe being used in order to create relocated Javadocs). Source shading is meant to help you attach a source JAR to your uber JAR using relocated binaries, so as to be able to navigate to sources fitting the binaries in your IDE or so.

So before explaining how you want to do something, better explain first what you want to achieve. Otherwise, your question suffers from the XY problem.

For reference, the mailing list message containing the GitHub link is this one, the GitHub repository clone of AWS Java SDK is on this branch. You should have included the links directly in your question, not let people first jump to the head of the mailing list thread, having to sift through all messages in order to finally find the link.

jira-importer avatar May 25 '21 05:05 jira-importer

Alexander Kriegisch commented

OK, I checked out your branch and got confirmation for what I asked you about before:

  • You are trying to create an uber JAR containing both AWS S3 Java SDK and a relocated version of Apache HTTP Components.
  • You do not need to compile anything from sources. You only need the sources for better IDE integration, if someone wants to navigate your uber JAR's sources.
  • There is absolutely no need to modify the AWS SDK sources, you can just create a module in your own project, creating the uber JAR there. A configuration similar to what you put into aws-java-sdk-s3/pom.xml should suffice.
  • Even if you want to stick with your weird approach to abuse the AWS SDK project for generating the uber JAR, it works if you simply remove the Maven Shade Plugin again from aws-java-sdk-core/pom.xml. Shading the same thing twice is not going to help and just leads to the errors you saw. As soon as I reverted the change in that file and built the remainder of your modified AWS SDK project with mvn -DskipTests=true clean package -P versiondiff, it worked. Besides, you forgot to mention that you put the Shade plugin into the versiondiff Maven profile, for whatever reason. So of course, you also have to use that profile when building the project. You never mentioned that in your mailing list thread.

Having said all that, I can confirm that this is not a Maven Shade issue. The problem sat in front of the keyboard in this case. No problem, we all make mistakes. 🙂 But please, close the issue. I think it is resolved. I am just wondering why for so long no maintainer cared to reply to you. I am just a user (who lately contributed a few pull requests) like you.

jira-importer avatar May 25 '21 06:05 jira-importer

4 years ago, I had analysed this issue and found out that it is invalid for the reasons mentioned above. It should be closed.

kriegaex avatar Jun 15 '25 05:06 kriegaex