diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java index e8505c5c..6b9e6f70 100644 --- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java +++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java @@ -62,6 +62,7 @@ import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer; import org.apache.maven.plugins.shade.resource.ResourceTransformer; import org.codehaus.plexus.util.IOUtil; +import org.codehaus.plexus.util.io.CachingOutputStream; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; @@ -116,7 +117,7 @@ public void shade( ShadeRequest shadeRequest ) shadeRequest.getUberJar().getParentFile().mkdirs(); try ( JarOutputStream out = - new JarOutputStream( new BufferedOutputStream( new FileOutputStream( shadeRequest.getUberJar() ) ) ) ) + new JarOutputStream( new BufferedOutputStream( new CachingOutputStream( shadeRequest.getUberJar() ) ) ) ) { goThroughAllJarEntriesForManifestTransformer( shadeRequest, resources, manifestTransformer, out ); diff --git a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java index a7090184..ace65a07 100644 --- a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java +++ b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java @@ -28,6 +28,9 @@ import java.net.URL; import java.net.URLClassLoader; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.attribute.FileTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -343,6 +346,44 @@ public void testShaderWithNestedJar() throws Exception final String innerJarFileName = "inner.jar"; + temporaryFolder.create(); + File innerJar = temporaryFolder.newFile( innerJarFileName ); + try ( JarOutputStream jos = new JarOutputStream( Files.newOutputStream( innerJar.toPath() ) ) ) + { + jos.putNextEntry( new JarEntry( "foo.txt" ) ); + jos.write( "c1".getBytes( StandardCharsets.UTF_8 ) ); + jos.closeEntry(); + } + + ShadeRequest shadeRequest = new ShadeRequest(); + shadeRequest.setJars( new LinkedHashSet<>( Collections.singleton( innerJar ) ) ); + shadeRequest.setFilters( Collections.emptyList() ); + shadeRequest.setRelocators( Collections.emptyList() ); + shadeRequest.setResourceTransformers( Collections.emptyList() ); + File shadedFile = temporaryFolder.newFile( "shaded.jar" ); + shadeRequest.setUberJar( shadedFile ); + + DefaultShader shader = newShader(); + shader.shade( shadeRequest ); + + FileTime lastModified = FileTime.from( Files.getLastModifiedTime( shadedFile.toPath() ).toInstant() + .minus( 5, ChronoUnit.SECONDS ) ); + + Files.setLastModifiedTime( shadedFile.toPath(), lastModified ); + + shader.shade(shadeRequest); + assertEquals( lastModified, Files.getLastModifiedTime( shadedFile.toPath() ) ); + + temporaryFolder.delete(); + } + + @Test + public void testShaderNoOverwrite() throws Exception + { + TemporaryFolder temporaryFolder = new TemporaryFolder(); + + final String innerJarFileName = "inner.jar"; + temporaryFolder.create(); File innerJar = temporaryFolder.newFile( innerJarFileName ); try ( JarOutputStream jos = new JarOutputStream( new FileOutputStream( innerJar ) ) )