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


Reply via email to