JavaFX程序如何打包为带可修改.txt依赖的.exe文件
实现方案
核心原理
所有打包进jar/exe包内部的文件都是只读的,运行时无法直接修改。要实现打包后可修改txt配置、字典文件,本质是把这类文件放到程序包外部的独立目录,程序运行时从相对路径读取外部文件,不要读取classpath内打包的资源。Launch4J完全支持该需求,不需要更换打包工具。
你之前的尝试没生效,核心问题有两个:一是代码里写的src/main/resources/text1路径仅在IDE开发环境有效,打包后不存在src目录,根本读不到对应文件;二是如果把txt打进jar包内部,本身就不支持运行时修改,和Launch4J的配置无关。
第一步:修正代码的文件读取逻辑
不需要修改的静态资源比如fxml文件,依然可以放在classpath资源目录下打包进jar;只有需要后续修改的txt文件,要改成读取程序运行目录下的外部文件,参考修正后的代码:
public class TestController { @FXML public Button text1Button; @FXML public Button text2Button; @FXML public TextArea textArea; public void printText1(ActionEvent actionEvent) { // 直接传文件名即可,不需要带资源路径 List<String> lines=readFromFile("text1.txt"); StringBuilder sb = new StringBuilder(); lines.forEach(l->sb.append(l).append("\n")); textArea.setText(sb.toString()); } public void printText2(ActionEvent actionEvent) { List<String> lines=readFromFile("text2.txt"); StringBuilder sb = new StringBuilder(); lines.forEach(l->sb.append(l).append("\n")); textArea.setText(sb.toString()); } private List<String> readFromFile(String fileName){ List<String> lines = new ArrayList<>(); try{ // 获取程序当前的运行目录 String runDir = new File("").getAbsolutePath(); // 统一把可修改的txt放在exe同级的config文件夹下,方便管理,可自定义路径 Path filePath = Paths.get(runDir, "config", fileName); lines=Files.readAllLines(filePath, StandardCharsets.UTF_8); } catch (IOException ioe){ ioe.printStackTrace(); } return lines; } }
第二步:打包配置(以Maven/Gradle + Launch4J为例)
- 先把JavaFX项目打包成包含所有依赖的可执行fat jar,打包时排除所有需要外部修改的txt文件,不要把这类文件打进jar包。如果用Maven,配置shade/jar插件时添加对应文件的排除规则即可。
- 在准备存放exe的发布目录下,新建
config文件夹,把text1.txt、text2.txt这类需要后续修改的文件放进去。 - 打开Launch4J做常规配置:选择输出exe的路径、选择刚才打好的fat jar路径、配置匹配的JRE版本要求,不需要额外做资源绑定配置,直接生成exe即可。
- 如果Launch4J配置为将jar内嵌到exe中,发布目录不需要单独放jar文件,只要保证config文件夹和exe同级就可以正常读取。
- 最终的发布目录结构如下:
程序发布文件夹/ ├─ 你的程序.exe └─ config/ ├─ text1.txt ├─ text2.txt
后续要修改txt内容,直接编辑config文件夹下的对应文件即可,不需要重新编译打包程序。
可选优化
可以在程序启动时加一层校验:如果外部路径下的txt文件不存在,就自动从jar包内预置的默认模板复制一份到外部config目录,避免用户误删文件导致程序运行报错。
内容的提问来源于stack exchange,提问作者Zoltán Tóth
相关产品推荐
相关产品推荐

