You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2013/05/14 22:30:41 UTC

svn commit: r1482566 - in /maven/plugins/trunk/maven-shade-plugin: pom.xml src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

Author: krosenvold
Date: Tue May 14 20:30:41 2013
New Revision: 1482566

URL: http://svn.apache.org/r1482566
Log:
[MSHADE-128] Too many warnings 'We have duplicates'

Patch was somewhat stale, revived by me

Modified:
    maven/plugins/trunk/maven-shade-plugin/pom.xml
    maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

Modified: maven/plugins/trunk/maven-shade-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/pom.xml?rev=1482566&r1=1482565&r2=1482566&view=diff
==============================================================================
--- maven/plugins/trunk/maven-shade-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-shade-plugin/pom.xml Tue May 14 20:30:41 2013
@@ -160,6 +160,11 @@ under the License.
       <scope>test</scope>
     </dependency>
 
+	<dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>13.0</version>
+	</dependency>
   </dependencies>
 
   <build>

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=1482566&r1=1482565&r2=1482566&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 Tue May 14 20:30:41 2013
@@ -21,6 +21,9 @@ 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;
@@ -41,9 +44,11 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.jar.JarEntry;
@@ -82,6 +87,7 @@ public class DefaultShader
 
         RelocatorRemapper remapper = new RelocatorRemapper( shadeRequest.getRelocators() );
 
+        //noinspection ResultOfMethodCallIgnored
         shadeRequest.getUberJar().getParentFile().mkdirs();
         FileOutputStream fileOutputStream = new FileOutputStream( shadeRequest.getUberJar() );
         JarOutputStream jos = new JarOutputStream( new BufferedOutputStream( fileOutputStream ) );
@@ -110,6 +116,8 @@ public class DefaultShader
             }
         }
 
+        Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 );
+        
         for ( File jar : shadeRequest.getJars() )
         {
 
@@ -152,6 +160,7 @@ public class DefaultShader
 
                     if ( name.endsWith( ".class" ) )
                     {
+                    	duplicates.put(name, jar);
                         addRemappedClass( remapper, jos, jar, name, is );
                     }
                     else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) )
@@ -184,6 +193,53 @@ public class DefaultShader
 
             jarFile.close();
         }
+        
+        Multimap<Collection<File>, String> overlapping = HashMultimap.create( 20, 15 );
+        
+        for ( String clazz: duplicates.keySet() )
+        {
+        	Collection<File> jarz = duplicates.get( clazz );
+        	if ( jarz.size() > 1 ) {
+        		overlapping.put( jarz, clazz );
+        	}
+        }
+        
+        // Log a summary of duplicates
+        for ( Collection<File> jarz : overlapping.keySet() )
+        {
+        	List<String> jarzS = new LinkedList<String>();
+        	
+        	for (File jjar : jarz)
+        		jarzS.add(jjar.getName());
+        	
+    		List<String> classes = new LinkedList<String>();
+        	
+        	for (String clazz : overlapping.get(jarz))
+    			classes.add(clazz.replace(".class", "").replace("/", "."));
+    		
+    		getLogger().warn( Joiner.on( ", " ).join(jarzS) + " define " + classes.size()
+    				+ " overlappping classes: " );
+    		
+    		int max = 10;
+    		
+    		for ( int i = 0; i < Math.min(max, classes.size()); i++ )
+    			getLogger().warn("  - " + classes.get(i));
+    		
+    		if ( classes.size() > max )
+    			getLogger().warn("  - " + (classes.size() - max) + " more...");
+    		
+        }
+        
+        if (overlapping.keySet().size() > 0) {
+        	getLogger().warn("maven-shade-plugin has detected that some .class files");
+        	getLogger().warn("are present in two or more JARs. When this happens, only");
+        	getLogger().warn("one single version of the class is copied in the uberjar.");
+        	getLogger().warn("Usually this is not harmful and you can skeep these");
+        	getLogger().warn("warnings, otherwise try to manually exclude artifacts");
+        	getLogger().warn("based on mvn dependency:tree -Ddetail=true and the above");
+        	getLogger().warn("output");
+        	getLogger().warn("See http://docs.codehaus.org/display/MAVENUSER/Shade+Plugin");
+        }
 
         for ( ResourceTransformer transformer : transformers )
         {
@@ -200,7 +256,7 @@ public class DefaultShader
             filter.finished();
         }
     }
-
+    
     private JarFile newJarFile( File jar )
         throws IOException
     {
@@ -264,7 +320,7 @@ public class DefaultShader
             }
             catch ( ZipException e )
             {
-                getLogger().warn( "We have a duplicate " + name + " in " + jar );
+                getLogger().debug( "We have a duplicate " + name + " in " + jar );
             }
 
             return;
@@ -304,7 +360,7 @@ public class DefaultShader
         }
         catch ( ZipException e )
         {
-            getLogger().warn( "We have a duplicate " + mappedName + " in " + jar );
+            getLogger().debug( "We have a duplicate " + mappedName + " in " + jar );
         }
     }