Приложение, упакованное с Jlink, не может найти файл свойств - PullRequest
0 голосов
/ 20 декабря 2018

Я мигрирую приложение из 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/";

и вручную скопировал папку config в папку binпосле выполнения jlink.Это работает, когда я запускаю приложение, но оно не работает из Eclipse, и это грубое и уродливое решение.

Есть ли способ сохранить доступ к файлу свойств пользователем в образе времени выполнения?генерируется jlink и в то же время доступен Eclipse?

1 Ответ

0 голосов
/ 20 декабря 2018

Никогда не было правильно предполагать, что классы происходят из файла .jar, который является физическим файлом в файловой системе платформы.(Кроме того, getCodeSource () может возвращать null ).

В Windows, OS X и Linux есть стандартные места, где хранятся файлы конфигурации пользователя.См. Найти место для выделенной папки приложения .Чтобы упростить информацию по этой ссылке:

  • Windows: 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 внутриПрограмма, как ресурс только для чтения.При выходе из программы эта конфигурация, возможно измененная пользователем, сохраняется в стандартном месте конфигурации системы.

...