我使用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将其设置为当前目录,但是这些都没有用到
答案 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());
只要该文件位于类路径上,使用何种构建工具或项目结构并不重要。