From 674022d4014a668f9ff3f2f7837b716667ff6e30 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 17 Aug 2022 11:37:19 -0700 Subject: [PATCH 1/2] Revert "Don't close nested jars or wrapper when parent is closed" This reverts commit 360eb027befd51012614f5938fb9cdc9f557a577. --- .../springframework/boot/loader/jar/JarFile.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java index 65450ce395..65727df35d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java @@ -26,8 +26,11 @@ import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.security.Permission; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; +import java.util.List; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Supplier; @@ -93,6 +96,8 @@ public class JarFile extends AbstractJarFile implements Iterable nestedJars = Collections.synchronizedList(new ArrayList<>()); + /** * Create a new {@link JarFile} backed by the specified file. * @param file the root jar file @@ -335,8 +340,10 @@ public class JarFile extends AbstractJarFile implements Iterable Date: Wed, 17 Aug 2022 11:38:42 -0700 Subject: [PATCH 2/2] Revert "Don't close jar files early" This reverts commit b42f056ddbfd5041ef80d2d909dd2f5e51ec3ff0. --- .../boot/loader/jar/JarFile.java | 42 ++++++------------- .../boot/loader/jar/JarFileWrapper.java | 5 ++- .../boot/loader/jar/JarURLConnection.java | 18 +------- .../boot/loader/jar/JarFileWrapperTests.java | 3 +- .../spring-boot-loader-tests/build.gradle | 16 +------ .../build.gradle | 22 ---------- .../settings.gradle | 15 ------- .../LoaderSignedJarTestApplication.java | 36 ---------------- .../boot/loader/LoaderIntegrationTests.java | 29 ++++--------- 9 files changed, 28 insertions(+), 158 deletions(-) delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar-unpack-app/build.gradle delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar-unpack-app/settings.gradle delete mode 100644 spring-boot-tests/spring-boot-integration-tests/spring-boot-loader-tests/spring-boot-loader-tests-signed-jar-unpack-app/src/main/java/org/springframework/boot/loaderapp/LoaderSignedJarTestApplication.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java index 65727df35d..81386386f9 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,11 +26,8 @@ import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.security.Permission; -import java.util.ArrayList; -import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; -import java.util.List; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Supplier; @@ -96,8 +93,6 @@ public class JarFile extends AbstractJarFile implements Iterable nestedJars = Collections.synchronizedList(new ArrayList<>()); - /** * Create a new {@link JarFile} backed by the specified file. * @param file the root jar file @@ -133,6 +128,9 @@ public class JarFile extends AbstractJarFile implements Iterable manifestSupplier) throws IOException { super(rootFile.getFile()); + if (System.getSecurityManager() == null) { + super.close(); + } this.rootFile = rootFile; this.pathFromRoot = pathFromRoot; CentralDirectoryParser parser = new CentralDirectoryParser(); @@ -144,7 +142,8 @@ public class JarFile extends AbstractJarFile implements Iterable container = createContainer(javaRuntime, "spring-boot-loader-tests-app")) { + try (GenericContainer container = createContainer(javaRuntime)) { container.start(); System.out.println(this.output.toUtf8String()); assertThat(this.output.toUtf8String()).contains(">>>>> 287649 BYTES from").doesNotContain("WARNING:") @@ -59,32 +59,17 @@ class LoaderIntegrationTests { } } - @ParameterizedTest - @MethodSource("javaRuntimes") - void runSignedJarWhenUnpacked(JavaRuntime javaRuntime) { - try (GenericContainer container = createContainer(javaRuntime, - "spring-boot-loader-tests-signed-jar-unpack-app")) { - container.start(); - System.out.println(this.output.toUtf8String()); - assertThat(this.output.toUtf8String()).contains("Legion of the Bouncy Castle"); - } - } - - private GenericContainer createContainer(JavaRuntime javaRuntime, String name) { + private GenericContainer createContainer(JavaRuntime javaRuntime) { return javaRuntime.getContainer().withLogConsumer(this.output) - .withCopyFileToContainer(findApplication(name), "/app.jar") + .withCopyFileToContainer(MountableFile.forHostPath(findApplication().toPath()), "/app.jar") .withStartupCheckStrategy(new OneShotStartupCheckStrategy().withTimeout(Duration.ofMinutes(5))) .withCommand("java", "-jar", "app.jar"); } - private MountableFile findApplication(String name) { - return MountableFile.forHostPath(findJarFile(name).toPath()); - } - - private File findJarFile(String name) { - String path = String.format("build/%1$s/build/libs/%1$s.jar", name); - File jar = new File(path); - Assert.state(jar.isFile(), () -> "Could not find " + path + ". Have you built it?"); + private File findApplication() { + String name = String.format("build/%1$s/build/libs/%1$s.jar", "spring-boot-loader-tests-app"); + File jar = new File(name); + Assert.state(jar.isFile(), () -> "Could not find " + name + ". Have you built it?"); return jar; }