Spring Boot jar中的FileNotFoundException但文件存在

bra*_*orm 2 java maven spring-boot

文件明显位于jar中时,我正在获取FileNotFoundException。为什么会这样呢?

java.io.FileNotFoundException: file:/Users/serviceuser/project/coolApp/target/coolApp-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/ssl_certs/mysslstore.jks (No such file or directory)
    at java.base/java.io.FileInputStream.open0(Native Method) ~[na:na]
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219) ~[na:na]
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) ~[na:na]
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) ~[na:na]
Run Code Online (Sandbox Code Playgroud)

但是,我看到文件打包在jar中。

jar -tf coolApp-1.0-SNAPSHOT.jar | grep ssl

在此处输入图片说明

编辑 我加载文件如下

new FileInputStream(CoolApp.class.getClassLoader().getResource("ssl_certs/mysslstore.jks").getFile())
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 5

这里 :

new FileInputStream(CoolApp.class.getClassLoader().getResource("ssl_certs/mysslstore.jks").getFile());
Run Code Online (Sandbox Code Playgroud)

getFile()URL在jar中包含的上被调用。
结果,它提供了一个特定的File对象,因为File在文件系统中不能直接访问该对象。

并且URLjavadoc 确认(强调是我的):

类URL表示一个统一资源定位符,它是指向万维网上“资源”的指针。资源可以是简单的文件或目录,也可以是对更复杂对象的引用,例如对数据库或搜索引擎的查询

因此,FileInputStream(File)构造函数不一定能够打开该“特殊”文件:

FileInputStream从文件系统中的文件获取输入字节。可用的文件取决于主机环境。

您可以将您的尝试与以下内容进行比较:

new FileInputStream("/Users/serviceuser/project/coolApp/target/coolApp-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/ssl_certs/mysslstore.jks")
Run Code Online (Sandbox Code Playgroud)

如您所料,mysslstore.jks操作系统文件系统无法解析jar()中包含的文件。

而是使用getResourceAsStream()来返回输入流。该输入流引用由资源表示的字节序列。这样,客户端代码不再依赖于资源的存储方式。

InputStream is = CoolApp.class.getClassLoader().getResourceAsStream("ssl_certs/mysslstore.jks"));
Run Code Online (Sandbox Code Playgroud)