Author: jdcasey Date: Fri Apr 25 18:23:42 2014 New Revision: 1590093 URL: http://svn.apache.org/r1590093 Log: [MSHADE-167] Applying supplied patch, with small modifications to adjust to ASM 5 API
Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java maven/plugins/trunk/maven-shade-plugin/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java?rev=1590093&r1=1590092&r2=1590093&view=diff ============================================================================== --- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java (original) +++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java Fri Apr 25 18:23:42 2014 @@ -21,9 +21,11 @@ package org.apache.maven.plugins.shade; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.shade.filter.Filter; + import com.google.common.base.Joiner; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; + import org.apache.maven.plugins.shade.relocation.Relocator; import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer; import org.apache.maven.plugins.shade.resource.ResourceTransformer; @@ -335,7 +337,20 @@ public class DefaultShader // that use the constant pool to determine the dependencies of a class. ClassWriter cw = new ClassWriter( 0 ); - ClassVisitor cv = new RemappingClassAdapter( cw, remapper ); + final String pkg = name.substring(0, name.lastIndexOf('/') + 1); + ClassVisitor cv = new RemappingClassAdapter( cw, remapper ) { + @Override + public void visitSource(final String source, final String debug) { + if (source == null) { + super.visitSource(source, debug); + } else { + final String fqSource = pkg + source; + final String mappedSource = remapper.map(fqSource); + final String filename = mappedSource.substring(mappedSource.lastIndexOf('/') + 1); + super.visitSource(filename, debug); + } + } + }; try { Modified: maven/plugins/trunk/maven-shade-plugin/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java?rev=1590093&r1=1590092&r2=1590093&view=diff ============================================================================== --- maven/plugins/trunk/maven-shade-plugin/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java (original) +++ maven/plugins/trunk/maven-shade-plugin/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java Fri Apr 25 18:23:42 2014 @@ -37,6 +37,12 @@ import org.apache.maven.plugins.shade.re import org.apache.maven.plugins.shade.resource.ResourceTransformer; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.console.ConsoleLogger; +import org.objectweb.asm.Attribute; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; /** * @author Jason van Zyl @@ -102,7 +108,58 @@ public class DefaultShaderTest shaderWithPattern( "org/shaded/plexus/util", new File( "target/foo-custom-without-excludes.jar" ), new String[] {} ); } - public void shaderWithPattern( String shadedPattern, File jar, String[] excludes ) + public void testShaderWithRelocatedClassname() + throws Exception + { + DefaultShader s = newShader(); + + Set<File> set = new LinkedHashSet<File>(); + + set.add( new File( "src/test/jars/test-project-1.0-SNAPSHOT.jar" ) ); + + set.add( new File( "src/test/jars/plexus-utils-1.4.1.jar" ) ); + + List<Relocator> relocators = new ArrayList<Relocator>(); + + relocators.add( new SimpleRelocator( "org/codehaus/plexus/util/", "_plexus/util/__", null, Arrays.<String> asList() ) ); + + List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); + + resourceTransformers.add( new ComponentsXmlResourceTransformer() ); + + List<Filter> filters = new ArrayList<Filter>(); + + File file = new File( "target/foo-relocate-class.jar" ); + + ShadeRequest shadeRequest = new ShadeRequest(); + shadeRequest.setJars( set ); + shadeRequest.setUberJar( file ); + shadeRequest.setFilters( filters ); + shadeRequest.setRelocators( relocators ); + shadeRequest.setResourceTransformers( resourceTransformers ); + + s.shade( shadeRequest ); + + URLClassLoader cl = new URLClassLoader( new URL[]{file.toURI().toURL()} ); + Class<?> c = cl.loadClass( "_plexus.util.__StringUtils" ); + // first, ensure it works: + Object o = c.newInstance(); + assertEquals("", c.getMethod("clean", String.class).invoke(o, (String) null)); + + // now, check that its source file was rewritten: + final String[] source = { null }; + final ClassReader classReader = new ClassReader(cl.getResourceAsStream("_plexus/util/__StringUtils.class")); + classReader.accept(new ClassVisitor( Opcodes.ASM4 ) { + @Override + public void visitSource(String arg0, String arg1) { + super.visitSource(arg0, arg1); + source[0] = arg0; + } + }, ClassReader.SKIP_CODE); + assertEquals("__StringUtils.java", source[0]); + } + + private void shaderWithPattern( String shadedPattern, File jar, String[] excludes ) throws Exception { DefaultShader s = newShader();