You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2014/04/25 20:23:42 UTC

svn commit: r1590093 - in /maven/plugins/trunk/maven-shade-plugin/src: main/java/org/apache/maven/plugins/shade/DefaultShader.java test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java

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();