View Javadoc
1   package org.apache.maven.plugins.shade;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author Jason van Zyl
46   * @author Mauro Talevi
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         // FIXME: shaded jar should not include references to org/codehaus/* (empty dirs) or org.codehaus.* META-INF
104         // files.
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         // first, ensure it works:
145         Object o = c.newInstance();
146         assertEquals( "", c.getMethod( "clean", String.class ).invoke( o, (String) null ) );
147 
148         // now, check that its source file was rewritten:
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 }