[
https://issues.apache.org/jira/browse/MSHADE-391?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17349135#comment-17349135
]
Alexander Kriegisch commented on MSHADE-391:
--------------------------------------------
If anybody would like to test my fix with regard to this issue (also includes
the fix for MSHADE-252), you can use it like this:
{code:xml}
<pluginRepositories>
<!-- TODO: Remove after upstream release for Maven Shade with fix for
MSHADE-252 -->
<pluginRepository>
<id>aspectj-dev</id>
<name>AspectJ artifacts on aspectj.dev</name>
<url>https://aspectj.dev/maven</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!-- (...) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4.MSHADE-252-391</version>
</plugin>
{code}
> Do not modify class files, if nothing was relocated
> ---------------------------------------------------
>
> Key: MSHADE-391
> URL: https://issues.apache.org/jira/browse/MSHADE-391
> Project: Maven Shade Plugin
> Issue Type: Improvement
> Affects Versions: 3.2.4
> Reporter: Alexander Kriegisch
> Priority: Major
>
> h3. Preface
> This issue relates to my [mailing list
> question|https://www.mail-archive.com/[email protected]/msg143192.html]
> and the subsequent, fruitless meta discussion there, where nobody actually
> said anything about the problem at hand. So just like in the case of
> MSHADE-252, I fixed the problem by myself. Please see the attached pull
> request.
> h3. Problem description
> When running Maven Shade with relocation, it works nicely. When
> comparing JARs before and after relocation, I was surprised to see that Shade
> not just modifies the relocated classes and classes referencing them, but
> also a bunch of completely unrelated classes. Their byte code is slightly
> different, probably still does the same thing, but it makes comparisons and
> sanity checks or automatic verification steps harder than necessary.
> BTW, the same Shade execution also relocates the sources (running my version
> with fixed MSHADE-252). In this case, only changed source files referencing
> the relocated classes are being changed, just like I would have expected.
> h3. Problem analysis
> Maven Shade internally uses ASM's {{ClassRemapper}} and defines a custom
> {{Remapper}} subclass, which takes care of relocation, partially doing the
> work by itself and partially delegating to the ASM parent class. An ASM
> {{ClassReader}} reads each class file from the original JAR and
> *unconditionally* writes it into a {{ClassWriter}}, plugging in the
> transformer.
> This transformation, even if not a single relocation (package name mapping)
> takes place, often leads to binary differences between original class and
> transformed class, because constant pool or stack map frames have been
> adjusted, not changing the functionality of the class, but making it look
> like something changed when comparing class files before and after the
> relocation process.
> h3. Solution / improvement
> When reading each class file from the original JAR, we can store a copy in a
> byte array. We also need to adjust the relocation process such that a flag is
> set whenever anything is being relocated (package name change, textual or
> binary references to other relocated classes). After the transformation is
> done, Maven Shade can decide whether to write the original class file or the
> transformed one. This avoids writing transformed class files, even though no
> relocation has taken place for those files.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)