Skip to content

Commit 34736cc

Browse files
committed
[MSHADE-364] drop duplicate resource warning when the resource is handled by a transformer
1 parent ecaa5ee commit 34736cc

File tree

2 files changed

+134
-49
lines changed

2 files changed

+134
-49
lines changed

src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,10 @@ else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) )
256256

257257
addResource( resources, jos, mappedName, entry.getTime(), in );
258258
}
259+
else
260+
{
261+
duplicates.remove( name, jar );
262+
}
259263
}
260264
}
261265
}
@@ -338,11 +342,25 @@ private void logSummaryOfDuplicates( Multimap<Collection<File>, String> overlapp
338342
final Collection<String> overlaps = new ArrayList<>();
339343
if ( !classes.isEmpty() )
340344
{
341-
overlaps.add( "classes" );
345+
if ( resources.size() == 1 )
346+
{
347+
overlaps.add( "class" );
348+
}
349+
else
350+
{
351+
overlaps.add( "classes" );
352+
}
342353
}
343354
if ( !resources.isEmpty() )
344355
{
345-
overlaps.add( "resources" );
356+
if ( resources.size() == 1 )
357+
{
358+
overlaps.add( "resource" );
359+
}
360+
else
361+
{
362+
overlaps.add( "resources" );
363+
}
346364
}
347365

348366
final List<String> all = new ArrayList<>( classes.size() + resources.size() );

src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java

Lines changed: 114 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,36 @@
2020
*/
2121

2222
import java.io.File;
23+
import java.io.FileOutputStream;
2324
import java.io.IOException;
25+
import java.lang.reflect.Field;
2426
import java.net.URL;
2527
import java.net.URLClassLoader;
28+
import java.nio.charset.StandardCharsets;
2629
import java.util.ArrayList;
2730
import java.util.Arrays;
2831
import java.util.Collections;
2932
import java.util.LinkedHashSet;
3033
import java.util.List;
3134
import java.util.Set;
35+
import java.util.jar.JarEntry;
36+
import java.util.jar.JarOutputStream;
3237

3338
import junit.framework.TestCase;
3439

3540
import org.apache.maven.plugin.MojoExecutionException;
3641
import org.apache.maven.plugins.shade.filter.Filter;
3742
import org.apache.maven.plugins.shade.relocation.Relocator;
3843
import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
44+
import org.apache.maven.plugins.shade.resource.AppendingTransformer;
3945
import org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer;
46+
import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
4047
import org.apache.maven.plugins.shade.resource.ResourceTransformer;
4148
import org.codehaus.plexus.logging.AbstractLogger;
4249
import org.codehaus.plexus.logging.Logger;
4350
import org.codehaus.plexus.logging.console.ConsoleLogger;
51+
import org.junit.Rule;
52+
import org.junit.rules.TemporaryFolder;
4453
import org.objectweb.asm.ClassReader;
4554
import org.objectweb.asm.ClassVisitor;
4655
import org.objectweb.asm.Opcodes;
@@ -57,47 +66,8 @@ public class DefaultShaderTest
5766

5867
public void testOverlappingResourcesAreLogged() throws IOException, MojoExecutionException {
5968
final DefaultShader shader = new DefaultShader();
60-
final List<String> debugMessages = new ArrayList<>();
61-
final List<String> warnMessages = new ArrayList<>();
62-
shader.enableLogging( new AbstractLogger(
63-
Logger.LEVEL_INFO, "TEST_DefaultShaderTest_testOverlappingResourcesAreLogged" )
64-
{
65-
@Override
66-
public void debug( final String s, final Throwable throwable )
67-
{
68-
debugMessages.add( s.replace( '\\', '/' ).trim() );
69-
}
70-
71-
@Override
72-
public void info( final String s, final Throwable throwable )
73-
{
74-
// no-op
75-
}
76-
77-
@Override
78-
public void warn( final String s, final Throwable throwable )
79-
{
80-
warnMessages.add( s.replace( '\\', '/' ).trim() );
81-
}
82-
83-
@Override
84-
public void error( final String s, final Throwable throwable )
85-
{
86-
// no-op
87-
}
88-
89-
@Override
90-
public void fatalError( final String s, final Throwable throwable )
91-
{
92-
// no-op
93-
}
94-
95-
@Override
96-
public Logger getChildLogger( final String s )
97-
{
98-
return this;
99-
}
100-
});
69+
final MockLogger logs = new MockLogger();
70+
shader.enableLogging(logs);
10171

10272
// we will shade two jars and expect to see META-INF/MANIFEST.MF overlaps, this will always be true
10373
// but this can lead to a broken deployment if intended for OSGi or so, so even this should be logged
@@ -113,16 +83,67 @@ public Logger getChildLogger( final String s )
11383
shadeRequest.setUberJar( new File( "target/foo-custom_testOverlappingResourcesAreLogged.jar" ) );
11484
shader.shade( shadeRequest );
11585

116-
final String failureWarnMessage = warnMessages.toString();
117-
assertTrue(failureWarnMessage, warnMessages.contains(
118-
"plexus-utils-1.4.1.jar, test-project-1.0-SNAPSHOT.jar define 1 overlapping resources:"));
119-
assertTrue(failureWarnMessage, warnMessages.contains("- META-INF/MANIFEST.MF"));
86+
final String failureWarnMessage = logs.warnMessages.toString();
87+
assertTrue(failureWarnMessage, logs.warnMessages.contains(
88+
"plexus-utils-1.4.1.jar, test-project-1.0-SNAPSHOT.jar define 1 overlapping resource:"));
89+
assertTrue(failureWarnMessage, logs.warnMessages.contains("- META-INF/MANIFEST.MF"));
12090

121-
final String failureDebugMessage = debugMessages.toString();
122-
assertTrue(failureDebugMessage, debugMessages.contains(
91+
final String failureDebugMessage = logs.debugMessages.toString();
92+
assertTrue(failureDebugMessage, logs.debugMessages.contains(
12393
"We have a duplicate META-INF/MANIFEST.MF in src/test/jars/plexus-utils-1.4.1.jar" ));
12494
}
12595

96+
public void testOverlappingResourcesAreLoggedExceptATransformerHandlesIt() throws Exception {
97+
TemporaryFolder temporaryFolder = new TemporaryFolder();
98+
Set<File> set = new LinkedHashSet<>();
99+
temporaryFolder.create();
100+
File j1 = temporaryFolder.newFile("j1.jar");
101+
try ( JarOutputStream jos = new JarOutputStream(new FileOutputStream( j1 ) ) )
102+
{
103+
jos.putNextEntry(new JarEntry( "foo.txt" ));
104+
jos.write("c1".getBytes(StandardCharsets.UTF_8));
105+
jos.closeEntry();
106+
}
107+
File j2 = temporaryFolder.newFile("j2.jar");
108+
try ( JarOutputStream jos = new JarOutputStream(new FileOutputStream( j2 ) ) )
109+
{
110+
jos.putNextEntry(new JarEntry( "foo.txt" ));
111+
jos.write("c2".getBytes(StandardCharsets.UTF_8));
112+
jos.closeEntry();
113+
}
114+
set.add( j1 );
115+
set.add( j2 );
116+
117+
AppendingTransformer transformer = new AppendingTransformer();
118+
Field resource = AppendingTransformer.class.getDeclaredField( "resource" );
119+
resource.setAccessible( true );
120+
resource.set( transformer, "foo.txt" );
121+
122+
ShadeRequest shadeRequest = new ShadeRequest();
123+
shadeRequest.setJars( set );
124+
shadeRequest.setRelocators( Collections.<Relocator>emptyList() );
125+
shadeRequest.setResourceTransformers( Collections.<ResourceTransformer>singletonList( transformer) );
126+
shadeRequest.setFilters( Collections.<Filter>emptyList() );
127+
shadeRequest.setUberJar( new File( "target/foo-custom_testOverlappingResourcesAreLogged.jar" ) );
128+
129+
DefaultShader shaderWithTransformer = new DefaultShader();
130+
final MockLogger logWithTransformer = new MockLogger();
131+
shaderWithTransformer.enableLogging( logWithTransformer );
132+
shaderWithTransformer.shade( shadeRequest );
133+
134+
DefaultShader shaderWithoutTransformer = new DefaultShader();
135+
MockLogger logWithoutTransformer = new MockLogger();
136+
shaderWithoutTransformer.enableLogging( logWithoutTransformer );
137+
shadeRequest.setResourceTransformers( Collections.<ResourceTransformer>emptyList() );
138+
shaderWithoutTransformer.shade( shadeRequest );
139+
140+
temporaryFolder.delete();
141+
142+
assertTrue(logWithTransformer.warnMessages.toString(), logWithTransformer.warnMessages.isEmpty());
143+
assertTrue(logWithoutTransformer.warnMessages.toString(), logWithoutTransformer.warnMessages.containsAll(
144+
Arrays.<String>asList( "j1.jar, j2.jar define 1 overlapping resource:", "- foo.txt" ) ) );
145+
}
146+
126147
public void testShaderWithDefaultShadedPattern()
127148
throws Exception
128149
{
@@ -274,4 +295,50 @@ private static DefaultShader newShader()
274295
return s;
275296
}
276297

298+
private static class MockLogger extends AbstractLogger
299+
{
300+
private final List<String> debugMessages = new ArrayList<>();
301+
private final List<String> warnMessages = new ArrayList<>();
302+
303+
private MockLogger()
304+
{
305+
super( Logger.LEVEL_INFO, "test" );
306+
}
307+
308+
@Override
309+
public void debug( String s, Throwable throwable )
310+
{
311+
debugMessages.add( s.replace( '\\', '/' ).trim() );
312+
}
313+
314+
@Override
315+
public void info( String s, Throwable throwable )
316+
{
317+
// no-op
318+
}
319+
320+
@Override
321+
public void warn( String s, Throwable throwable )
322+
{
323+
warnMessages.add( s.replace( '\\', '/' ).trim() );
324+
}
325+
326+
@Override
327+
public void error( String s, Throwable throwable )
328+
{
329+
// no-op
330+
}
331+
332+
@Override
333+
public void fatalError( String s, Throwable throwable )
334+
{
335+
// no-op
336+
}
337+
338+
@Override
339+
public Logger getChildLogger( String s )
340+
{
341+
return this;
342+
}
343+
}
277344
}

0 commit comments

Comments
 (0)