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) {