Не удается получить ресурсы JAR, когда JAR находится в защищенном каталоге Windows

У меня есть файл свойств внутри самоисполняющегося.jar. На самом деле файл свойств находится в банке внутри банки (упакован с одной банкой). Если я запускаю банку с рабочего стола, она работает нормально, но когда я кладу ее внутрь Program Files каталог это не удается.

Это код, который я использую для загрузки файла свойств:

public static void initialize(String language, String region) throws IOException {
    try {
        Locale locale = new Locale(language, region);
        bundle = ResourceBundle.getBundle("resources.MessagesBundle", locale);
    } catch (Exception e) {
        InputStream is = Localization.class.getClassLoader()
                .getResourceAsStream("resources/MessagesBundle_en_US.properties");
        bundle = new PropertyResourceBundle(is);
    }
}

Я провел несколько экспериментов, чтобы попытаться получить лучшее сообщение об ошибке, чем "MissingResource", но пока оно либо работает, либо не работает. Вот еще немного кода, который работает, если он не находится в каталоге Program Files:

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
InputStream is = contextClassLoader.getResourceAsStream(fileName);
if (is != null) {
    int avail = is.available();
    System.out.println("Available: " + avail);
} else {
    System.out.println("Can't open!!!!!");
}

Это полное исключение из ResourceBundle.getBundleдругие функции просто возвращают ноль, когда файл не может быть загружен:

Caused by: java.util.MissingResourceException: Can't find bundle for base name com.willwinder.universalgcodesender.i18n.MessagesBundle, locale en_US
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at com.willwinder.universalgcodesender.i18n.Localization.initialize(Localization.java:39)
at com.willwinder.universalgcodesender.i18n.Localization.getString(Localization.java:44)
at com.willwinder.universalgcodesender.SettingsFactory.(Settings
Factory.java:65)
... 7 more

Таким образом, вопрос заключается в следующем: как я могу загрузить пакет ресурсов из банки, когда она выполняется в Program Files каталог?

Это проект с открытым исходным кодом, полный исходный код доступен здесь: https://github.com/winder/Universal-G-Code-Sender

Рассматриваемая банка находится здесь: https://github.com/winder/builds/blob/master/UniversalGCodeSender/UniversalGcodeSender-v1.0.7.zip?raw=true

1 ответ

Это как-то связано с one-jar, который используется для упаковки собственных файлов вместе с файлами jar в самозаполняемый файл jar. Эти файлы ресурсов изначально выглядели так:

basejar.jar
 \- lib\ (jar dependencies)
 |- binlib\ (native dependencies, serial lib, opengl, etc)
 |- main\
    \- main.jar (my code)
        \- resources\
            \- MessagesBundle_en_US.properties

После реорганизации файла jar, чтобы каталог ресурсов находился на верхнем уровне в контейнере контейнера, теперь я могу выполнить jar из защищенного каталога:

basejar.jar
 \- lib\ (jar dependencies)
 |- binlib\ (native dependencies, serial lib, opengl, etc)
 |- main\
 |   \- main.jar (my code)
 |- resources\
     \- MessagesBundle_en_US.properties

Я до сих пор не уверен, в чем причина, но, похоже, ошибка в one-jar,

Другие вопросы по тегам