gpt4 book ai didi

java - Spring Boot : Unable to read resources in lib/*. jar 使用 lib/*.jar 中的类

转载 作者:行者123 更新时间:2023-11-29 03:01:14 24 4
gpt4 key购买 nike

我正在使用 spring boot org.springframework.boot.loader.JarLauncher 来运行我自己的可执行 spring boot 应用程序 jar。

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

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

等等。

在我的 Abc.class 中,我试图加载资源 1.txt,当我在 eclipse 中运行它时,它工作正常;但是当我使用命令行作为自执行 jar 运行时,故事就开始了。我无法读取该资源并以空指针错误结束。

阅读几篇文章后,我了解到我的 IDE 在类加载器上做了一些神奇的工作,所以它工作正常,当我将它作为可执行 jar 运行时情况就不是这样了

这就是我加载文件的方式以及我尝试过的所有可能的选项,但都没有成功。

选项 1:

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

选项 2:

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

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

Thread.currentThread().getContextClassLoader().getResourceAsStream("folder1\1.txt")

谁能给个建议。我应该如何编写代码才能读取 jar 中的资源以及同一个 jar 中的类?

PS:Spring Boot 没有向 MANIFEST.MF 添加类路径条目,如果我必须围绕它做些什么,我该怎么做?事实上,我在运行我的 jar 时尝试了 -cp 将其设置为当前目录,但这也没有用

最佳答案

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

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

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

Spring 提供了很多Resource 接口(interface)的不同实现,看看docs 中的已知实现列表。

关于java - Spring Boot : Unable to read resources in lib/*. jar 使用 lib/*.jar 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34782010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com