private ShadeRequest createShadeSourcesRequest( Set<File> testArtifacts, File testJar, List<Filter> filters, List<Relocator> relocators, List<ResourceTransformer> resourceTransformers ) { ShadeRequest shadeSourcesRequest = shadeRequest( testArtifacts, testJar, filters, relocators, resourceTransformers, this.consistentDates, this.disableJarFileVerification ); shadeSourcesRequest.setShadeSourcesContent( shadeSourcesContent ); return shadeSourcesRequest; }
private List<ResourceTransformer> getResourceTransformers() { if ( transformers == null ) { return Collections.emptyList(); } return Arrays.asList( transformers ); }
public void testShaderWithStaticInitializedClass() throws Exception { Shader s = newShader(); Set<File> set = new LinkedHashSet<File>(); set.add( new File( "src/test/jars/test-artifact-1.0-SNAPSHOT.jar" ) ); List<Relocator> relocators = new ArrayList<Relocator>(); relocators.add( new SimpleRelocator( "org.apache.maven.plugins.shade", null, null, null ) ); List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); List<Filter> filters = new ArrayList<Filter>(); File file = new File( "target/testShaderWithStaticInitializedClass.jar" ); ShadeRequest shadeRequest = new ShadeRequest(); shadeRequest.setJars( set ); shadeRequest.setUberJar( file ); shadeRequest.setFilters( filters ); shadeRequest.setRelocators( relocators ); shadeRequest.setResourceTransformers( resourceTransformers ); s.shade( shadeRequest ); URLClassLoader cl = new URLClassLoader( new URL[] { file.toURI().toURL() } ); Class<?> c = cl.loadClass( "hidden.org.apache.maven.plugins.shade.Lib" ); Object o = c.newInstance(); assertEquals( "foo.bar/baz", c.getDeclaredField( "CONSTANT" ).get( o ) ); }
public void testShaderWithExclusions() throws Exception { File jarFile = new File( getBasedir(), "target/unit/foo-bar.jar" ); Shader s = (Shader) lookup( Shader.ROLE, "default" ); Set<File> set = new LinkedHashSet<File>(); set.add( new File( getBasedir(), "src/test/jars/test-artifact-1.0-SNAPSHOT.jar" ) ); List<Relocator> relocators = new ArrayList<Relocator>(); relocators.add( new SimpleRelocator( "org.codehaus.plexus.util", "hidden", null, Arrays.asList( "org.codehaus.plexus.util.xml.Xpp3Dom", "org.codehaus.plexus.util.xml.pull.*") ) ); List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); List<Filter> filters = new ArrayList<Filter>(); ShadeRequest shadeRequest = new ShadeRequest(); shadeRequest.setJars( set ); shadeRequest.setUberJar( jarFile ); shadeRequest.setFilters( filters ); shadeRequest.setRelocators( relocators ); shadeRequest.setResourceTransformers( resourceTransformers ); s.shade( shadeRequest ); ClassLoader cl = new URLClassLoader( new URL[]{ jarFile.toURI().toURL() } ); Class<?> c = cl.loadClass( "org.apache.maven.plugins.shade.Lib" ); Field field = c.getDeclaredField( "CLASS_REALM_PACKAGE_IMPORT" ); assertEquals( "org.codehaus.plexus.util.xml.pull", field.get( null ) ); Method method = c.getDeclaredMethod( "getClassRealmPackageImport", new Class[0] ); assertEquals( "org.codehaus.plexus.util.xml.pull", method.invoke( null, new Object[0] ) ); }
private boolean resourceTransformed(List<ResourceTransformer> resourceTransformers, String name, InputStream is, List<Relocator> relocators) throws IOException { for (ResourceTransformer transformer : resourceTransformers) { if (transformer.canTransformResource(name)) { getLogger().debug("Transforming " + name + " using " + transformer.getClass().getName()); transformer.processResource(name, is, relocators); return true; } } return false; }
public List<ResourceTransformer> getResourceTransformers() { return resourceTransformers; }
private void shadeJars( ShadeRequest shadeRequest, Set<String> resources, List<ResourceTransformer> transformers, RelocatorRemapper remapper, JarOutputStream jos, Multimap<String, File> duplicates ) throws IOException, MojoExecutionException { for ( File jar : shadeRequest.getJars() ) { getLogger().debug( "Processing JAR " + jar ); List<Filter> jarFilters = getFilters( jar, shadeRequest.getFilters() ); JarFile jarFile = newJarFile( jar, shadeRequest.isDisableJarFileVerification() ); try { for ( Enumeration<JarEntry> j = jarFile.entries(); j.hasMoreElements(); ) { JarEntry entry = j.nextElement(); String name = entry.getName(); if ( "META-INF/INDEX.LIST".equals( name ) ) { // we cannot allow the jar indexes to be copied over or the // jar is useless. Ideally, we could create a new one // later continue; } if ( !entry.isDirectory() && !isFiltered( jarFilters, name ) ) { shadeSingleJar( shadeRequest, resources, transformers, remapper, jos, duplicates, jar, jarFile, entry, name ); } } } finally { jarFile.close(); } } }
private void shadeSingleJar( ShadeRequest shadeRequest, Set<String> resources, List<ResourceTransformer> transformers, RelocatorRemapper remapper, JarOutputStream jos, Multimap<String, File> duplicates, File jar, JarFile jarFile, JarEntry entry, String name ) throws IOException, MojoExecutionException { InputStream in = null; try { in = jarFile.getInputStream( entry ); String mappedName = remapper.map( name ); int idx = mappedName.lastIndexOf( '/' ); if ( idx != -1 ) { // make sure dirs are created String dir = mappedName.substring( 0, idx ); if ( !resources.contains( dir ) ) { addDirectory( resources, jos, dir, shadeRequest.isConsistentDates() ); } } if ( name.endsWith( ".class" ) ) { duplicates.put( name, jar ); addRemappedClass( remapper, jos, jar, name, in, shadeRequest.isConsistentDates() ); } else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) ) { // Avoid duplicates if ( resources.contains( mappedName ) ) { return; } addJavaSource( resources, jos, mappedName, in, shadeRequest.getRelocators(), shadeRequest.isConsistentDates() ); } else { if ( !resourceTransformed( transformers, mappedName, in, shadeRequest.getRelocators() ) ) { // Avoid duplicates that aren't accounted for by the resource transformers if ( resources.contains( mappedName ) ) { return; } addResource( resources, jos, mappedName, entry.getTime(), shadeRequest.isConsistentDates(), in ); } } in.close(); in = null; } finally { IOUtil.close( in ); } }
private void goThroughAllJarEntriesForManifestTransformer( ShadeRequest shadeRequest, Set<String> resources, ResourceTransformer manifestTransformer, JarOutputStream jos ) throws IOException { if ( manifestTransformer != null ) { for ( File jar : shadeRequest.getJars() ) { JarFile jarFile = newJarFile( jar, shadeRequest.isConsistentDates() ); try { for ( Enumeration<JarEntry> en = jarFile.entries(); en.hasMoreElements(); ) { JarEntry entry = en.nextElement(); String resource = entry.getName(); if ( manifestTransformer.canTransformResource( resource ) ) { resources.add( resource ); InputStream inputStream = jarFile.getInputStream( entry ); try { manifestTransformer.processResource( resource, inputStream, shadeRequest.getRelocators() ); } finally { inputStream.close(); } break; } } } finally { jarFile.close(); } } if ( manifestTransformer.hasTransformedResource() ) { manifestTransformer.modifyOutputStream( jos, shadeRequest.isConsistentDates() ); } } }
public void testShaderWithRelocatedClassname() throws Exception { DefaultShader s = newShader(); 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" ) ); List<Relocator> relocators = new ArrayList<Relocator>(); relocators.add( new SimpleRelocator( "org/codehaus/plexus/util/", "_plexus/util/__", null, Arrays.<String> asList() ) ); List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); resourceTransformers.add( new ComponentsXmlResourceTransformer() ); List<Filter> filters = new ArrayList<Filter>(); File file = new File( "target/foo-relocate-class.jar" ); ShadeRequest shadeRequest = new ShadeRequest(); shadeRequest.setJars( set ); shadeRequest.setUberJar( file ); shadeRequest.setFilters( filters ); shadeRequest.setRelocators( relocators ); shadeRequest.setResourceTransformers( resourceTransformers ); s.shade( shadeRequest ); URLClassLoader cl = new URLClassLoader( new URL[] { file.toURI().toURL() } ); Class<?> c = cl.loadClass( "_plexus.util.__StringUtils" ); // first, ensure it works: Object o = c.newInstance(); assertEquals( "", c.getMethod( "clean", String.class ).invoke( o, (String) null ) ); // now, check that its source file was rewritten: final String[] source = { null }; final ClassReader classReader = new ClassReader( cl.getResourceAsStream( "_plexus/util/__StringUtils.class" ) ); classReader.accept( new ClassVisitor( Opcodes.ASM4 ) { @Override public void visitSource( String arg0, String arg1 ) { super.visitSource( arg0, arg1 ); source[0] = arg0; } }, ClassReader.SKIP_CODE ); assertEquals( "__StringUtils.java", source[0] ); }
private void shaderWithPattern( String shadedPattern, File jar, String[] excludes ) throws Exception { DefaultShader s = newShader(); 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" ) ); List<Relocator> relocators = new ArrayList<Relocator>(); relocators.add( new SimpleRelocator( "org/codehaus/plexus/util", shadedPattern, null, Arrays.asList( excludes ) ) ); List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); resourceTransformers.add( new ComponentsXmlResourceTransformer() ); List<Filter> filters = new ArrayList<Filter>(); ShadeRequest shadeRequest = new ShadeRequest(); shadeRequest.setJars( set ); shadeRequest.setUberJar( jar ); shadeRequest.setFilters( filters ); shadeRequest.setRelocators( relocators ); shadeRequest.setResourceTransformers( resourceTransformers ); s.shade( shadeRequest ); }
public void shaderWithPattern( String shadedPattern, File jar ) throws Exception { Shader s = (Shader) lookup( Shader.ROLE ); Set<File> set = new LinkedHashSet<File>(); set.add( new File( getBasedir(), "src/test/jars/test-project-1.0-SNAPSHOT.jar" ) ); set.add( new File( getBasedir(), "src/test/jars/plexus-utils-1.4.1.jar" ) ); List<Relocator> relocators = new ArrayList<Relocator>(); relocators.add( new SimpleRelocator( "org/codehaus/plexus/util", shadedPattern, null, Arrays.asList( "org/codehaus/plexus/util/xml/Xpp3Dom", "org/codehaus/plexus/util/xml/pull.*") ) ); List<ResourceTransformer> resourceTransformers = new ArrayList<ResourceTransformer>(); resourceTransformers.add( new ComponentsXmlResourceTransformer() ); List<Filter> filters = new ArrayList<Filter>(); ShadeRequest shadeRequest = new ShadeRequest(); shadeRequest.setJars( set ); shadeRequest.setUberJar( jar ); shadeRequest.setFilters( filters ); shadeRequest.setRelocators( relocators ); shadeRequest.setResourceTransformers( resourceTransformers ); s.shade( shadeRequest ); }
/** * The transformers. * * @param resourceTransformers */ public void setResourceTransformers( List<ResourceTransformer> resourceTransformers ) { this.resourceTransformers = resourceTransformers; }