春季启动:从罐子读取时尝试读取资源文件夹中的目录内容会产生FileNotFoundException

时间:2019-12-03 13:52:43

标签: java spring-boot tomcat kotlin

所以我对Spring-boot有问题。基本上,这个想法是在资源中我有一个名为migrations的目录,该目录存储需要启动的sql脚本。它在本地计算机上运行良好。但是,一旦我将项目上传到服务器,我就会受到以下错误的欢迎:

Caused by: java.io.FileNotFoundException: class path resource [migrations] cannot be resolved to absolute file path because it does not reside in the file system: 

很多谷歌搜索帮助我发现了问题。它与文件位于.jar中有关,当我确实将目录读为InputStream时(如在此问题中所述),如果我指定了文件的全名,则可以获取特定文件并访问其脚本。该资源,例如 resourceLoader.getResource("classpath:migrations/file.sql")
但是,这样指定资源的全名并定义所有文件名不是一个选择,因为将来此文件夹可以扩展很多,并且我不想手动编辑代码以将文件添加到运行中。
是否有解决此问题的方法,至少可以让我从目录中读取文件名,然后逐个访问它们?

1 个答案:

答案 0 :(得分:1)

除非它使用docker文件复制资源并进行部署,否则我认为如果部署有jar则不会有一个好的解决方案。 getInputStream()始终是从任何地方获取文件的最佳解决方案。

也许是这种解决方案,但尚未尝试

ClassLoader cl = this.getClass().getClassLoader(); 
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/*.sql") ;
for (Resource resource: resources){
    do your things maybe print the name resource
}