From ad7cf48497763a0c035b0c21b3a39801af686adb Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 29 Feb 2016 15:11:28 +0000 Subject: [PATCH] Update Repackager to use Java 8 APIs safely Previously, Repackager used Java 8 APIs without protecting against the possibility of a NoSuchMethodError on earlier versions of Java. This commit wraps the Java 8 APIs in try-catch blocks to ensure that they do not cause a failure on Java versions before 8, while still making full use of Java 8's capabilities when available. Closes gh-5280 --- .../spring-boot-loader-tools/pom.xml | 1 + .../boot/loader/tools/Repackager.java | 49 +++++++++++++++---- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/spring-boot-tools/spring-boot-loader-tools/pom.xml b/spring-boot-tools/spring-boot-loader-tools/pom.xml index fa5721943d..5d9f9bbdf5 100644 --- a/spring-boot-tools/spring-boot-loader-tools/pom.xml +++ b/spring-boot-tools/spring-boot-loader-tools/pom.xml @@ -135,6 +135,7 @@ org.springframework.boot.loader.tools.UsesUnsafeJava org.springframework.lang.UsesJava7 + org.springframework.lang.UsesJava8 diff --git a/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java b/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java index 5059e5f805..0928254727 100644 --- a/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java +++ b/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java @@ -29,6 +29,7 @@ import java.util.jar.JarFile; import java.util.jar.Manifest; import org.springframework.boot.loader.tools.JarWriter.EntryTransformer; +import org.springframework.lang.UsesJava8; /** * Utility class that can be used to repackage an archive so that it can be executed using @@ -339,21 +340,51 @@ public class Repackager { } renamedEntry.setCompressedSize(entry.getCompressedSize()); renamedEntry.setCrc(entry.getCrc()); - if (entry.getCreationTime() != null) { - renamedEntry.setCreationTime(entry.getCreationTime()); - } + setCreationTimeIfPossible(entry, renamedEntry); if (entry.getExtra() != null) { renamedEntry.setExtra(entry.getExtra()); } - if (entry.getLastAccessTime() != null) { - renamedEntry.setLastAccessTime(entry.getLastAccessTime()); - } - if (entry.getLastModifiedTime() != null) { - renamedEntry.setLastModifiedTime(entry.getLastModifiedTime()); - } + setLastAccessTimeIfPossible(entry, renamedEntry); + setLastModifiedTimeIfPossible(entry, renamedEntry); return renamedEntry; } + @UsesJava8 + private void setCreationTimeIfPossible(JarEntry source, JarEntry target) { + try { + if (source.getCreationTime() != null) { + target.setCreationTime(source.getCreationTime()); + } + } + catch (NoSuchMethodError ex) { + // Not running on Java 8. Continue. + } + } + + @UsesJava8 + private void setLastAccessTimeIfPossible(JarEntry source, JarEntry target) { + try { + if (source.getLastAccessTime() != null) { + target.setLastAccessTime(source.getLastAccessTime()); + } + } + catch (NoSuchMethodError ex) { + // Not running on Java 8. Continue. + } + } + + @UsesJava8 + private void setLastModifiedTimeIfPossible(JarEntry source, JarEntry target) { + try { + if (source.getLastModifiedTime() != null) { + target.setLastModifiedTime(source.getLastModifiedTime()); + } + } + catch (NoSuchMethodError ex) { + // Not running on Java 8. Continue. + } + } + } }