Spring Boot:无法使用lib / * .jar中的类读取lib / * .jar中的资源

时间:2016-01-14 04:57:05

标签: java spring spring-boot classpath executable-jar

我使用spring boot org.springframework.boot.loader.JarLauncher来运行我的自我执行的spring boot app jar。

现在,我的自我可执行jar就像这样打包了(为了简洁起见,我只是添加了显示问题所需的文件):

    [HttpPost]        
    [ActionName("Create")]
    public IActionResult Create(Expense expenses)`

{"ID":0,"Description":null,"Amount":0}"

等等。

在我的Abc.class中,Iam尝试加载资源1.txt,当我在eclipse中运行它时工作正常;但是当我使用命令行作为自己的可执行jar运行时,故事开始了。我无法读取该资源,最终导致空指针错误。

在阅读了几个线程之后,我了解到我的IDE在类加载器上做了一些魔术,所以它运行正常,当我将它作为可执行jar运行时不会是这种情况

这就是我加载文件的方式以及我试图没有运气的所有可能选项。

选项1:

Main.jar   
      ---META-INF
      ---lib
           ---a.jar
              ---com
                  ---comp
                     ---Abc.class
              ---folder1
                 ---1.txt
                 ---2.txt
           ---b.jar

选项2:

Abc.class.getResourceAsStream("\folder1\1.txt")

选项3:阅读thread,我已经尝试过考虑当前的线程类加载器上下文,但是再没有运气

Abc.class.getClassLoader().getResourceAsStream("folder1\1.txt")

任何人都可以提供建议。我应该如何编写代码以便能够读取jar中的资源以及同一个jar中的类?

PS:Spring boot没有向MANIFEST.MF添加类路径条目,如果我必须做一些事情,我该怎么做?实际上我在运行我的jar时尝试使用-cp将其设置为当前目录,但是这些都没有用到

2 个答案:

答案 0 :(得分:3)

在Spring中,访问资源的最佳方式是Resource API。对于Classpath资源,您应该使用ClassPathResource,它看起来像这样:

Resource resource = new ClassPathResource("/my/resource.json", this.getClass());

获得Resource后,您可以通过File获得getFile()引用,或通过致电InputStream直接获得getInputStream()

Spring提供了Resource接口的不同实现,请查看docs

中的已知实现列表

答案 1 :(得分:1)

使用Spring的类ClassPathResource从类路径加载文件。

例如,你可以从classpath中将文件读入String:

String fileContent = FileUtils.readFileToString(
       new ClassPathResource("folder1" + File.separator + "1.txt").getFile());

只要该文件位于类路径上,使用何种构建工具或项目结构并不重要。