ResourcePatternResolver implementation that is able to resolve a
specified resource location path into one or more matching Resources.
The source path may be a simple path which has a one-to-one mapping to a
target org., or alternatively may
contain the special "classpath*:" prefix and/or internal Ant-style
path patterns (matched using Spring's AntPathMatcher utility). Both
of the latter are effectively wildcards.
In the simple case, if the specified location path does not start with the
"classpath*:" prefix and does not contain a PathMatcher
pattern, this resolver will simply return a single resource via a
getResource() call on the underlying ResourceLoader.
Examples are real URLs such as "file:C:/context.xml", pseudo-URLs
such as "classpath:/context.xml", and simple unprefixed paths
such as "/WEB-INF/context.xml". The latter will resolve in a
fashion specific to the underlying ResourceLoader (e.g.
ServletContextResource for a WebApplicationContext).
When the path location contains an Ant-style pattern, for example:
/WEB-INF/*-context.xml com/example/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/example/**/applicationContext.xmlthe resolver follows a more complex but defined procedure to try to resolve the wildcard. It produces a
Resource for the path up to the last
non-wildcard segment and obtains a URL from it. If this URL is not a
"jar:" URL or container-specific variant (e.g. "zip:" in WebLogic,
"wsjar" in WebSphere", etc.), then the root directory of the filesystem
associated with the URL is obtained and used to resolve the wildcards by walking
the filesystem. In the case of a jar URL, the resolver either gets a
java.net.JarURLConnection from it, or manually parses the jar URL, and
then traverses the contents of the jar file, to resolve the wildcards.
If the specified path is already a file URL (either explicitly, or
implicitly because the base ResourceLoader is a filesystem one),
then wildcarding is guaranteed to work in a completely portable fashion.
If the specified path is a class path location, then the resolver must
obtain the last non-wildcard path segment URL via a
Classloader.getResource() call. Since this is just a
node of the path (not the file at the end) it is actually undefined
(in the ClassLoader Javadocs) exactly what sort of URL is returned in
this case. In practice, it is usually a java.io.File representing
the directory, where the class path resource resolves to a filesystem
location, or a jar URL of some sort, where the class path resource resolves
to a jar location. Still, there is a portability concern on this operation.
If a jar URL is obtained for the last non-wildcard segment, the resolver
must be able to get a java.net.JarURLConnection from it, or
manually parse the jar URL, to be able to walk the contents of the jar
and resolve the wildcard. This will work in most environments but will
fail in others, and it is strongly recommended that the wildcard
resolution of resources coming from jars be thoroughly tested in your
specific environment before you rely on it.
classpath*: PrefixThere is special support for retrieving multiple class path resources with
the same name, via the "classpath*:" prefix. For example,
"classpath*:META-INF/beans.xml" will find all "META-INF/beans.xml"
files in the class path, be it in "classes" directories or in JAR files.
This is particularly useful for autodetecting config files of the same name
at the same location within each jar file. Internally, this happens via a
ClassLoader.getResources() call, and is completely portable.
The "classpath*:" prefix can also be combined with a PathMatcher
pattern in the rest of the location path — for example,
"classpath*:META-INF/*-beans.xml". In this case, the resolution strategy
is fairly simple: a ClassLoader.getResources() call is used on the last
non-wildcard path segment to get all the matching resources in the class loader
hierarchy, and then off each resource the same PathMatcher resolution
strategy described above is used for the wildcard sub pattern.
As of Spring Framework 6.0, if getResources(String) is invoked with
a location pattern using the "classpath*:" prefix it will first search
all modules in the boot layer, excluding
system modules. It will then search the
class path using ClassLoader APIs as described previously and return the
combined results. Consequently, some of the limitations of class path searches
may not apply when applications are deployed as modules.
Warning
Note that "classpath*:" when combined with
Ant-style patterns will only work reliably with at least one root directory
before the pattern starts, unless the actual target files reside in the file
system. This means that a pattern like "classpath*:*.xml" will
not retrieve files from the root of jar files but rather only from the
root of expanded directories. This originates from a limitation in the JDK's
ClassLoader.getResources() method which only returns file system
locations for a passed-in empty String (indicating potential roots to search).
This ResourcePatternResolver implementation tries to mitigate the
jar root lookup limitation through URLClassLoader introspection and
"java.class.path" manifest evaluation; however, without portability
guarantees.
Warning
Ant-style patterns with "classpath:" resources are not
guaranteed to find matching resources if the base package to search is available
in multiple class path locations. This is because a resource such as
com/example/package1/service-context.xmlmay exist in only one class path location, but when a location pattern such as
classpath:com/example/**/service-context.xmlis used to try to resolve it, the resolver will work off the (first) URL returned by
getResource("com/example"). If the com/example base
package node exists in multiple class path locations, the actual desired resource
may not be present under the com/example base package in the first URL.
Therefore, preferably, use "classpath*:" with the same Ant-style pattern
in such a case, which will search all class path locations that contain
the base package.
CLASSPATH_ALL_URL_PREFIX, org.springframework.util.AntPathMatcher , org.springframework.core.io.ResourceLoader#getResource(String) , ClassLoader#getResources(String)
| Modifier and Type | Class and Description |
|---|---|
| private static class | PathMatchingResourcePatternResolver.
VFS visitor for path matching purposes. |
| private static class | PathMatchingResourcePatternResolver.
Inner delegate class, avoiding a hard JBoss VFS API dependency at runtime. |
| Modifier and Type | Field and Description |
|---|---|
| private static Method | |
| private static final Predicate | isNotSystemModule
|
| private static final Log | |
| private PathMatcher | |
| private final ResourceLoader | |
| private static final Set | systemModuleNames
|
| Access | Constructor and Description |
|---|---|
| public | PathMatchingResourcePatternResolver()
Create a |
| public | PathMatchingResourcePatternResolver(ResourceLoader
the resourceLoader)ResourceLoader to load root directories
and actual resources withCreate a |
| public | PathMatchingResourcePatternResolver(ClassLoader
the ClassLoader to load class path resources with,
or classLoader)null for using the thread context class loader
at the time of actual resource accessCreate a |
| Modifier and Type | Method and Description |
|---|---|
| protected void | addAllClassLoaderJarRoots(ClassLoader
the ClassLoader to search (including its ancestors) classLoader, Set<Resource> the set of resources to add jar roots to result)Search all |
| protected void | addClassPathManifestEntries(Set<Resource>
the set of resources to add jar roots to result)Determine jar file references from |
| protected Resource | Returns: the corresponding Resource objecta URL as returned from the configured ClassLoader url)Convert the given URL as returned from the configured
|
| private Resource | convertModuleSystemURI(URI uri)
If it's a "file:" URI, use |
| protected String | Returns: the part of the location that denotes the root directorythe location to check location)Determine the root directory for the given location. |
| protected Set | Returns: a mutable Set of matching Resource instancesthe absolute path within the class path (never a leading slash) path)Find all class path resources with the given path via the configured
|
| protected Set | Returns: a mutable Set of matching Resource instancesthe root directory as a Resource rootDirResource, String the sub pattern to match (below the root directory) subPattern)Find all resources in the file system of the supplied root directory that
match the given location sub pattern via the Ant-style |
| protected Set | Returns: a mutable Set of matching Resource instancesthe root directory as Resource rootDirResource, URL the pre-resolved root directory URL rootDirUrl, String the sub pattern to match (below the root directory) subPattern)Find all resources in jar files that match the given location pattern
via the Ant-style |
| protected Resource[] | Returns: the result as Resource arraythe absolute path within the class path location)Find all class location resources with the given location via the ClassLoader. |
| protected Set | Returns: a modifiableSet containing the corresponding Resource
objectsthe location pattern to resolve locationPattern)Resolve the given location pattern into |
| protected Resource[] | Returns: the result as Resource arraythe location pattern to match locationPattern)Find all resources that match the given location pattern via the Ant-style
|
| private Resource | |
| public ClassLoader | getClassLoader()
Implements org. Expose the |
| protected JarFile | |
| public PathMatcher | |
| public Resource | getResource(String
the resource location location)Implements org. Return a |
| public ResourceLoader | |
| public Resource[] | getResources(String
the location pattern to resolve locationPattern)Implements org. Resolve the given location pattern into |
| private boolean | Returns: true if there is a duplicate (i.e. to ignore the given file path),
false to proceed with adding a corresponding resource to the current resultthe file path (with or without a leading slash) filePath, Set<Resource> the current result result)Check whether the given file path has a duplicate but differently structured entry in the existing result, i.e. with or without a leading slash. |
| protected boolean | Returns: true if the given resource handle indicates a jar resourcethe resource handle to check (usually the root directory
to start path matching from) resource)Determine if the given resource handle indicates a jar resource that the
|
| protected Resource | Returns: the resolved resource (may be identical to the supplied resource)the resource to resolve original)Resolve the supplied root directory resource for path matching. |
| public void | setPathMatcher(PathMatcher pathMatcher)
Set the |
| private static String |
| equinoxResolveMethod | back to summary |
|---|---|
| private static Method equinoxResolveMethod
| |
| isNotSystemModule | back to summary |
|---|---|
| private static final Predicate<ResolvedModule> isNotSystemModule
| |
| logger | back to summary |
|---|---|
| private static final Log logger | |
| pathMatcher | back to summary |
|---|---|
| private PathMatcher pathMatcher | |
| resourceLoader | back to summary |
|---|---|
| private final ResourceLoader resourceLoader | |
| systemModuleNames | back to summary |
|---|---|
| private static final Set<String> systemModuleNames
| |
| PathMatchingResourcePatternResolver | back to summary |
|---|---|
| public PathMatchingResourcePatternResolver() Create a ClassLoader access will happen via the thread context class loader.
| |
| PathMatchingResourcePatternResolver | back to summary |
|---|---|
| public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) Create a ClassLoader access will happen via the thread context class loader.
| |
| PathMatchingResourcePatternResolver | back to summary |
|---|---|
| public PathMatchingResourcePatternResolver(ClassLoader classLoader) Create a
| |
| addAllClassLoaderJarRoots | back to summary |
|---|---|
| protected void addAllClassLoaderJarRoots(ClassLoader classLoader, Set<Resource> result) Search all
| |
| addClassPathManifestEntries | back to summary |
|---|---|
| protected void addClassPathManifestEntries(Set<Resource> result) Determine jar file references from | |
| convertClassLoaderURL | back to summary |
|---|---|
| protected Resource convertClassLoaderURL(URL url) Convert the given URL as returned from the configured
As of 6.0.5, the default implementation creates a
| |
| convertModuleSystemURI | back to summary |
|---|---|
| private Resource convertModuleSystemURI(URI uri) If it's a "file:" URI, use | |
| determineRootDir | back to summary |
|---|---|
| protected String determineRootDir(String location) Determine the root directory for the given location. Used for determining the starting point for file matching, resolving the
root directory location to be passed into Will return "/WEB-INF/" for the location "/WEB-INF/*.xml", for example.
| |
| doFindAllClassPathResources | back to summary |
|---|---|
| protected Set Find all class path resources with the given path via the configured
Called by | |
| doFindPathMatchingFileResources | back to summary |
|---|---|
| protected Set Find all resources in the file system of the supplied root directory that
match the given location sub pattern via the Ant-style
| |
| doFindPathMatchingJarResources | back to summary |
|---|---|
| protected Set Find all resources in jar files that match the given location pattern
via the Ant-style
| |
| findAllClassPathResources | back to summary |
|---|---|
| protected Resource[] findAllClassPathResources(String location) throws IOException Find all class location resources with the given location via the ClassLoader. Delegates to
| |
| findAllModulePathResources | back to summary |
|---|---|
| protected Set Resolve the given location pattern into The location pattern may be an explicit resource path such as
The default implementation scans all modules in the boot layer, excluding system modules.
| |
| findPathMatchingResources | back to summary |
|---|---|
| protected Resource[] findPathMatchingResources(String locationPattern) throws IOException Find all resources that match the given location pattern via the Ant-style
Supports resources in OSGi bundles, JBoss VFS, jar files, zip files, and file systems.
| |
| findResource | back to summary |
|---|---|
private Resource findResource(ModuleReader moduleReader, String name)
| |
| getClassLoader | back to summary |
|---|---|
| public ClassLoader getClassLoader() Implements org. Doc from org. Expose the Clients which need to access the
| |
| getJarFile | back to summary |
|---|---|
| protected JarFile getJarFile(String jarFileUrl) throws IOException Resolve the given jar file URL into a JarFile object. | |
| getPathMatcher | back to summary |
|---|---|
| public PathMatcher getPathMatcher() Return the | |
| getResource | back to summary |
|---|---|
| public Resource getResource(String location) Implements org. Doc from org. Return a The handle should always be a reusable resource descriptor,
allowing for multiple
Note that a | |
| getResourceLoader | back to summary |
|---|---|
| public ResourceLoader getResourceLoader() Return the | |
| getResources | back to summary |
|---|---|
| public Resource[] getResources(String locationPattern) throws IOException Implements org. Doc from org. Resolve the given location pattern into Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.
| |
| hasDuplicate | back to summary |
|---|---|
| private boolean hasDuplicate(String filePath, Set<Resource> result) Check whether the given file path has a duplicate but differently structured entry in the existing result, i.e. with or without a leading slash. | |
| isJarResource | back to summary |
|---|---|
| protected boolean isJarResource(Resource resource) throws IOException Determine if the given resource handle indicates a jar resource that the
This template method therefore allows for detecting further kinds of
jar-like resources — for example, via The default implementation of this method returns
| |
| resolveRootDirResource | back to summary |
|---|---|
| protected Resource resolveRootDirResource(Resource original) throws IOException Resolve the supplied root directory resource for path matching. By default, For any custom resolution, override this template method and replace the supplied resource handle accordingly. The default implementation of this method returns the supplied resource unmodified.
| |
| setPathMatcher | back to summary |
|---|---|
| public void setPathMatcher(PathMatcher pathMatcher) Set the Default is
| |
| stripLeadingSlash | back to summary |
|---|---|
| private static String stripLeadingSlash(String path) | |
| Modifier and Type | Field and Description |
|---|---|
| private final PathMatcher | |
| private final Set | |
| private final String | |
| private final String |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public Object | |
| public Set | |
| public Object | invoke(Object
the proxy instance that the method was invoked on proxy, Method the method, Object[] Method instance corresponding to
the interface method invoked on the proxy instance. The declaring
class of the Method object will be the interface that
the method was declared in, which may be a superinterface of the
proxy interface that the proxy class inherits the method through.an array of objects containing the values of the
arguments passed in the method invocation on the proxy instance,
or args)null if interface method takes no arguments.
Arguments of primitive types are wrapped in instances of the
appropriate primitive wrapper class, such as
java.lang.Integer or java.lang.Boolean.Implements java. Processes a method invocation on a proxy instance and returns the result. |
| public int | |
| public String | |
| public void |
| pathMatcher | back to summary |
|---|---|
| private final PathMatcher pathMatcher | |
| resources | back to summary |
|---|---|
| private final Set<Resource> resources | |
| rootPath | back to summary |
|---|---|
| private final String rootPath | |
| subPattern | back to summary |
|---|---|
| private final String subPattern | |
| PatternVirtualFileVisitor | back to summary |
|---|---|
| public PatternVirtualFileVisitor(String rootPath, String subPattern, PathMatcher pathMatcher) | |
| getAttributes | back to summary |
|---|---|
public Object getAttributes()
| |
| getResources | back to summary |
|---|---|
| public Set | |
| invoke | back to summary |
|---|---|
| public Object invoke(Object proxy, Method method, Object[] args) throws Throwable Implements java. Doc from java. Processes a method invocation on a proxy instance and returns the result. This method will be invoked on an invocation handler when a method is invoked on a proxy instance that it is associated with.
| |
| size | back to summary |
|---|---|
| public int size() | |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Doc from java. Returns a string representation of the object.
Satisfying this method's contract implies a non- | |
| visit | back to summary |
|---|---|
| public void visit(Object vfsResource) | |
| Access | Constructor and Description |
|---|---|
| private |
| VfsResourceMatchingDelegate | back to summary |
|---|---|
| private VfsResourceMatchingDelegate() | |
| findMatchingResources | back to summary |
|---|---|
| public static Set | |