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