maven-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Veithen (JIRA)" <j...@codehaus.org>
Subject [jira] (MSHADE-105) Classes processed by the relocator still have references to the original classes in their constant pools
Date Sat, 10 Mar 2012 18:00:04 GMT

     [ https://jira.codehaus.org/browse/MSHADE-105?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Andreas Veithen updated MSHADE-105:
-----------------------------------

    Attachment: mshade-105-test.zip

I've attached a sample project that shows the issue. It creates a shaded JAR from commons-io
and then embeds that JAR into an OSGi bundle using maven-bundle-plugin from Apache Felix.

With maven-shade-plugin 1.5 the generated manifest looks as follows (see bundle/target/classes/META-INF/MANIFEST.MF):

Manifest-Version: 1.0
Built-By: veithen
Created-By: Apache Maven Bundle Plugin
Import-Package: org.apache.commons.io,org.apache.commons.io.comparator
 ,org.apache.commons.io.filefilter,org.apache.commons.io.input,org.apa
 che.commons.io.output,test
Bnd-LastModified: 1331401786401
Export-Package: test
Bundle-Version: 1.0.0
Bundle-Name: bundle
Bundle-ClassPath: .,shaded-jar-1.jar
Build-Jdk: 1.5.0_30
Bundle-ManifestVersion: 2
Bundle-SymbolicName: test.bundle
Tool: Bnd-0.0.357
Embed-Dependency: *

One can see that there are still references to the original org.apache.commons.io package.
With 1.6-SNAPSHOT the manifest looks as expected:

Manifest-Version: 1.0
Built-By: veithen
Created-By: Apache Maven Bundle Plugin
Import-Package: test
Bnd-LastModified: 1331401716142
Export-Package: test
Bundle-Version: 1.0.0
Bundle-Name: bundle
Bundle-ClassPath: .,shaded-jar-1.jar
Build-Jdk: 1.5.0_30
Bundle-ManifestVersion: 2
Bundle-SymbolicName: test.bundle
Tool: Bnd-0.0.357
Embed-Dependency: *

                
> Classes processed by the relocator still have references to the original classes in their
constant pools
> --------------------------------------------------------------------------------------------------------
>
>                 Key: MSHADE-105
>                 URL: https://jira.codehaus.org/browse/MSHADE-105
>             Project: Maven 2.x Shade Plugin
>          Issue Type: Bug
>    Affects Versions: 1.4
>            Reporter: Andreas Veithen
>            Assignee: Olivier Lamy
>            Priority: Minor
>             Fix For: 1.6
>
>         Attachments: constant-pool.patch, javap2.txt, javap.txt, mshade-105-test.zip
>
>
> 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: https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message