从Spring Boot的Fat JAR中读取目录

问题描述

我正在尝试在Spring Boot 2应用程序中读取resources/configs目录。这是目录结构的示例:

resources
| configs
| | file1.xml
| | file2.xml
| | ...

我在其中读取目录和嵌套文件代码

@Value("${app.configs-path}")
String configsPath;

...

Resource configsDirectoryResource = new ClassPathResource(configsPath);
InputStream configsDirectoryStream = configsDirectoryResource.getInputStream();
InputStreamReader configsDirectoryStreamReader = new InputStreamReader(configsDirectoryStream);
BufferedReader configsDirectoryBufferedReader = new BufferedReader(configsDirectoryStreamReader);

List<String> configFileNames = configsDirectoryBufferedReader.lines().collect(toList());

还有我的application.properties

app.configs-path=configs

当我在IDE中运行我的应用程序时,这可以正常工作。对象configsDirectoryResource返回文件名流,然后读取每个嵌套文件。但是,当我启动JAR文件时,configsDirectoryResource不返回文件名。但是,我可以直接读取XML文件,但是我想在运行时获取文件列表。

如何读取目录或获取JAR文件中目录中的文件列表?

解决方法

您可以在Spring Framework中使用PathMatchingResourcePatternResolver

示例代码:

ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/"+configsPath+"/*.xml") ;
for (Resource resource: resources){
    logger.info(resource.getFilename());
}
,

好,那比我想象的要容易。

ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources(configsPath + "/*.xml");

然后我们可以从每个InputStream中获得一个resource并与他们合作。