From 59de56d66abd65d8fd09447146c0d501021a623c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Tue, 21 Jul 2026 15:11:38 +0200 Subject: [PATCH] Polish "Fix nested archive paths logging in PropertiesLauncher" See gh-50968 --- .../loader/launch/PropertiesLauncher.java | 10 +++--- .../launch/PropertiesLauncherTests.java | 32 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/launch/PropertiesLauncher.java b/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/launch/PropertiesLauncher.java index eddebc7e102..a88c86ce055 100644 --- a/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/launch/PropertiesLauncher.java +++ b/loader/spring-boot-loader/src/main/java/org/springframework/boot/loader/launch/PropertiesLauncher.java @@ -289,11 +289,9 @@ public class PropertiesLauncher extends Launcher { } } - private List getPaths() throws Exception { + private List resolvePaths() throws Exception { String path = getProperty(PATH); - List paths = (path != null) ? parsePathsProperty(path) : Collections.emptyList(); - debug.log("Nested archive paths: %s", paths); - return paths; + return (path != null) ? parsePathsProperty(path) : Collections.emptyList(); } private List parsePathsProperty(String commaSeparatedPaths) { @@ -467,7 +465,9 @@ public class PropertiesLauncher extends Launcher { @Override protected Set getClassPathUrls() throws Exception { Set urls = new LinkedHashSet<>(); - for (String path : getPaths()) { + List paths = resolvePaths(); + debug.log("Nested archive paths: %s", paths); + for (String path : paths) { path = cleanupPath(handleUrl(path)); urls.addAll(getClassPathUrlsForPath(path)); } diff --git a/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/launch/PropertiesLauncherTests.java b/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/launch/PropertiesLauncherTests.java index d434c8ec1b9..403031e803b 100644 --- a/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/launch/PropertiesLauncherTests.java +++ b/loader/spring-boot-loader/src/test/java/org/springframework/boot/loader/launch/PropertiesLauncherTests.java @@ -127,7 +127,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.config.name", "foo"); this.launcher = new PropertiesLauncher(); assertThat(this.launcher.getMainClass()).isEqualTo("my.Application"); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[etc/]"); + assertThat(resolvedPaths()).containsExactly("etc/"); } @Test @@ -141,14 +141,14 @@ class PropertiesLauncherTests extends AbstractLauncherTests { void testUserSpecifiedDotPath() throws Exception { System.setProperty("loader.path", "."); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[.]"); + assertThat(resolvedPaths()).containsExactly("."); } @Test void testUserSpecifiedSlashPath() throws Exception { System.setProperty("loader.path", "jars/"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[jars/]"); + assertThat(resolvedPaths()).containsExactly("jars/"); Set urls = this.launcher.getClassPathUrls(); assertThat(urls).areExactly(1, endingWith("app.jar")); } @@ -158,7 +158,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "jars/*"); System.setProperty("loader.main", "demo.Application"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[jars/]"); + assertThat(resolvedPaths()).containsExactly("jars/"); this.launcher.launch(new String[0]); waitFor("Hello World"); } @@ -168,7 +168,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "jars/app.jar"); System.setProperty("loader.main", "demo.Application"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[jars/app.jar]"); + assertThat(resolvedPaths()).containsExactly("jars/app.jar"); this.launcher.launch(new String[0]); waitFor("Hello World"); } @@ -177,8 +177,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { void testUserSpecifiedRootOfJarPath() throws Exception { System.setProperty("loader.path", "jar:file:./src/test/resources/nested-jars/app.jar!/"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")) - .hasToString("[jar:file:./src/test/resources/nested-jars/app.jar!/]"); + assertThat(resolvedPaths()).containsExactly("jar:file:./src/test/resources/nested-jars/app.jar!/"); Set urls = this.launcher.getClassPathUrls(); assertThat(urls).areExactly(1, endingWith("foo.jar!/")); assertThat(urls).areExactly(1, endingWith("app.jar!/")); @@ -216,8 +215,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "nested-jars/nested-jar-app.jar!/BOOT-INF/classes/"); System.setProperty("loader.main", "demo.Application"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")) - .hasToString("[nested-jars/nested-jar-app.jar!/BOOT-INF/classes/]"); + assertThat(resolvedPaths()).containsExactly("nested-jars/nested-jar-app.jar!/BOOT-INF/classes/"); this.launcher.launch(new String[0]); waitFor("Hello World"); } @@ -236,7 +234,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "./jars/app.jar"); System.setProperty("loader.main", "demo.Application"); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[jars/app.jar]"); + assertThat(resolvedPaths()).containsExactly("jars/app.jar"); this.launcher.launch(new String[0]); waitFor("Hello World"); } @@ -246,7 +244,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "jars/app.jar"); System.setProperty("loader.classLoader", URLClassLoader.class.getName()); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")).hasToString("[jars/app.jar]"); + assertThat(resolvedPaths()).containsExactly("jars/app.jar"); this.launcher.launch(new String[0]); waitFor("Hello World"); } @@ -256,8 +254,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { System.setProperty("loader.path", "more-jars/app.jar,jars/app.jar"); System.setProperty("loader.classLoader", URLClassLoader.class.getName()); this.launcher = new PropertiesLauncher(); - assertThat(ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")) - .hasToString("[more-jars/app.jar, jars/app.jar]"); + assertThat(resolvedPaths()).containsExactly("more-jars/app.jar", "jars/app.jar"); this.launcher.launch(new String[0]); waitFor("Hello Other World"); } @@ -309,7 +306,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { void testArgsEnhanced() throws Exception { System.setProperty("loader.args", "foo"); this.launcher = new PropertiesLauncher(); - assertThat(Arrays.asList(this.launcher.getArgs("bar"))).hasToString("[foo, bar]"); + assertThat(Arrays.asList(this.launcher.getArgs("bar"))).containsExactly("foo", "bar"); } @Test @@ -325,8 +322,7 @@ class PropertiesLauncherTests extends AbstractLauncherTests { manifest.write(manifestStream); } this.launcher = new PropertiesLauncher(); - assertThat((List) ReflectionTestUtils.invokeMethod(this.launcher, "getPaths")) - .containsExactly("/foo.jar", "/bar/"); + assertThat(resolvedPaths()).containsExactly("/foo.jar", "/bar/"); } @Test @@ -447,6 +443,10 @@ class PropertiesLauncherTests extends AbstractLauncherTests { return expected; } + private List resolvedPaths() { + return ReflectionTestUtils.invokeMethod(this.launcher, "resolvePaths"); + } + private Condition endingWith(String value) { return new Condition<>() {