Author: krosenvold Date: Thu Nov 12 09:24:06 2015 New Revision: 1713986 URL: http://svn.apache.org/viewvc?rev=1713986&view=rev Log: Fixed shoddy handling of closing streams upon errors, might be cause of MSHADE-171
Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java Modified: maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java?rev=1713986&r1=1713985&r2=1713986&view=diff ============================================================================== --- maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java (original) +++ maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java Thu Nov 12 09:24:06 2015 @@ -19,6 +19,23 @@ package org.apache.maven.plugins.shade; * under the License. */ +import com.google.common.base.Joiner; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.shade.filter.Filter; +import org.apache.maven.plugins.shade.relocation.Relocator; +import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer; +import org.apache.maven.plugins.shade.resource.ResourceTransformer; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.codehaus.plexus.util.IOUtil; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.commons.Remapper; +import org.objectweb.asm.commons.RemappingClassAdapter; + import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; @@ -41,24 +58,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipException; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugins.shade.filter.Filter; -import org.apache.maven.plugins.shade.relocation.Relocator; -import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer; -import org.apache.maven.plugins.shade.resource.ResourceTransformer; -import org.codehaus.plexus.component.annotations.Component; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.util.IOUtil; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.commons.Remapper; -import org.objectweb.asm.commons.RemappingClassAdapter; - -import com.google.common.base.Joiner; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; - /** * @author Jason van Zyl */ @@ -89,16 +88,69 @@ public class DefaultShader RelocatorRemapper remapper = new RelocatorRemapper( shadeRequest.getRelocators() ); // noinspection ResultOfMethodCallIgnored - shadeRequest.getUberJar().getParentFile().mkdirs(); + shadeRequest.getUberJar() + .getParentFile() + .mkdirs(); FileOutputStream fileOutputStream = new FileOutputStream( shadeRequest.getUberJar() ); JarOutputStream jos = new JarOutputStream( new BufferedOutputStream( fileOutputStream ) ); - goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, manifestTransformer, jos ); + try + { + + goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, manifestTransformer, jos ); + + // CHECKSTYLE_OFF: MagicNumber + Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 ); + // CHECKSTYLE_ON: MagicNumber + + shadeJars( shadeRequest, resources, transformers, remapper, jos, duplicates ); + + // CHECKSTYLE_OFF: MagicNumber + Multimap<Collection<File>, String> overlapping = HashMultimap.create( 20, 15 ); + // CHECKSTYLE_ON: MagicNumber + + for ( String clazz : duplicates.keySet() ) + { + Collection<File> jarz = duplicates.get( clazz ); + if ( jarz.size() > 1 ) + { + overlapping.put( jarz, clazz ); + } + } + + // Log a summary of duplicates + logSummaryOfDuplicates( overlapping ); + + if ( overlapping.keySet() + .size() > 0 ) + { + showOverlappingWarning(); + } - // CHECKSTYLE_OFF: MagicNumber - Multimap<String, File> duplicates = HashMultimap.create( 10000, 3 ); - // CHECKSTYLE_ON: MagicNumber + for ( ResourceTransformer transformer : transformers ) + { + if ( transformer.hasTransformedResource() ) + { + transformer.modifyOutputStream( jos ); + } + } + } + finally + { + IOUtil.close( jos ); + } + + for ( Filter filter : shadeRequest.getFilters() ) + { + filter.finished(); + } + } + + 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() ) { @@ -108,107 +160,95 @@ public class DefaultShader JarFile jarFile = newJarFile( jar ); - for ( Enumeration<JarEntry> j = jarFile.entries(); j.hasMoreElements(); ) + try { - 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 ) ) + for ( Enumeration<JarEntry> j = jarFile.entries(); j.hasMoreElements(); ) { - InputStream is = jarFile.getInputStream( entry ); + JarEntry entry = j.nextElement(); - String mappedName = remapper.map( name ); + String name = entry.getName(); - int idx = mappedName.lastIndexOf( '/' ); - if ( idx != -1 ) + if ( "META-INF/INDEX.LIST".equals( name ) ) { - // make sure dirs are created - String dir = mappedName.substring( 0, idx ); - if ( !resources.contains( dir ) ) - { - addDirectory( resources, jos, dir ); - } + // 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 ( name.endsWith( ".class" ) ) - { - duplicates.put( name, jar ); - addRemappedClass( remapper, jos, jar, name, is ); - } - else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) ) + if ( !entry.isDirectory() && !isFiltered( jarFilters, name ) ) { - // Avoid duplicates - if ( resources.contains( mappedName ) ) - { - continue; - } - - addJavaSource( resources, jos, mappedName, is, shadeRequest.getRelocators() ); - } - else - { - if ( !resourceTransformed( transformers, mappedName, is, shadeRequest.getRelocators() ) ) - { - // Avoid duplicates that aren't accounted for by the resource transformers - if ( resources.contains( mappedName ) ) - { - continue; - } - - addResource( resources, jos, mappedName, is ); - } + shadeSingleJar( shadeRequest, resources, transformers, remapper, jos, duplicates, jar, jarFile, + entry, name ); } - - IOUtil.close( is ); } - } - - jarFile.close(); - } - // CHECKSTYLE_OFF: MagicNumber - Multimap<Collection<File>, String> overlapping = HashMultimap.create( 20, 15 ); - // CHECKSTYLE_ON: MagicNumber - - for ( String clazz : duplicates.keySet() ) - { - Collection<File> jarz = duplicates.get( clazz ); - if ( jarz.size() > 1 ) + } + finally { - overlapping.put( jarz, clazz ); + jarFile.close(); } } + } - // Log a summary of duplicates - logSummaryOfDuplicates( overlapping ); + 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 is = jarFile.getInputStream( entry ); - if ( overlapping.keySet().size() > 0 ) + try { - showOverlappingWarning(); - } - for ( ResourceTransformer transformer : transformers ) - { - if ( transformer.hasTransformedResource() ) + String mappedName = remapper.map( name ); + + int idx = mappedName.lastIndexOf( '/' ); + if ( idx != -1 ) { - transformer.modifyOutputStream( jos ); + // make sure dirs are created + String dir = mappedName.substring( 0, idx ); + if ( !resources.contains( dir ) ) + { + addDirectory( resources, jos, dir ); + } } - } - IOUtil.close( jos ); + if ( name.endsWith( ".class" ) ) + { + duplicates.put( name, jar ); + addRemappedClass( remapper, jos, jar, name, is ); + } + else if ( shadeRequest.isShadeSourcesContent() && name.endsWith( ".java" ) ) + { + // Avoid duplicates + if ( resources.contains( mappedName ) ) + { + return; + } - for ( Filter filter : shadeRequest.getFilters() ) + addJavaSource( resources, jos, mappedName, is, shadeRequest.getRelocators() ); + } + else + { + if ( !resourceTransformed( transformers, mappedName, is, shadeRequest.getRelocators() ) ) + { + // Avoid duplicates that aren't accounted for by the resource transformers + if ( resources.contains( mappedName ) ) + { + return; + } + + addResource( resources, jos, mappedName, is ); + } + } + + } + finally { - filter.finished(); + IOUtil.close( is ); } } @@ -268,11 +308,13 @@ public class DefaultShader for ( String clazz : overlapping.get( jarz ) ) { - classes.add( clazz.replace( ".class", "" ).replace( "/", "." ) ); + classes.add( clazz.replace( ".class", "" ) + .replace( "/", "." ) ); } //CHECKSTYLE_OFF: LineLength - getLogger().warn( Joiner.on( ", " ).join( jarzS ) + " define " + classes.size() + " overlapping classes: " ); + getLogger().warn( Joiner.on( ", " ) + .join( jarzS ) + " define " + classes.size() + " overlapping classes: " ); //CHECKSTYLE_ON: LineLength int max = 10; @@ -438,7 +480,8 @@ public class DefaultShader { if ( transformer.canTransformResource( name ) ) { - getLogger().debug( "Transforming " + name + " using " + transformer.getClass().getName() ); + getLogger().debug( "Transforming " + name + " using " + transformer.getClass() + .getName() ); transformer.processResource( name, is, relocators );