jar资源加载问题
- 问题:Spring加载jar中的:classpath*:xxx/applicationContext*.xml文件失败
- 环境:
- jar文件中文件: classpath*:xxx/applicationContext*.xml
- Eclipse使用“导出”jar时未选择”Add directory entries”(选择后,不会出现此问题)如下图:
- 分析:
- 代码:
//Resource[] org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(String locationPattern) throws IOException 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); if (isJarResource(rootDirResource)) { result.addAll(doFindPathMatchingJarResources(rootDirResource, subPattern)); } else if (rootDirResource.getURL().getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) { result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirResource, subPattern, getPathMatcher())); } 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()]); }
- 因为spring支持通配符加载资源,所以使用:Resource[] rootDirResources = getResources(rootDirPath);来加载目录,再定位子资源subPattern的路径,即可支持通配符加载资源
- 代码: