我正在将应用程序从 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 访问?