JPackage打包JavaFX项目后资源文件访问失败问题求助
解决JPackage打包后JavaFX项目无法访问lib目录下resources资源的问题
方案一:使用类加载器加载资源(推荐)
用类加载器的getResourceAsStream()替代FileInputStream,这种方式不依赖文件系统路径,直接从类路径中查找资源,适配所有打包场景:
修改DBIO.loadResource方法中的代码:
// 替换原有的FileInputStream实现 // 路径为类路径根相对路径,若resources文件夹在类路径根下,填写"resources/icon.png" InputStream resourceStream = DBIO.class.getClassLoader().getResourceAsStream("resources/icon.png"); // 资源使用示例(以加载图片为例) if (resourceStream != null) { Image icon = new Image(resourceStream); resourceStream.close(); // 记得关闭流 } else { // 资源未找到时的处理逻辑 }
类加载器会自动遍历程序的类路径,而jpackage打包后lib目录会被加入类路径,因此不管resources是在开发环境还是打包后的lib目录,都能被正确定位。
方案二:通过文件系统路径定位lib目录
如果必须使用FileInputStream,可以先获取程序JAR所在的lib目录绝对路径,再拼接资源路径:
import java.io.File; import java.io.FileInputStream; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; public class DBIO { public static void loadResource() throws Exception { // 获取当前类所在JAR的路径 String jarPath = DBIO.class.getProtectionDomain().getCodeSource().getLocation().getPath(); jarPath = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); // 解码特殊字符 File jarFile = new File(jarPath); // JAR所在目录即为lib目录 File libDir = jarFile.getParentFile(); File iconFile = new File(libDir, "resources/icon.png"); // 使用FileInputStream访问资源 try (FileInputStream fis = new FileInputStream(iconFile)) { // 资源处理逻辑 } } }
注意: 该方案依赖jpackage的默认目录结构(JAR文件位于lib目录),若后续打包配置变更,需同步调整代码。
内容的提问来源于stack exchange,提问作者MakdaMujji
相关产品推荐
相关产品推荐

