java - 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()]);
解决方案
推荐阅读
- javascript - 在 Javascript 中导入
- python - 如何在 DataFrame 的所有列中查找元素的所有出现?
- c++ - 当前标准是否保证在完整对象的初始化抛出异常时调用子对象的析构函数
- cordova - 如何在特定页面上打开科尔多瓦 SPA
- rust - 如何修改 Rust 闭包捕获的变量?
- asp.net-core - Swagger '没有在规范中定义操作' ASP.NET CORE 3.1
- julia - 创建具有参数返回类型的函数
- python - removesuffix 返回错误“str”对象没有属性“removesuffix”
- cypress - 从 Git bash 运行命令会引发错误
- regex - 什么是匹配包含所有大写字符和数字的 14 位商家 ID 的最佳正则表达式 - 始终以“A”开头