From f7452b9383c1f27473bcef29610fc75967a06a1d Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 18 Aug 2020 16:45:44 -0700 Subject: [PATCH] Ensure LayoutFactory is not passed an empty file Update `Repackager` to ensure that `getLayout` is called before we backup the source file. This restores earlier behavior that some custom `ModuleFactory` implementations were relying on. Closes gh-22995 --- .../boot/loader/tools/Repackager.java | 1 + .../boot/loader/tools/RepackagerTests.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java index e2a2a7e612..f4879363be 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java @@ -101,6 +101,7 @@ public class Repackager extends Packager { public void repackage(File destination, Libraries libraries, LaunchScript launchScript, FileTime lastModifiedTime) throws IOException { Assert.isTrue(destination != null && !destination.isDirectory(), "Invalid destination"); + getLayout(); // get layout early if (lastModifiedTime != null && getLayout() instanceof War) { throw new IllegalStateException("Reproducible repackaging is not supported with war packaging"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/RepackagerTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/RepackagerTests.java index 1e632563c8..1367231dcb 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/RepackagerTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/test/java/org/springframework/boot/loader/tools/RepackagerTests.java @@ -139,6 +139,15 @@ class RepackagerTests extends AbstractPackagerTests { assertThat(hasLauncherClasses(this.destination)).isTrue(); } + @Test + void layoutFactoryGetsOriginalFile() throws Exception { + this.testJarFile.addClass("a/b/C.class", ClassWithMainMethod.class); + Repackager repackager = createRepackager(this.testJarFile.getFile(), false); + repackager.setLayoutFactory(new TestLayoutFactory()); + repackager.repackage(this.destination, NO_LIBRARIES); + assertThat(hasLauncherClasses(this.destination)).isTrue(); + } + @Test void addLauncherScript() throws Exception { this.testJarFile.addClass("a/b/C.class", ClassWithMainMethod.class); @@ -266,4 +275,14 @@ class RepackagerTests extends AbstractPackagerTests { } + static class TestLayoutFactory implements LayoutFactory { + + @Override + public Layout getLayout(File source) { + assertThat(source.length()).isGreaterThan(0); + return new DefaultLayoutFactory().getLayout(source); + } + + } + }