From 83ecf674556edbc608dcea28dbac7e82faa4b545 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 18 Sep 2026 20:58:46 +0200 Subject: [PATCH] Match manifest-specified jar names with pre-encoded escape sequence Closes gh-37280 --- .../support/PathMatchingResourcePatternResolver.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java index 6a81602871d..1ead45e040b 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java @@ -1294,6 +1294,16 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol static ClassPathManifestEntry of(File file, @Nullable Boolean useCaches) throws MalformedURLException { String path = fixPath(file.getAbsolutePath()); Resource resource = asJarFileResource(path, useCaches); + if (!resource.exists()) { + String encodedPath = fixPath(StringUtils.replace(file.getAbsolutePath(), "%", "%25")); + if (!encodedPath.equals(path)) { + Resource encodedResource = asJarFileResource(encodedPath, useCaches); + if (encodedResource.exists()) { + path = encodedPath; + resource = encodedResource; + } + } + } Resource alternative = createAlternative(path, useCaches); return new ClassPathManifestEntry(resource, alternative); } @@ -1316,7 +1326,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol */ private static @Nullable Resource createAlternative(String path, @Nullable Boolean useCaches) { try { - String alternativePath = path.startsWith("/") ? path.substring(1) : "/" + path; + String alternativePath = (path.startsWith("/") ? path.substring(1) : "/" + path); return asJarFileResource(alternativePath, useCaches); } catch (MalformedURLException ex) {