【问题标题】:Application packaged with Jlink cannot find properties file使用 Jlink 打包的应用程序找不到属性文件
【发布时间】:2018-12-20 23:05:52
【问题描述】:

我正在将应用程序从 Oracle Java 8 迁移到 openJDK11 + openJFX11。 在 Java 8 版本中,我使用以下代码加载了一个属性文件(CryoStats 是包含该代码的类):

try {
    jarLocation = CryoStats.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
    confLocation = jarLocation.substring(0, jarLocation.lastIndexOf("/")) + "/config/";
try (FileInputStream input = new FileInputStream(confLocation + "CryoStats.properties");) {
            properties.load(input);
            HORUS_HOST = properties.getProperty("HORUS_HOST");
            HORUS_USERNAME = properties.getProperty("HORUS_USERNAME");
            HORUS_PASSWORD = properties.getProperty("HORUS_PASSWORD");
            CONNECTION_TIMEOUT = Integer.parseInt(properties.getProperty("CONNECTION_TIMEOUT"));
            SOCKET_TIMEOUT = Integer.parseInt(properties.getProperty("SOCKET_TIMEOUT"));
            System.out.println("CryoStats.properties loaded.");
        } catch (FileNotFoundException ex) {
            System.out.println("Error loading properties file");
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println("Error loading properties file");
            System.out.println(ex.getMessage());
        }
} catch (URISyntaxException ex) {
        System.out.println(ex.getMessage());
    }

在我的 Netbeans 构建配置中,我有一个任务将“config”文件夹复制到“dist”文件夹,因此包括:我的 jar 文件、一个“lib”文件夹、一个“config”文件夹。 此代码在 Netbeans 和运行时都有效。

我需要让用户能够编辑属性文件,所以我需要将它保存在 jar 之外。

我现在已将代码迁移到 Eclipse 项目,并针对 openJDK11 和 openJFX11 进行编译。如果我在 Eclipse 中运行项目,它会加载属性文件。但是,如果我使用 jlink 创建我的模块的运行时映像,它会找不到属性文件,并且 jarLocation 的值是:

jarLocation = /cryostats

据我所知,这是因为在完全模块化的 Java 应用程序中没有类路径的概念,所以作为一种解决方法,我使用了

confLocation = System.getProperty("user.dir") + "/config/";

我在执行 jlink 后手动将“config”文件夹复制到“bin”文件夹。这在我启动应用程序时有效,但它在 Eclipse 中不起作用,这是一个粗糙且丑陋的解决方案。

有没有办法让用户可以在 jlink 生成的运行时映像中访问属性文件,同时又可以被 Eclipse 访问?

【问题讨论】:

    标签: java properties-file jlink


    【解决方案1】:

    假设类来自平台文件系统中的物理文件 .jar 文件从来都不是正确的。 (另外,getCodeSource() can return null)。

    Windows、OS X 和 Linux 都有存储用户配置文件的标准位置。见Find place for dedicated application folder。过度简化来自该链接的信息:

    • 窗口:System.getProperty("user.home") + "\\AppData\\Roaming\\CryoStats"
    • OS X:System.getProperty("user.home") + "/Library/Application Support/CryoStats"
    • Linux:System.getProperty("user.home") + "/.config/CryoStats"

    (不要直接使用这些路径;它实际上比这更复杂。阅读链接以获取完整说明。)

    永远不要使用System.getProperty("user.dir")——这是当前目录,它可以是任何东西,包括系统的根目录。另一方面,user.home 系统属性指向一个稳定的位置,即用户的主目录。

    我对应用程序配置所做的是:我在程序中包含 default 配置,作为只读资源。当程序退出时,它会将可能由用户修改的配置保存到系统的标准配置位置。

    【讨论】:

    • 您好,请问您如何处理在默认配置之间切换为只读,然后切换到系统的标准配置位置?
    • @SukmaWardana 如果标准配置文件存在,我阅读;否则,我会回退到使用默认配置。
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2021-08-09
    • 1970-01-01
    • 2011-06-25
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多