Как переключиться с ResourceBundle на свойства (класс)?

Как переключиться с ResourceBundle на свойства (класс)?

У меня есть приложение, разделенное на 2 проекта Java (ядро и сеть). Служба Java в основном модуле должна считывать значения из файла .properties, расположенного в веб-модуле. Когда я использую ResourceBundle, он работает так, как ожидалось.

Я хотел переключиться на класс Properties по нескольким причинам (особенно потому, что ResourceBundle кэшируется, и я не хочу реализовывать ResourceBundle.Control без кеша). К сожалению, я не могу заставить его работать, особенно потому, что не могу выяснить, какой правильный относительный путь использовать.

Я прочитал декомпилированный класс ResourceBundle (и др.) и заметил использование getResource() в некотором ClassLoader. Поэтому вместо прямого использования FileInputStream я тестировал с помощью getResource() или просто getResourceAsStream() в ServiceImpl.class или ResourceBundle.class, но все равно безуспешно...

У кого-нибудь есть идея, как получить эту работу? Спасибо!

Это ядро ​​​​моего приложения со службой, получающей значения свойств:

app-core
    src/main/java
        com.my.company.impl.ServiceImpl

            public void someRun() {
                String myProperty = null;
                myProperty = getPropertyRB("foo.bar.key"); // I get what I want
                myProperty = getPropertyP("foo.bar.key"); // not here...
            }

            private String getPropertyRB(String key) {
                ResourceBundle bundle = ResourceBundle.getBundle("properties/app-info");
                String property = null;
                try {
                    property = bundle.getString(key);
                } catch (MissingResourceException mre) {
                    // ...
                }
                return property;
            }

            private String getPropertyP(String key) {
                Properties properties = new Properties();

                InputStream inputStream = new FileInputStream("properties/app-info.properties"); // Seems like the path isn't the good one
                properties.load(inputStream);
                // ... didn't include all the try/catch stuff

                return properties.getProperty(key);
            }

Это веб-модуль, в котором находится файл свойств:

app-web
    src/main/resources
        /properties
            app-info.properties

person maxxyme    schedule 22.01.2013    source источник
comment
Связано: stackoverflow.com/questions/2308188/   -  person BalusC    schedule 22.01.2013


Ответы (2)


Вы должны использовать getResource() или getResourceAsStream() с правильным путем и загрузчиком классов.

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("properties/app-info.properties");

Убедитесь, что файл называется app-info.properties, а не что-то вроде app-info_en.properties, которое будет найдено ResourceBundle (при совпадении контекста), но не getResourceAsStream().

person pingw33n    schedule 22.01.2013
comment
К сожалению, это будет искать пакеты только в текущем модуле, если вы используете модульную систему. - person Dragas; 17.02.2021

Вы не должны пытаться читать свойства из файловой системы. Измените свой метод, который получает свойства, чтобы вместо этого загружать их из потока ресурсов. Псевдокод:

private String getPropertyP(final String key) {
    final Properties properties = new Properties();

    final InputStream inputStream = Thread.currentThread().getContextClassLoader()
       .getResourceAsStream("properties/app-info.properties");
    properties.load(inputStream);

    return properties.getProperty(key);
}
person Perception    schedule 22.01.2013
comment
Это решение тоже работает (проверено), но я предпочитаю другое, более аккуратное для меня и без материала Thread. - person maxxyme; 23.01.2013