maven-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Veithen (JIRA)" <>
Subject [jira] (MSHADE-105) Classes processed by the relocator still have references to the original classes in their constant pools
Date Wed, 07 Mar 2012 20:38:02 GMT


Andreas Veithen commented on MSHADE-105:

Can somebody please review this issue? We have this problem with Apache Axiom, and if the
issue is not fixed, we will have to release Axiom with a patched version of the shade plugin.
> Classes processed by the relocator still have references to the original classes in their
constant pools
> --------------------------------------------------------------------------------------------------------
>                 Key: MSHADE-105
>                 URL:
>             Project: Maven 2.x Shade Plugin
>          Issue Type: Bug
>    Affects Versions: 1.4
>            Reporter: Andreas Veithen
>            Priority: Minor
>         Attachments: constant-pool.patch, javap2.txt, javap.txt
> DefaultShader uses the ClassWriter(ClassReader, int) constructor instead of ClassWriter(int).
According to the ASM Javadoc, this has the following effects:
> "- The constant pool from the original class is copied as is in the new class, which
saves time. New constant pool entries will be added at the end if necessary, but unused constant
pool entries won't be removed.
> - Methods that are not transformed are copied as is in the new class, directly from the
original class bytecode (i.e. without emitting visit events for all the method instructions),
which saves a lot of time. Untransformed methods are detected by the fact that the ClassReader
receives MethodVisitor objects that come from a ClassWriter (and not from a custom ClassAdapter
or any other ClassVisitor instance)."
> The second item is actually not applicable in the case of DefaultShader because the entire
class needs to be transformed anyway. On the other hand, the first item implies that the constant
pool of the transformed class will still have references to the original classes. This can
be seen from the attached "javap.txt" file (produced by javap on a class relocated by maven-shade-plugin):
the relocation adds new entries at the end of the constant pool, but the original entries
are still present.
> Since the original entries are no longer referenced anywhere in the class, this has no
consequences at runtime. However, some tools such as Felix' maven-bundle-plugin use the constant
pool to determine the dependencies of a class. The effect is that if such a shaded JAR is
embedded into a bundle using maven-bundle-plugin, it will generate spurious Import-Package
instructions referring to the original package names. An example of this is described in AXIS2-5145.
> The solution to this problem is simply not to pass the ClassReader object to the ClassWriter
constructor. With this change, the constant pool is properly cleaned up (see the attached
"javap2.txt" file).

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
For more information on JIRA, see:


View raw message