1 package org.apache.maven.plugins.shade;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.net.URL;
24 import java.net.URLClassLoader;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.LinkedHashSet;
28 import java.util.List;
29 import java.util.Set;
30
31 import junit.framework.TestCase;
32
33 import org.apache.maven.plugins.shade.filter.Filter;
34 import org.apache.maven.plugins.shade.relocation.Relocator;
35 import org.apache.maven.plugins.shade.relocation.SimpleRelocator;
36 import org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer;
37 import org.apache.maven.plugins.shade.resource.ResourceTransformer;
38 import org.codehaus.plexus.logging.Logger;
39 import org.codehaus.plexus.logging.console.ConsoleLogger;
40 import org.objectweb.asm.ClassReader;
41 import org.objectweb.asm.ClassVisitor;
42 import org.objectweb.asm.Opcodes;
43
44
45
46
47
48 public class DefaultShaderTest
49 extends TestCase
50 {
51 private static final String[] EXCLUDES = new String[] { "org/codehaus/plexus/util/xml/Xpp3Dom",
52 "org/codehaus/plexus/util/xml/pull.*" };
53
54 public void testShaderWithDefaultShadedPattern()
55 throws Exception
56 {
57 shaderWithPattern( null, new File( "target/foo-default.jar" ), EXCLUDES );
58 }
59
60 public void testShaderWithStaticInitializedClass()
61 throws Exception
62 {
63 Shader s = newShader();
64
65 Set<File> set = new LinkedHashSet<File>();
66
67 set.add( new File( "src/test/jars/test-artifact-1.0-SNAPSHOT.jar" ) );
68
69 List<Relocator> relocators = new ArrayList<Relocator>();
70
71 relocators.add( new SimpleRelocator( "org.apache.maven.plugins.shade", null, null, null ) );
72
73 List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>();
74
75 List<Filter> filters = new ArrayList<Filter>();
76
77 File file = new File( "target/testShaderWithStaticInitializedClass.jar" );
78
79 ShadeRequest shadeRequest = new ShadeRequest();
80 shadeRequest.setJars( set );
81 shadeRequest.setUberJar( file );
82 shadeRequest.setFilters( filters );
83 shadeRequest.setRelocators( relocators );
84 shadeRequest.setResourceTransformers( resourceTransformers );
85
86 s.shade( shadeRequest );
87
88 URLClassLoader cl = new URLClassLoader( new URL[] { file.toURI().toURL() } );
89 Class<?> c = cl.loadClass( "hidden.org.apache.maven.plugins.shade.Lib" );
90 Object o = c.newInstance();
91 assertEquals( "foo.bar/baz", c.getDeclaredField( "CONSTANT" ).get( o ) );
92 }
93
94 public void testShaderWithCustomShadedPattern()
95 throws Exception
96 {
97 shaderWithPattern( "org/shaded/plexus/util", new File( "target/foo-custom.jar" ), EXCLUDES );
98 }
99
100 public void testShaderWithoutExcludesShouldRemoveReferencesOfOriginalPattern()
101 throws Exception
102 {
103
104
105 shaderWithPattern( "org/shaded/plexus/util", new File( "target/foo-custom-without-excludes.jar" ),
106 new String[] {} );
107 }
108
109 public void testShaderWithRelocatedClassname()
110 throws Exception
111 {
112 DefaultShader s = newShader();
113
114 Set<File> set = new LinkedHashSet<File>();
115
116 set.add( new File( "src/test/jars/test-project-1.0-SNAPSHOT.jar" ) );
117
118 set.add( new File( "src/test/jars/plexus-utils-1.4.1.jar" ) );
119
120 List<Relocator> relocators = new ArrayList<Relocator>();
121
122 relocators.add( new SimpleRelocator( "org/codehaus/plexus/util/", "_plexus/util/__", null,
123 Arrays.<String> asList() ) );
124
125 List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>();
126
127 resourceTransformers.add( new ComponentsXmlResourceTransformer() );
128
129 List<Filter> filters = new ArrayList<Filter>();
130
131 File file = new File( "target/foo-relocate-class.jar" );
132
133 ShadeRequest shadeRequest = new ShadeRequest();
134 shadeRequest.setJars( set );
135 shadeRequest.setUberJar( file );
136 shadeRequest.setFilters( filters );
137 shadeRequest.setRelocators( relocators );
138 shadeRequest.setResourceTransformers( resourceTransformers );
139
140 s.shade( shadeRequest );
141
142 URLClassLoader cl = new URLClassLoader( new URL[] { file.toURI().toURL() } );
143 Class<?> c = cl.loadClass( "_plexus.util.__StringUtils" );
144
145 Object o = c.newInstance();
146 assertEquals( "", c.getMethod( "clean", String.class ).invoke( o, (String) null ) );
147
148
149 final String[] source = { null };
150 final ClassReader classReader = new ClassReader( cl.getResourceAsStream( "_plexus/util/__StringUtils.class" ) );
151 classReader.accept( new ClassVisitor( Opcodes.ASM4 )
152 {
153 @Override
154 public void visitSource( String arg0, String arg1 )
155 {
156 super.visitSource( arg0, arg1 );
157 source[0] = arg0;
158 }
159 }, ClassReader.SKIP_CODE );
160 assertEquals( "__StringUtils.java", source[0] );
161 }
162
163 private void shaderWithPattern( String shadedPattern, File jar, String[] excludes )
164 throws Exception
165 {
166 DefaultShader s = newShader();
167
168 Set<File> set = new LinkedHashSet<File>();
169
170 set.add( new File( "src/test/jars/test-project-1.0-SNAPSHOT.jar" ) );
171
172 set.add( new File( "src/test/jars/plexus-utils-1.4.1.jar" ) );
173
174 List<Relocator> relocators = new ArrayList<Relocator>();
175
176 relocators.add( new SimpleRelocator( "org/codehaus/plexus/util", shadedPattern, null, Arrays.asList( excludes ) ) );
177
178 List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>();
179
180 resourceTransformers.add( new ComponentsXmlResourceTransformer() );
181
182 List<Filter> filters = new ArrayList<Filter>();
183
184 ShadeRequest shadeRequest = new ShadeRequest();
185 shadeRequest.setJars( set );
186 shadeRequest.setUberJar( jar );
187 shadeRequest.setFilters( filters );
188 shadeRequest.setRelocators( relocators );
189 shadeRequest.setResourceTransformers( resourceTransformers );
190
191 s.shade( shadeRequest );
192 }
193
194 private static DefaultShader newShader()
195 {
196 DefaultShader s = new DefaultShader();
197
198 s.enableLogging( new ConsoleLogger( Logger.LEVEL_INFO, "TEST" ) );
199
200 return s;
201 }
202
203 }