Commit e7e77a91 authored by Andy Wilkinson's avatar Andy Wilkinson

Align PropertiesLauncher's close behavior with JarLauncher

Previously, PropertiesLauncher would close each archive that it
iterated over when creating its ClassLoader. This was not aligned
with JarLauncher's behaviour and left the ClassLoader with closed
archives. The close was introduced in [1] and became more apparent
following the change to fail operations on closed archives [2].

This commit updates Launcher to remove the close() that was added in
[1]. This aligns the behavior of PropertiesLauncher with JarLauncher
and ensures that the ClassLoader does not have entries backed by
closed archives on its classpath.

Fixes gh-23165

[1] https://github.com/spring-projects/spring-boot/commit/ad72f86bdb9c2a889a76679767e9627de0f2543c
[2] https://github.com/spring-projects/spring-boot/commit/ed7a5db17441bdb37df8e90dc0fa6c52948c008e
parent 3e0096e9
......@@ -80,9 +80,7 @@ public abstract class Launcher {
protected ClassLoader createClassLoader(Iterator<Archive> archives) throws Exception {
List<URL> urls = new ArrayList<>(50);
while (archives.hasNext()) {
Archive archive = archives.next();
urls.add(archive.getUrl());
archive.close();
urls.add(archives.next().getUrl());
}
return createClassLoader(urls.toArray(new URL[0]));
}
......
......@@ -232,12 +232,13 @@ class PropertiesLauncherTests {
@Test
void testUserSpecifiedNestedJarPath() throws Exception {
System.setProperty("loader.path", "nested-jars/app.jar!/foo.jar");
System.setProperty("loader.path", "nested-jars/nested-jar-app.jar!/BOOT-INF/classes/");
System.setProperty("loader.main", "demo.Application");
this.launcher = new PropertiesLauncher();
List<Archive> archives = new ArrayList<>();
this.launcher.getClassPathArchivesIterator().forEachRemaining(archives::add);
assertThat(archives).hasSize(1).areExactly(1, endingWith("foo.jar!/"));
assertThat(ReflectionTestUtils.getField(this.launcher, "paths").toString())
.isEqualTo("[nested-jars/nested-jar-app.jar!/BOOT-INF/classes/]");
this.launcher.launch(new String[0]);
waitFor("Hello World");
}
@Test
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment