You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2015/11/12 10:24:07 UTC
svn commit: r1713986 -
/maven/plugins/trunk/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
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 );