2020 */
2121
2222import java .io .File ;
23+ import java .io .FileOutputStream ;
2324import java .io .IOException ;
25+ import java .lang .reflect .Field ;
2426import java .net .URL ;
2527import java .net .URLClassLoader ;
28+ import java .nio .charset .StandardCharsets ;
2629import java .util .ArrayList ;
2730import java .util .Arrays ;
2831import java .util .Collections ;
2932import java .util .LinkedHashSet ;
3033import java .util .List ;
3134import java .util .Set ;
35+ import java .util .jar .JarEntry ;
36+ import java .util .jar .JarOutputStream ;
3237
3338import junit .framework .TestCase ;
3439
3540import org .apache .maven .plugin .MojoExecutionException ;
3641import org .apache .maven .plugins .shade .filter .Filter ;
3742import org .apache .maven .plugins .shade .relocation .Relocator ;
3843import org .apache .maven .plugins .shade .relocation .SimpleRelocator ;
44+ import org .apache .maven .plugins .shade .resource .AppendingTransformer ;
3945import org .apache .maven .plugins .shade .resource .ComponentsXmlResourceTransformer ;
46+ import org .apache .maven .plugins .shade .resource .ManifestResourceTransformer ;
4047import org .apache .maven .plugins .shade .resource .ResourceTransformer ;
4148import org .codehaus .plexus .logging .AbstractLogger ;
4249import org .codehaus .plexus .logging .Logger ;
4350import org .codehaus .plexus .logging .console .ConsoleLogger ;
51+ import org .junit .Rule ;
52+ import org .junit .rules .TemporaryFolder ;
4453import org .objectweb .asm .ClassReader ;
4554import org .objectweb .asm .ClassVisitor ;
4655import 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