diff --git a/pom.xml b/pom.xml
index a04591e1..7ad0742c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,7 +88,34 @@
-
+
+
+ org.ow2.asm
+ asm
+ ${asmVersion}
+
+
+ org.ow2.asm
+ asm-commons
+ ${asmVersion}
+
+
+ org.jdom
+ jdom2
+ 2.0.6.1
+
+
+ org.vafer
+ jdependency
+ 2.15
+
+
+ org.codehaus.plexus
+ plexus-utils
+ 3.6.0
+
+
+
org.apache.maven
maven-plugin-api
@@ -119,58 +146,17 @@
3.15.2
provided
-
-
-
- org.codehaus.plexus
- plexus-utils
- 3.6.0
-
-
-
javax.inject
javax.inject
1
provided
-
-
org.slf4j
slf4j-api
${slf4j.version}
-
-
- org.ow2.asm
- asm
- ${asmVersion}
-
-
- org.ow2.asm
- asm-commons
- ${asmVersion}
-
-
-
- org.jdom
- jdom2
- 2.0.6.1
-
-
- org.apache.commons
- commons-compress
- 1.28.0
-
-
- commons-io
- commons-io
- 2.21.0
-
-
- org.vafer
- jdependency
- 2.15
+ provided
@@ -228,6 +214,12 @@
3.5.1
test
+
+ commons-io
+ commons-io
+ 2.21.0
+ test
+
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 5400b42e..d4f99674 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -30,6 +30,8 @@
import java.io.OutputStreamWriter;
import java.io.PushbackInputStream;
import java.io.Writer;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
@@ -56,9 +58,6 @@
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
-import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
-import org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp;
-import org.apache.commons.compress.archivers.zip.ZipExtraField;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.shade.filter.Filter;
import org.apache.maven.plugins.shade.relocation.Relocator;
@@ -95,23 +94,41 @@ public DefaultShader(final Logger logger) {
// workaround for MSHADE-420
private long getTime(ZipEntry entry) {
- if (entry.getExtra() != null) {
- try {
- ZipExtraField[] fields =
- ExtraFieldUtils.parse(entry.getExtra(), true, ExtraFieldUtils.UnparseableExtraField.SKIP);
- for (ZipExtraField field : fields) {
- if (X5455_ExtendedTimestamp.HEADER_ID.equals(field.getHeaderId())) {
- // extended timestamp extra field: need to translate UTC to local time for Reproducible Builds
- Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(entry.getTime());
- return entry.getTime() - (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET));
- }
+ if (entry.getLastModifiedTime() == null) {
+ return -1;
+ }
+ long mtime = entry.getLastModifiedTime().toMillis();
+ if (hasX5455ExtendedTimestamp(entry)) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTimeInMillis(mtime);
+ mtime = mtime - (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET));
+ }
+ return mtime;
+ }
+
+ /**
+ * Returns {@code true} if passed in {@link ZipEntry} has extra data that contains the extended timestamp (0x5455).
+ *
+ * @see X5455_ExtendedTimestamp
+ */
+ private static boolean hasX5455ExtendedTimestamp(ZipEntry zipEntry) {
+ if (zipEntry.getExtra() != null) {
+ ByteBuffer extraData = ByteBuffer.wrap(zipEntry.getExtra());
+ extraData.order(ByteOrder.LITTLE_ENDIAN);
+ while (extraData.hasRemaining()) {
+ int id = extraData.getShort() & 0xffff;
+ int length = extraData.getShort() & 0xffff;
+
+ if (id == 0x5455) {
+ // Extended TS is present
+ return true;
+ } else {
+ // skip to next
+ extraData.position(extraData.position() + length);
}
- } catch (ZipException ze) {
- // ignore
}
}
- return entry.getTime();
+ return false;
}
public void shade(ShadeRequest shadeRequest) throws IOException, MojoExecutionException {
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
index 9b354dd2..ec8f521a 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
@@ -30,8 +30,8 @@
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-import org.apache.commons.io.IOUtils;
import org.apache.maven.plugins.shade.relocation.Relocator;
+import org.codehaus.plexus.util.IOUtil;
/**
* Resources transformer that relocates classes in META-INF/services and appends entries in META-INF/services resources
@@ -97,7 +97,7 @@ public void modifyOutputStream(JarOutputStream jos) throws IOException {
jarEntry.setTime(time);
jos.putNextEntry(jarEntry);
- IOUtils.writeLines(data, "\n", jos, StandardCharsets.UTF_8);
+ IOUtil.copy((String.join("\n", data) + "\n").getBytes(StandardCharsets.UTF_8), jos);
jos.flush();
data.clear();
}
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/SisuIndexResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/SisuIndexResourceTransformer.java
index 380acbe6..ac4cbc2a 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/SisuIndexResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/SisuIndexResourceTransformer.java
@@ -27,8 +27,8 @@
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-import org.apache.commons.io.IOUtils;
import org.apache.maven.plugins.shade.relocation.Relocator;
+import org.codehaus.plexus.util.IOUtil;
/**
* Resource transformer that relocates classes in {@code META-INF/sisu/javax.inject.Named} and appends resources
@@ -78,7 +78,7 @@ public void modifyOutputStream(final JarOutputStream jos) throws IOException {
JarEntry jarEntry = new JarEntry(SISU_INDEX_PATH);
jarEntry.setTime(time);
jos.putNextEntry(jarEntry);
- IOUtils.writeLines(indexEntries, "\n", jos, StandardCharsets.UTF_8);
+ IOUtil.copy((String.join("\n", indexEntries) + "\n").getBytes(StandardCharsets.UTF_8), jos);
jos.flush();
indexEntries.clear();
}