You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2022/10/20 12:44:49 UTC
[maven-shade-plugin] branch master updated: [MSHADE-431] Use a caching output stream (#158)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git
The following commit(s) were added to refs/heads/master by this push:
new 5f45ecf [MSHADE-431] Use a caching output stream (#158)
5f45ecf is described below
commit 5f45ecf5854d335bcf6d3aec14775df76200527e
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Oct 20 14:44:43 2022 +0200
[MSHADE-431] Use a caching output stream (#158)
Use a caching output stream to avoid overwriting the file if not needed
---
.../apache/maven/plugins/shade/DefaultShader.java | 5 +--
.../maven/plugins/shade/DefaultShaderTest.java | 41 ++++++++++++++++++++++
2 files changed, 44 insertions(+), 2 deletions(-)
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 e8505c5..defa123 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -22,7 +22,6 @@ package org.apache.maven.plugins.shade;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -62,6 +61,7 @@ import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
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 +116,8 @@ public class DefaultShader
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 a709018..ace65a0 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.lang.reflect.Field;
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 class DefaultShaderTest
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 ) ) )