类 PathMatchingResourcePatternResolver
- java.lang.Object
-
- com.alibaba.nacos.common.packagescan.resource.PathMatchingResourcePatternResolver
-
- 所有已实现的接口:
ResourceLoader,ResourcePatternResolver
public class PathMatchingResourcePatternResolver extends java.lang.Object implements ResourcePatternResolver
Copy from https://github.com/spring-projects/spring-framework.git, with less modifications AResourcePatternResolverimplementation 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 targetResource, or alternatively may contain the special "classpath*:" prefix and/or internal Ant-style regular expressions (matched using Spring'sAntPathMatcherutility). Both of the latter are effectively wildcards.No 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 agetResource()call on the underlyingResourceLoader. 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 underlyingResourceLoader(e.g.ServletContextResourcefor aWebApplicationContext).Ant-style Patterns:
When the path location contains an Ant-style pattern, e.g.:
/WEB-INF/*-context.xml com/mycompany/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/mycompany/**/applicationContext.xml
the resolver follows a more complex but defined procedure to try to resolve the wildcard. It produces aResourcefor the path up to the last non-wildcard segment and obtains aURLfrom it. If this URL is not a "jar:" URL or container-specific variant (e.g. "zip:" in WebLogic, "wsjar" in WebSphere", etc.), then ajava.io.Fileis obtained from it, and used to resolve the wildcard by walking the filesystem. In the case of a jar URL, the resolver either gets ajava.net.JarURLConnectionfrom it, or manually parses the jar URL, and then traverses the contents of the jar file, to resolve the wildcards.Implications on portability:
If the specified path is already a file URL (either explicitly, or implicitly because the base
ResourceLoaderis a filesystem one, then wildcarding is guaranteed to work in a completely portable fashion.If the specified path is a classpath 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 a URL is returned in this case. In practice, it is usually ajava.io.Filerepresenting the directory, where the classpath resource resolves to a filesystem location, or a jar URL of some sort, where the classpath 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.JarURLConnectionfrom 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*:Prefix:There 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 "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 aClassLoader.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 subpath.Other notes:
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'sClassLoader.getResources()method which only returns file system locations for a passed-in empty String (indicating potential roots to search). ThisResourcePatternResolverimplementation is trying to mitigate the jar root lookup limitation throughURLClassLoaderintrospection 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 root package to search is available in multiple class path locations. This is because a resource such as
com/mycompany/package1/service-context.xmlmay be in only one location, but when a path such asclasspath:com/mycompany/**/service-context.xmlis used to try to resolve it, the resolver will work off the (first) URL returned bygetResource("com/mycompany");. If this base package node exists in multiple classloader locations, the actual end resource may not be underneath. Therefore, preferably, use "classpath*:" with the same Ant-style pattern in such a case, which will search all class path locations that contain the root package.- 从以下版本开始:
- 1.0.2
- 作者:
- Juergen Hoeller, Colin Sampaleanu, Marius Bogoevici, Costin Leau, Phillip Webb
- 另请参阅:
ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX,AntPathMatcher,ResourceLoader.getResource(String),ClassLoader.getResources(String)
-
-
嵌套类概要
嵌套类 修饰符和类型 类 说明 private static classPathMatchingResourcePatternResolver.PatternVirtualFileVisitorVFS visitor for path matching purposes.private static classPathMatchingResourcePatternResolver.VfsResourceMatchingDelegateInner delegate class, avoiding a hard JBoss VFS API dependency at runtime.
-
字段概要
字段 修饰符和类型 字段 说明 private static java.lang.reflect.MethodequinoxResolveMethodprivate static org.slf4j.LoggerLOGGERprivate PathMatcherpathMatcherprivate ResourceLoaderresourceLoader-
从接口继承的字段 com.alibaba.nacos.common.packagescan.resource.ResourceLoader
CLASSPATH_URL_PREFIX
-
从接口继承的字段 com.alibaba.nacos.common.packagescan.resource.ResourcePatternResolver
CLASSPATH_ALL_URL_PREFIX
-
-
构造器概要
构造器 构造器 说明 PathMatchingResourcePatternResolver()Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)Create a new PathMatchingResourcePatternResolver.PathMatchingResourcePatternResolver(java.lang.ClassLoader classLoader)Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.
-
方法概要
所有方法 实例方法 具体方法 修饰符和类型 方法 说明 protected voidaddAllClassLoaderJarRoots(java.lang.ClassLoader classLoader, java.util.Set<Resource> result)Search allURLClassLoaderURLs for jar file references and add them to the given set of resources in the form of pointers to the root of the jar file content.protected voidaddClassPathManifestEntries(java.util.Set<Resource> result)Determine jar file references from the "java.class.path." manifest property and add them to the given set of resources in the form of pointers to the root of the jar file content.protected ResourceconvertClassLoaderUrl(java.net.URL url)Convert the given URL as returned from the ClassLoader into aResource.protected java.lang.StringdetermineRootDir(java.lang.String location)Determine the root directory for the given location.protected java.util.Set<Resource>doFindAllClassPathResources(java.lang.String path)Find all class location resources with the given path via the ClassLoader.protected java.util.Set<Resource>doFindMatchingFileSystemResources(java.io.File rootDir, java.lang.String subPattern)Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.protected java.util.Set<Resource>doFindPathMatchingFileResources(Resource rootDirResource, java.lang.String subPattern)Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.protected java.util.Set<Resource>doFindPathMatchingJarResources(Resource rootDirResource, java.net.URL rootDirUrl, java.lang.String subPattern)Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.protected voiddoRetrieveMatchingFiles(java.lang.String fullPattern, java.io.File dir, java.util.Set<java.io.File> result)Recursively retrieve files that match the given pattern, adding them to the given result list.protected Resource[]findAllClassPathResources(java.lang.String location)Find all class location resources with the given location via the ClassLoader.protected Resource[]findPathMatchingResources(java.lang.String locationPattern)Find all resources that match the given location pattern via the Ant-style PathMatcher.java.lang.ClassLoadergetClassLoader()Expose theClassLoaderused by thisResourceLoader.protected java.util.jar.JarFilegetJarFile(java.lang.String jarFileUrl)Resolve the given jar file URL into a JarFile object.PathMatchergetPathMatcher()Return the PathMatcher that this resource pattern resolver uses.ResourcegetResource(java.lang.String location)Return aResourcehandle for the specified resource location.ResourceLoadergetResourceLoader()Return the ResourceLoader that this pattern resolver works with.Resource[]getResources(java.lang.String locationPattern)Resolve the given location pattern intoResourceobjects.private booleanhasDuplicate(java.lang.String filePath, java.util.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.protected booleanisJarResource(Resource resource)Return whether the given resource handle indicates a jar resource that thedoFindPathMatchingJarResourcesmethod can handle.protected java.io.File[]listDirectory(java.io.File dir)Determine a sorted list of files in the given directory.protected ResourceresolveRootDirResource(Resource original)Resolve the specified resource for path matching.protected java.util.Set<java.io.File>retrieveMatchingFiles(java.io.File rootDir, java.lang.String pattern)Retrieve files that match the given path pattern, checking the given directory and its subdirectories.voidsetPathMatcher(PathMatcher pathMatcher)Set the PathMatcher implementation to use for this resource pattern resolver.
-
-
-
字段详细资料
-
LOGGER
private static final org.slf4j.Logger LOGGER
-
equinoxResolveMethod
private static java.lang.reflect.Method equinoxResolveMethod
-
resourceLoader
private final ResourceLoader resourceLoader
-
pathMatcher
private PathMatcher pathMatcher
-
-
构造器详细资料
-
PathMatchingResourcePatternResolver
public PathMatchingResourcePatternResolver()
Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.ClassLoader access will happen via the thread context class loader.
- 另请参阅:
DefaultResourceLoader
-
PathMatchingResourcePatternResolver
public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader)
Create a new PathMatchingResourcePatternResolver.ClassLoader access will happen via the thread context class loader.
- 参数:
resourceLoader- the ResourceLoader to load root directories and actual resources with
-
PathMatchingResourcePatternResolver
public PathMatchingResourcePatternResolver(java.lang.ClassLoader classLoader)
Create a new PathMatchingResourcePatternResolver with a DefaultResourceLoader.- 参数:
classLoader- the ClassLoader to load classpath resources with, ornullfor using the thread context class loader at the time of actual resource access- 另请参阅:
DefaultResourceLoader
-
-
方法详细资料
-
getResourceLoader
public ResourceLoader getResourceLoader()
Return the ResourceLoader that this pattern resolver works with.
-
getClassLoader
public java.lang.ClassLoader getClassLoader()
从接口复制的说明:ResourceLoaderExpose theClassLoaderused by thisResourceLoader.Clients which need to access the
ClassLoaderdirectly can do so in a uniform manner with theResourceLoader, rather than relying on the thread contextClassLoader.- 指定者:
getClassLoader在接口中ResourceLoader- 返回:
- the
ClassLoader(onlynullif even the systemClassLoaderisn't accessible)
-
setPathMatcher
public void setPathMatcher(PathMatcher pathMatcher)
Set the PathMatcher implementation to use for this resource pattern resolver. Default is AntPathMatcher.- 另请参阅:
AntPathMatcher
-
getPathMatcher
public PathMatcher getPathMatcher()
Return the PathMatcher that this resource pattern resolver uses.
-
getResource
public Resource getResource(java.lang.String location)
从接口复制的说明:ResourceLoaderReturn aResourcehandle for the specified resource location.The handle should always be a reusable resource descriptor, allowing for multiple
InputStreamSource.getInputStream()calls.- Must support fully qualified URLs, e.g. "file:C:/test.dat".
- Must support classpath pseudo-URLs, e.g. "classpath:test.dat".
- Should support relative file paths, e.g. "WEB-INF/test.dat". (This will be implementation-specific, typically provided by an ApplicationContext implementation.)
Note that a
Resourcehandle does not imply an existing resource; you need to invokeResource.exists()to check for existence.- 指定者:
getResource在接口中ResourceLoader- 参数:
location- the resource location- 返回:
- a corresponding
Resourcehandle (nevernull) - 另请参阅:
ResourceLoader.CLASSPATH_URL_PREFIX,Resource.exists(),InputStreamSource.getInputStream()
-
getResources
public Resource[] getResources(java.lang.String locationPattern) throws java.io.IOException
从接口复制的说明:ResourcePatternResolverResolve the given location pattern intoResourceobjects.Overlapping resource entries that point to the same physical resource should be avoided, as far as possible. The result should have set semantics.
- 指定者:
getResources在接口中ResourcePatternResolver- 参数:
locationPattern- the location pattern to resolve- 返回:
- the corresponding
Resourceobjects - 抛出:
java.io.IOException- in case of I/O errors
-
findAllClassPathResources
protected Resource[] findAllClassPathResources(java.lang.String location) throws java.io.IOException
Find all class location resources with the given location via the ClassLoader. Delegates todoFindAllClassPathResources(String).- 参数:
location- the absolute path within the classpath- 返回:
- the result as Resource array
- 抛出:
java.io.IOException- in case of I/O errors- 另请参阅:
ClassLoader.getResources(java.lang.String),convertClassLoaderUrl(java.net.URL)
-
doFindAllClassPathResources
protected java.util.Set<Resource> doFindAllClassPathResources(java.lang.String path) throws java.io.IOException
Find all class location resources with the given path via the ClassLoader. Called byfindAllClassPathResources(String).- 参数:
path- the absolute path within the classpath (never a leading slash)- 返回:
- a mutable Set of matching Resource instances
- 抛出:
java.io.IOException- 从以下版本开始:
- 4.1.1
-
convertClassLoaderUrl
protected Resource convertClassLoaderUrl(java.net.URL url)
Convert the given URL as returned from the ClassLoader into aResource.The default implementation simply creates a
UrlResourceinstance.- 参数:
url- a URL as returned from the ClassLoader- 返回:
- the corresponding Resource object
- 另请参阅:
ClassLoader.getResources(java.lang.String),Resource
-
addAllClassLoaderJarRoots
protected void addAllClassLoaderJarRoots(java.lang.ClassLoader classLoader, java.util.Set<Resource> result)Search allURLClassLoaderURLs for jar file references and add them to the given set of resources in the form of pointers to the root of the jar file content.- 参数:
classLoader- the ClassLoader to search (including its ancestors)result- the set of resources to add jar roots to- 从以下版本开始:
- 4.1.1
-
addClassPathManifestEntries
protected void addClassPathManifestEntries(java.util.Set<Resource> result)
Determine jar file references from the "java.class.path." manifest property and add them to the given set of resources in the form of pointers to the root of the jar file content.- 参数:
result- the set of resources to add jar roots to- 从以下版本开始:
- 4.3
-
hasDuplicate
private boolean hasDuplicate(java.lang.String filePath, java.util.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.- 参数:
filePath- the file path (with or without a leading slash)result- the current result- 返回:
trueif there is a duplicate (i.e. to ignore the given file path),falseto proceed with adding a corresponding resource to the current result
-
findPathMatchingResources
protected Resource[] findPathMatchingResources(java.lang.String locationPattern) throws java.io.IOException
Find all resources that match the given location pattern via the Ant-style PathMatcher. Supports resources in jar files and zip files and in the file system.- 参数:
locationPattern- the location pattern to match- 返回:
- the result as Resource array
- 抛出:
java.io.IOException- in case of I/O errors- 另请参阅:
doFindPathMatchingJarResources(com.alibaba.nacos.common.packagescan.resource.Resource, java.net.URL, java.lang.String),doFindPathMatchingFileResources(com.alibaba.nacos.common.packagescan.resource.Resource, java.lang.String),PathMatcher
-
determineRootDir
protected java.lang.String determineRootDir(java.lang.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 a
java.io.Fileand passing it intoretrieveMatchingFiles, with the remainder of the location as pattern.Will return "/WEB-INF/" for the pattern "/WEB-INF/*.xml", for example.
- 参数:
location- the location to check- 返回:
- the part of the location that denotes the root directory
- 另请参阅:
retrieveMatchingFiles(java.io.File, java.lang.String)
-
resolveRootDirResource
protected Resource resolveRootDirResource(Resource original) throws java.io.IOException
Resolve the specified resource for path matching.By default, Equinox OSGi "bundleresource:" / "bundleentry:" URL will be resolved into a standard jar file URL that be traversed using Spring's standard jar file traversal algorithm. For any preceding custom resolution, override this method and replace the resource handle accordingly.
- 参数:
original- the resource to resolve- 返回:
- the resolved resource (may be identical to the passed-in resource)
- 抛出:
java.io.IOException- in case of resolution failure
-
isJarResource
protected boolean isJarResource(Resource resource) throws java.io.IOException
Return whether the given resource handle indicates a jar resource that thedoFindPathMatchingJarResourcesmethod can handle.By default, the URL protocols "jar", "zip", "vfszip and "wsjar" will be treated as jar resources. This template method allows for detecting further kinds of jar-like resources, e.g. through
instanceofchecks on the resource handle type.- 参数:
resource- the resource handle to check (usually the root directory to start path matching from)- 抛出:
java.io.IOException- 另请参阅:
doFindPathMatchingJarResources(com.alibaba.nacos.common.packagescan.resource.Resource, java.net.URL, java.lang.String),ResourceUtils.isJarUrl(java.net.URL)
-
doFindPathMatchingJarResources
protected java.util.Set<Resource> doFindPathMatchingJarResources(Resource rootDirResource, java.net.URL rootDirUrl, java.lang.String subPattern) throws java.io.IOException
Find all resources in jar files that match the given location pattern via the Ant-style PathMatcher.- 参数:
rootDirResource- the root directory as ResourcerootDirUrl- the pre-resolved root directory URLsubPattern- the sub pattern to match (below the root directory)- 返回:
- a mutable Set of matching Resource instances
- 抛出:
java.io.IOException- in case of I/O errors- 从以下版本开始:
- 4.3
- 另请参阅:
PathMatcher
-
getJarFile
protected java.util.jar.JarFile getJarFile(java.lang.String jarFileUrl) throws java.io.IOExceptionResolve the given jar file URL into a JarFile object.- 抛出:
java.io.IOException
-
doFindPathMatchingFileResources
protected java.util.Set<Resource> doFindPathMatchingFileResources(Resource rootDirResource, java.lang.String subPattern) throws java.io.IOException
Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.- 参数:
rootDirResource- the root directory as ResourcesubPattern- the sub pattern to match (below the root directory)- 返回:
- a mutable Set of matching Resource instances
- 抛出:
java.io.IOException- in case of I/O errors- 另请参阅:
retrieveMatchingFiles(java.io.File, java.lang.String),PathMatcher
-
doFindMatchingFileSystemResources
protected java.util.Set<Resource> doFindMatchingFileSystemResources(java.io.File rootDir, java.lang.String subPattern) throws java.io.IOException
Find all resources in the file system that match the given location pattern via the Ant-style PathMatcher.- 参数:
rootDir- the root directory in the file systemsubPattern- the sub pattern to match (below the root directory)- 返回:
- a mutable Set of matching Resource instances
- 抛出:
java.io.IOException- in case of I/O errors- 另请参阅:
retrieveMatchingFiles(java.io.File, java.lang.String),PathMatcher
-
retrieveMatchingFiles
protected java.util.Set<java.io.File> retrieveMatchingFiles(java.io.File rootDir, java.lang.String pattern) throws java.io.IOExceptionRetrieve files that match the given path pattern, checking the given directory and its subdirectories.- 参数:
rootDir- the directory to start frompattern- the pattern to match against, relative to the root directory- 返回:
- a mutable Set of matching Resource instances
- 抛出:
java.io.IOException- if directory contents could not be retrieved
-
doRetrieveMatchingFiles
protected void doRetrieveMatchingFiles(java.lang.String fullPattern, java.io.File dir, java.util.Set<java.io.File> result) throws java.io.IOExceptionRecursively retrieve files that match the given pattern, adding them to the given result list.- 参数:
fullPattern- the pattern to match against, with prepended root directory pathdir- the current directoryresult- the Set of matching File instances to add to- 抛出:
java.io.IOException- if directory contents could not be retrieved
-
listDirectory
protected java.io.File[] listDirectory(java.io.File dir)
Determine a sorted list of files in the given directory.- 参数:
dir- the directory to introspect- 返回:
- the sorted list of files (by default in alphabetical order)
- 从以下版本开始:
- 5.1
- 另请参阅:
File.listFiles()
-
-