首页 > 解决方案 > PathMatchingResourcePatternResolver - 查找 org.springframework.core.io.Resource 为某些 jar 设置为“file:/”的原因

问题描述

我下面有一些代码用于扫描我的 batis 映射器文件。我正在扫描 My Batis 文件,但我认为我的问题更多是 Spring 问题。

列出的代码运行良好,但是当我将依赖项添加到存储在本地 maven 存储库中的某些外部库时,PathMatchingResourcePatternResolver.getResources() 方法返回特定 jar 的“file:/”资源。这导致 spring 在我的整个 C 驱动器中搜索映射器文件。

我能够确定是什么 jar 导致了这种行为,但我不确定分辨率是什么。为什么 Spring 将资源设置为 "file:/" ?我不确定这个 jar 与返回正常资源条目的其他 jar 有什么问题。

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
Resource configLocation = patternResolver.getResource("classpath:mybatis/mybatis.config.xml");

 //this line leads to the issue
Resource[] mapperLocations1 = patternResolver.getResources("classpath*:**/*Mapper.xml");

在此处输入图像描述

//this is from the Spring PathMatchingResourcePatternResolver class
    protected Resource[] findPathMatchingResources(String locationPattern) throws IOException {
        String rootDirPath = determineRootDir(locationPattern);
        String subPattern = locationPattern.substring(rootDirPath.length());
        Resource[] rootDirResources = getResources(rootDirPath);
        Set<Resource> result = new LinkedHashSet<Resource>(16);
        for (Resource rootDirResource : rootDirResources) {
            rootDirResource = resolveRootDirResource(rootDirResource);
            URL rootDirUrl = rootDirResource.getURL();
            if (equinoxResolveMethod != null) {
                if (rootDirUrl.getProtocol().startsWith("bundle")) {
                    rootDirUrl = (URL) ReflectionUtils.invokeMethod(equinoxResolveMethod, null, rootDirUrl);
                    rootDirResource = new UrlResource(rootDirUrl);
                }
            }
            if (rootDirUrl.getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {
                result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirUrl, subPattern, getPathMatcher()));
            }
            else if (ResourceUtils.isJarURL(rootDirUrl) || isJarResource(rootDirResource)) {
                result.addAll(doFindPathMatchingJarResources(rootDirResource, rootDirUrl, subPattern));
            }
            else {
                result.addAll(doFindPathMatchingFileResources(rootDirResource, subPattern));
            }
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Resolved location pattern [" + locationPattern + "] to resources " + result);
        }
        return result.toArray(new Resource[result.size()]);

标签: javaspringclasspath

解决方案


推荐阅读