From c0b74119e06e08c2a3a89ee877195b8ee59df5f3 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 24 Mar 2016 15:57:32 +0000 Subject: [PATCH] =?UTF-8?q?Use=20manifest=20from=20class=E2=80=99s=20jar?= =?UTF-8?q?=20when=20defining=20its=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, when defining a package for a class, LaunchedURLClassLoader would use the manifest from the first location that contained the required package. If the package was split across multiple locations, this could lead to the manifest from a jar other than the one that contains the class being used. This commit updates LaunchedURLClassLoader so that it will use the manifest of the jar file that contains the class which triggered the definition of the package. Closes gh-5485 --- .../boot/loader/LaunchedURLClassLoader.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java index 81cc71e671..5609899813 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java @@ -105,7 +105,7 @@ public class LaunchedURLClassLoader extends URLClassLoader { String packageName = className.substring(0, lastDot); if (getPackage(packageName) == null) { try { - definePackage(packageName); + definePackage(className, packageName); } catch (IllegalArgumentException ex) { // Tolerate race condition due to being parallel capable @@ -122,17 +122,19 @@ public class LaunchedURLClassLoader extends URLClassLoader { } } - private void definePackage(final String packageName) { + private void definePackage(final String className, final String packageName) { try { AccessController.doPrivileged(new PrivilegedExceptionAction() { @Override public Object run() throws ClassNotFoundException { String packageEntryName = packageName.replace(".", "/") + "/"; + String classEntryName = className.replace(".", "/") + ".class"; for (URL url : getURLs()) { try { if (url.getContent() instanceof JarFile) { JarFile jarFile = (JarFile) url.getContent(); - if (jarFile.getEntry(packageEntryName) != null + if (jarFile.getEntry(classEntryName) != null + && jarFile.getEntry(packageEntryName) != null && jarFile.getManifest() != null) { definePackage(packageName, jarFile.getManifest(), url);