Как загрузить пакет ресурсов из файла, а не из jar, то же имя базы пакета

Существуют пакеты ресурсов с одинаковым базовым именем как в файловой системе, так и в jar. Попробуйте загрузить пакет ресурсов из файловой системы, а не из jar.

URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL});
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );

Пакет загружается из jar, а не из файловой системы. Зачем? Если я изменил базовое имя пакета на my.foo.bundle(отличается от имени пакета в jar), это сработало. Но имена пакетов одинаковы для файловой системы и в jar. Есть ли способ?

Благодарю.

1 ответ

Решение

Я считаю, что это из-за способа загрузки ресурсов URLClassLoader.

В случае URLClassLoader:
Всякий раз, когда запрашивается ресурс, он сначала просит родительский загрузчик классов загрузить его. Если этот ресурс недоступен, он проверяет загрузчики дочерних классов.


Не уверен, что это лучший способ, но возможные решения:

1. Используйте конструктор

`public URLClassLoader(URL[] urls, ClassLoader parent)`

И дать ноль для родителя

Вот так:

URLClassLoader urlLoader = new URLClassLoader(new java.net.URL[]{filePathURL}, null);
ResourceBundle bundle = ResourceBundle.getBundle( "my.bundle", locale, urlLoader );

2. Расширьте URLClassLoader и переопределите метод getResource Метод, который нужно загрузить из вашего загрузчика классов:


public URL getResource(String name) {
    URL url = findResource(name); // this will load from your class loader
    if (url == null) {
        if (parent != null) {
            url = parent.getResource(name);
        } else {
            url = getBootstrapResource(name);
        }
    }

    return url;
}
Другие вопросы по тегам