【问题标题】:Spring boot: trying to read directory content inside resources folder produces FileNotFoundException when reading from jarSpring Boot:尝试读取资源文件夹内的目录内容从 jar 读取时会产生 FileNotFoundException
【发布时间】:2019-12-03 13:52:43
【问题描述】:

所以我对 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")
但是,指定这样的资源的全名并定义所有文件名不是一种选择,因为将来这个文件夹可以扩展很多,我不想手动编辑代码以将文件添加到运行中。
这个问题有什么解决方法可以让我至少从目录中读取文件名,然后一个一个地访问它们吗?

【问题讨论】:

    标签: java spring-boot tomcat kotlin


    【解决方案1】:

    我不认为有一个好的解决方案,如果它部署有一个 jar,除非你使用 docker 文件来复制资源并部署它。 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
    }
    

    【讨论】:

    • 哇,这对一整天的斗争来说很容易解决。谢谢!不知何故,使用路径匹配器确实有效,我什至可以得到Resource[]。之后我需要做的就是将inputStream() 解析为字符串并运行我的查询:) 再次感谢!
    • 很高兴听到 ;-)
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2019-10-16
    相关资源
    最近更新 更多