Java spring引导jar中的FileNotFoundException,但该文件存在
当文件清楚地存在于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
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();