gpt4 book ai didi

JavaFX :Editable Configuration Files After Packaging

转载 作者:行者123 更新时间:2023-12-02 03:53:05 25 4
gpt4 key购买 nike

我有一个 JavaFX 应用程序,我使用 antBuild 将其打包以构建单个安装程序 .exe 文件,我的应用程序有一些配置文件放置在项目的根目录中,这样我可以从项目的根目录加载它们为了它们可以放置在 .jar 文件旁边并且可以更改:

        try {
File base = null;
try {
base = new File(MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI())
.getParentFile();
} catch (URISyntaxException e) {
System.exit(0);
}
try {
File configFile = new File(base, "config.properties");
}

因此,在打包应用程序后,即使我手动将文件与 jar 文件放在同一位置,应用程序也无法识别它们并出错。

<小时/>

那么,存储某种配置文件的正确方法是什么?在哪里存储某种配置文件,以及如何将它们添加到安装程序中以在安装过程中将其放置在正确的位置?

最佳答案

如果您的应用程序捆绑为 jar 文件,则 MainApp.class.getProtectionDomain().getCodeSource().getLocation().toURI()将返回 jar:方案 URI。 constructor for File taking a URI 假设它得到 file:方案 URI,这就是您在此处收到错误的原因。 (基本上,如果您的应用程序捆绑为 jar 文件,则资源 config.properties 根本不是一个文件,而是存档文件中的一个条目。)基本上没有(可靠的)更新方法捆绑应用程序的 jar 文件的内容。

我通常处理此问题的方法是将默认配置文件捆绑到 jar 文件中,并在用户文件系统上定义用于存储可编辑配置文件的路径。通常这将相对于用户的主目录:

Path configLocation = Paths.get(System.getProperty("user.home"), ".applicationName", "config.properties");

或类似的东西。

然后在启动时你可以这样做:

if (! Files.exists(configLocation)) {
// create directory if needed
if (! Files.exists(configLocation.getParent())) {
Files.createDirectory(configLocation.getParent());
}

// extract default config from jar and copy to config location:

try (
BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.properties")));
BufferedWriter out = Files.newBufferedWriter(configLocation);) {

in.lines().forEach(line -> {
out.append(line);
out.newLine();
});
} catch (IOException exc) {
// handle exception, e.g. log and warn user config could not be created
}
}

Properties config = new Properties();
try (BufferedReader in = Files.newBufferedReader(configLocation)) {
config.load(in);
} catch (IOException exc) {
// handle exception...
}

因此,这将检查配置文件是否已存在。如果没有,它会从 jar 文件中提取默认配置并将其内容复制到定义的位置。然后它从定义的位置加载配置。因此,用户第一次运行应用程序时,它使用默认配置。之后,用户可以编辑配置文件,随后它将使用编辑后的版本。如果您愿意,当然可以创建一个 UI 来修改内容。这样做的一个好处是,如果用户做了一些事情使配置不可读,他们可以简单地删除它,然后将再次使用默认值。

显然,这可以更好地防止异常(例如,处理目录由于某种原因不可写的情况,使配置文件位置用户可定义等),但这是我在这些场景中使用的基本结构。

关于JavaFX :Editable Configuration Files After Packaging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35709227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com