You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by eo...@apache.org on 2018/12/19 09:09:14 UTC

[maven-shade-plugin] 01/03: MSHADE-306 log all duplicates to not silently swallow a duplicate and an implicit selection

This is an automated email from the ASF dual-hosted git repository.

eolivelli pushed a commit to branch MSHADE-306
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git

commit 7f96cf4ebf7e5486c2404f2eb307111abc3491b5
Author: Romain Manni-Bucau <rm...@apache.org>
AuthorDate: Sat Dec 15 20:44:05 2018 +0100

    MSHADE-306 log all duplicates to not silently swallow a duplicate and an implicit selection
---
 .../apache/maven/plugins/shade/DefaultShader.java  | 43 ++++++++++---
 .../maven/plugins/shade/DefaultShaderTest.java     | 72 ++++++++++++++++++++++
 2 files changed, 107 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
index 825ed68..c6386a0 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -29,6 +29,7 @@ import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -234,9 +235,9 @@ public class DefaultShader
                 }
             }
 
+            duplicates.put( name, jar );
             if ( name.endsWith( ".class" ) )
             {
-                duplicates.put( name, jar );
                 addRemappedClass( remapper, jos, jar, name, in );
             }
             else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) )
@@ -256,6 +257,7 @@ public class DefaultShader
                     // Avoid duplicates that aren't accounted for by the resource transformers
                     if ( resources.contains( mappedName ) )
                     {
+                        getLogger().debug( "We have a duplicate " + name + " in " + jar );
                         return;
                     }
 
@@ -340,27 +342,52 @@ public class DefaultShader
             }
 
             List<String> classes = new LinkedList<String>();
+            List<String> resources = new LinkedList<String>();
 
-            for ( String clazz : overlapping.get( jarz ) )
+            for ( String name : overlapping.get( jarz ) )
             {
-                classes.add( clazz.replace( ".class", "" ).replace( "/", "." ) );
+                if ( name.endsWith( ".class" ) )
+                {
+                    classes.add( name.replace( ".class", "" ).replace( "/", "." ) );
+                }
+                else
+                {
+                    resources.add( name );
+                }
             }
 
             //CHECKSTYLE_OFF: LineLength
+            final Collection<String> overlaps = new ArrayList<>();
+            if ( !classes.isEmpty() )
+            {
+                overlaps.add( "classes" );
+            }
+            if ( !resources.isEmpty() )
+            {
+                overlaps.add( "resources" );
+            }
+
+            final List<String> all = new ArrayList<>( classes.size() + resources.size() );
+            all.addAll( classes );
+            all.addAll( resources );
+
             getLogger().warn(
-                Joiner.on( ", " ).join( jarzS ) + " define " + classes.size() + " overlapping classes: " );
+                Joiner.on( ", " ).join( jarzS ) + " define " + all.size()
+                + " overlapping " + Joiner.on( " and " ).join( overlaps ) + ": " );
             //CHECKSTYLE_ON: LineLength
 
+            Collections.sort( all );
+
             int max = 10;
 
-            for ( int i = 0; i < Math.min( max, classes.size() ); i++ )
+            for ( int i = 0; i < Math.min( max, all.size() ); i++ )
             {
-                getLogger().warn( "  - " + classes.get( i ) );
+                getLogger().warn( "  - " + all.get( i ) );
             }
 
-            if ( classes.size() > max )
+            if ( all.size() > max )
             {
-                getLogger().warn( "  - " + ( classes.size() - max ) + " more..." );
+                getLogger().warn( "  - " + ( all.size() - max ) + " more..." );
             }
 
         }
diff --git a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
index e45e642..cd56ca6 100644
--- a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
+++ b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
@@ -20,21 +20,25 @@ package org.apache.maven.plugins.shade;
  */
 
 import java.io.File;
+import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
 import junit.framework.TestCase;
 
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.shade.filter.Filter;
 import org.apache.maven.plugins.shade.relocation.Relocator;
 import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
 import org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer;
 import org.apache.maven.plugins.shade.resource.ResourceTransformer;
+import org.codehaus.plexus.logging.AbstractLogger;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.logging.console.ConsoleLogger;
 import org.objectweb.asm.ClassReader;
@@ -51,6 +55,74 @@ public class DefaultShaderTest
     private static final String[] EXCLUDES = new String[] { "org/codehaus/plexus/util/xml/Xpp3Dom",
         "org/codehaus/plexus/util/xml/pull.*" };
 
+    public void testOverlappingResourcesAreLogged() throws IOException, MojoExecutionException {
+        final DefaultShader shader = new DefaultShader();
+        final List<String> debugMessages = new ArrayList<>();
+        final List<String> warnMessages = new ArrayList<>();
+        shader.enableLogging( new AbstractLogger(
+                Logger.LEVEL_INFO, "TEST_DefaultShaderTest_testOverlappingResourcesAreLogged" )
+        {
+            @Override
+            public void debug( final String s, final Throwable throwable )
+            {
+                debugMessages.add(s);
+            }
+
+            @Override
+            public void info( final String s, final Throwable throwable )
+            {
+                // no-op
+            }
+
+            @Override
+            public void warn( final String s, final Throwable throwable )
+            {
+                warnMessages.add(s);
+            }
+
+            @Override
+            public void error( final String s, final Throwable throwable )
+            {
+                // no-op
+            }
+
+            @Override
+            public void fatalError( final String s, final Throwable throwable )
+            {
+                // no-op
+            }
+
+            @Override
+            public Logger getChildLogger( final String s )
+            {
+                return this;
+            }
+        });
+
+        // we will shade two jars and expect to see META-INF/MANIFEST.MF overlaps, this will always be true
+        // but this can lead to a broken deployment if intended for OSGi or so, so even this should be logged
+        final 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" ) );
+
+        final ShadeRequest shadeRequest = new ShadeRequest();
+        shadeRequest.setJars( set );
+        shadeRequest.setRelocators( Collections.<Relocator>emptyList() );
+        shadeRequest.setResourceTransformers( Collections.<ResourceTransformer>emptyList() );
+        shadeRequest.setFilters( Collections.<Filter>emptyList() );
+        shadeRequest.setUberJar( new File( "target/foo-custom_testOverlappingResourcesAreLogged.jar" ) );
+        shader.shade( shadeRequest );
+
+        final String failureWarnMessage = warnMessages.toString();
+        assertTrue(failureWarnMessage, warnMessages.contains(
+                "test-project-1.0-SNAPSHOT.jar, plexus-utils-1.4.1.jar define 1 overlapping resources: "));
+        assertTrue(failureWarnMessage, warnMessages.contains("  - META-INF/MANIFEST.MF"));
+
+        final String failureDebugMessage = debugMessages.toString();
+        assertTrue(failureDebugMessage, debugMessages.contains(
+                "We have a duplicate META-INF/MANIFEST.MF in src/test/jars/plexus-utils-1.4.1.jar"));
+    }
+
     public void testShaderWithDefaultShadedPattern()
         throws Exception
     {