Skip to content

Commit 5f45ecf

Browse files
authored
[MSHADE-431] Use a caching output stream (#158)
Use a caching output stream to avoid overwriting the file if not needed
1 parent 31d3506 commit 5f45ecf

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.io.BufferedOutputStream;
2323
import java.io.ByteArrayInputStream;
2424
import java.io.File;
25-
import java.io.FileOutputStream;
2625
import java.io.IOException;
2726
import java.io.InputStream;
2827
import java.io.InputStreamReader;
@@ -62,6 +61,7 @@
6261
import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
6362
import org.apache.maven.plugins.shade.resource.ResourceTransformer;
6463
import org.codehaus.plexus.util.IOUtil;
64+
import org.codehaus.plexus.util.io.CachingOutputStream;
6565
import org.objectweb.asm.ClassReader;
6666
import org.objectweb.asm.ClassVisitor;
6767
import org.objectweb.asm.ClassWriter;
@@ -116,7 +116,8 @@ public void shade( ShadeRequest shadeRequest )
116116
shadeRequest.getUberJar().getParentFile().mkdirs();
117117

118118
try ( JarOutputStream out =
119-
new JarOutputStream( new BufferedOutputStream( new FileOutputStream( shadeRequest.getUberJar() ) ) ) )
119+
new JarOutputStream( new BufferedOutputStream(
120+
new CachingOutputStream( shadeRequest.getUberJar() ) ) ) )
120121
{
121122
goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, manifestTransformer, out );
122123

src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
import java.net.URL;
2929
import java.net.URLClassLoader;
3030
import java.nio.charset.StandardCharsets;
31+
import java.nio.file.Files;
32+
import java.nio.file.attribute.FileTime;
33+
import java.time.temporal.ChronoUnit;
3134
import java.util.ArrayList;
3235
import java.util.Arrays;
3336
import java.util.Collections;
@@ -343,6 +346,44 @@ public void testShaderWithNestedJar() throws Exception
343346

344347
final String innerJarFileName = "inner.jar";
345348

349+
temporaryFolder.create();
350+
File innerJar = temporaryFolder.newFile( innerJarFileName );
351+
try ( JarOutputStream jos = new JarOutputStream( Files.newOutputStream( innerJar.toPath() ) ) )
352+
{
353+
jos.putNextEntry( new JarEntry( "foo.txt" ) );
354+
jos.write( "c1".getBytes( StandardCharsets.UTF_8 ) );
355+
jos.closeEntry();
356+
}
357+
358+
ShadeRequest shadeRequest = new ShadeRequest();
359+
shadeRequest.setJars( new LinkedHashSet<>( Collections.singleton( innerJar ) ) );
360+
shadeRequest.setFilters( Collections.emptyList() );
361+
shadeRequest.setRelocators( Collections.emptyList() );
362+
shadeRequest.setResourceTransformers( Collections.emptyList() );
363+
File shadedFile = temporaryFolder.newFile( "shaded.jar" );
364+
shadeRequest.setUberJar( shadedFile );
365+
366+
DefaultShader shader = newShader();
367+
shader.shade( shadeRequest );
368+
369+
FileTime lastModified = FileTime.from( Files.getLastModifiedTime( shadedFile.toPath() ).toInstant()
370+
.minus( 5, ChronoUnit.SECONDS ) );
371+
372+
Files.setLastModifiedTime( shadedFile.toPath(), lastModified );
373+
374+
shader.shade(shadeRequest);
375+
assertEquals( lastModified, Files.getLastModifiedTime( shadedFile.toPath() ) );
376+
377+
temporaryFolder.delete();
378+
}
379+
380+
@Test
381+
public void testShaderNoOverwrite() throws Exception
382+
{
383+
TemporaryFolder temporaryFolder = new TemporaryFolder();
384+
385+
final String innerJarFileName = "inner.jar";
386+
346387
temporaryFolder.create();
347388
File innerJar = temporaryFolder.newFile( innerJarFileName );
348389
try ( JarOutputStream jos = new JarOutputStream( new FileOutputStream( innerJar ) ) )

0 commit comments

Comments
 (0)