Java spring引导jar中的FileNotFoundException,但该文件存在

Java spring引导jar中的FileNotFoundException,但该文件存在,java,maven,spring-boot,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.Fi

当文件清楚地存在于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]

像这样的文件需要在resources目录中

这里:

new FileInputStream(CoolApp.class.getClassLoader().getResource("ssl_certs/mysslstore.jks").getFile());
在jar中包含的
URL
上调用
getFile()

因此,它提供了一个特定的
文件
对象,因为它不是文件系统中可直接访问的
文件

并且该报告确认(重点是我的):

类URL表示统一资源定位器,即指向 万维网上的“资源”资源可以是 简单如文件或目录,也可以是对更多 复杂对象,如对数据库或搜索的查询 发动机

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

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

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

new FileInputStream("/Users/serviceuser/project/coolApp/target/coolApp-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/ssl_certs/mysslstore.jks")
正如您所猜测的,jar中包含的文件(
mysslsstore.jks
)无法由OS文件系统解析

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

InputStream is = CoolApp.class.getClassLoader().getResourceAsStream("ssl_certs/mysslstore.jks"));

jar中的文件不是传统文件路径目录结构的一部分。您需要以流的形式获取资源。@Compass我如上所述加载了文件,我认为这是认证问题。@LovaChittumuri这不是认证问题。这是FileNotFoundExceptionOk。。感谢您确认。在源代码中,它位于参考资料中。我在上面展示的是jar的内容。接受了答案,但尚未对其进行测试。
getResourceAsStream()
是关键,人们已经多次忘记了它。没有接受InputStream的新FileInputStream()构造函数。无需使用FileInputStream包装
.getResourceAsStream
。只需
CoolApp.class.getClassLoader().getResourceAsStream(“ssl\u certs/mysslsstore.jks”)
sufficient@brain事实上,这毫无意义:)谢谢,我修正了最后一行。在这种情况下,CoolApp将是Spring项目的主要类的名称…对吗?
InputStream is = CoolApp.class.getClassLoader().getResourceAsStream("ssl_certs/mysslstore.jks"));
I was facing the same issue in spring boot and I have tried many things like bellow but nun of them is working. thease all are working locally but  It is giving FileNotFoundException in dev environmnet because when we build a JAR, the resources get placed into the root directory of the packaged artifacts and our downloaded files I placed inside resource folder. 

Method 1: Working solution for jars
InputStream stram=getClass().getClassLoader().getResourceAsStream(File.separator+"database.properties");
URL url = getClass().getClassLoader().getResource(File.separator+"database.properties");

Only thing which worked is ResourceLoader. Need to Autowire it:
    @Autowired
    ResourceLoader resourceLoader;

        Resource resource = resourceLoader.getResource("classpath:" + File.separatorChar + NPIConstants.VAR_FOLDER
                + File.separatorChar + NPIConstants.TPSPIDsBUCKET_FILENAME);
        InputStreamResource isResource = new InputStreamResource(resource.getInputStream());

Method 1: Not Working solution for jars
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("database.properties");
System.out.println(is.available());

Method 2:  Not Working solution for jars
Resource resource = new ClassPathResource("database.properties");
InputStream input = resource.getInputStream();

Method 3: Not Working solution for jars
File file = new File("resources/database.properties");
String absolutePath = file.getAbsolutePath();

Method 4: Not Working solution for jars
File file = new File(getClass().getClassLoader().getResource("database.properties").getFile());

Method 5: Not Working solution for jars
ClassLoader classLoader = getClass().getClassLoader();
classLoader.getResource("database.properties");
String path  = classLoader.getResource("database.properties").getPath();