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