diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarURLConnection.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarURLConnection.java index d2c9a62a6dd..ce4b558dbbb 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarURLConnection.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/JarURLConnection.java @@ -73,7 +73,11 @@ class JarURLConnection extends java.net.JarURLConnection { // What we pass to super is ultimately ignored super(EMPTY_JAR_URL); this.url = url; - String spec = url.getFile().substring(jarFile.getUrl().getFile().length()); + String urlFile = url.getFile(); + if (urlFile.startsWith("file://")) { + urlFile = "file:" + urlFile.substring("file://".length()); + } + String spec = urlFile.substring(jarFile.getUrl().getFile().length()); int separator; while ((separator = spec.indexOf(SEPARATOR)) > 0) { jarFile = getNestedJarFile(jarFile, spec.substring(0, separator)); diff --git a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/JarFileTests.java b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/JarFileTests.java index e2b728589df..e58237a54dc 100644 --- a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/JarFileTests.java +++ b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/JarFileTests.java @@ -334,6 +334,22 @@ public class JarFileTests { assertThat(connection.getEntryName(), equalTo("2.dat")); } + @Test + public void createNonNestedUrlFromStringCreatedUsingPath() throws Exception { + // gh-5287 + JarFile.registerUrlProtocolHandler(); + String spec = "jar:" + this.rootJarFile.toPath().toUri() + "!/2.dat"; + URL url = new URL(spec); + assertThat(url.toString(), equalTo(spec)); + InputStream inputStream = url.openStream(); + assertThat(inputStream, notNullValue()); + assertThat(inputStream.read(), equalTo(2)); + JarURLConnection connection = (JarURLConnection) url.openConnection(); + assertThat(connection.getURL().toString(), equalTo(spec)); + assertThat(connection.getJarFileURL().toURI(), equalTo(this.rootJarFile.toURI())); + assertThat(connection.getEntryName(), equalTo("2.dat")); + } + @Test public void getDirectoryInputStream() throws Exception { InputStream inputStream = this.jarFile