
本文旨在解决java应用打包成jar后,资源文件加载失败的问题。通过分析`fileinputstream`在jar环境下的局限性,详细阐述了使用`class.getresourceasstream()`加载 classpath 资源的正确方法,并强调了`try-with-resources`、字符编码设置及路径规范等最佳实践,确保应用在ide和jar环境下均能稳定访问内部资源。
理解Java应用中的资源加载机制
在Java开发中,我们经常需要加载应用程序内部的资源文件,例如配置文件、图片、着色器代码等。在集成开发环境(IDE)中运行应用时,这些资源通常位于项目的源文件夹或资源文件夹中,Java虚拟机可以直接通过文件系统路径访问它们。然而,当我们将应用打包成可执行的JAR文件时,资源的加载方式会发生根本性的变化。
一个JAR文件本质上是一个压缩包,内部包含编译后的.class文件以及所有的资源文件。这些资源不再是独立的、可直接通过文件系统路径访问的文件,而是JAR包内部的条目。尝试使用基于文件系统操作的FileInputStream来访问JAR包内的资源,将导致FileNotFoundException,因为FileInputStream期望的是一个实际存在于文件系统上的路径,而非JAR包内部的虚拟路径。
例如,原始代码中尝试通过Shader.class.getClassLoader().getResource(sourceVertex).getFile()获取资源路径,并使用FileInputStream加载:
fs = new FileInputStream(Shader.class.getClassLoader().getResource(sourceVertex).getFile().replaceFirst("/", ""));
sourceVertex = new String(fs.readAllBytes());登录后复制
当应用在JAR包中运行时,getResource(...).getFile()返回的URL通常是jar:file:/path/to/OpenGL.jar!/engine/vs.glsl这种格式,其中!表示JAR包内部的路径。FileInputStream无法解析这种特殊的JAR内部路径,从而抛出FileNotFoundException。随后的NullPointerException很可能也是因为FileInputStream构造失败或返回了无效流导致。

立即学习“Java免费学习笔记(深入)”;
标签: java 编码 字节 虚拟机 ssl ai stream 配置文件 应用开发 java虚拟机 开发环境 java开发 j
还木有评论哦,快来抢沙发吧~