Подтвердить что ты не робот

Как читать несколько файлов ресурсов с тем же именем из разных JAR?

Если в пути к классам есть два файла JAR, оба содержат ресурс с именем "config.properties" в своем корне. Есть ли способ получить оба файла, похожие на getClass().getResourceAsStream()? Заказ не имеет отношения.

Альтернативой будет загрузка каждого файла свойства в пути класса, который соответствует определенным критериям, если это вообще возможно.

4b9b3361

Ответ 1

Вам нужно ClassLoader.getResources(name)
(или статической версии ClassLoader.getSystemResources(name)).

Но, к сожалению, существует известная проблема с ресурсами, которые не находятся в "каталоге". Например. foo/bar.txt отлично, но bar.txt может быть проблемой. Это хорошо описано в справочнике Spring, хотя это никоим образом не проблема Spring.

Update:

Здесь вспомогательный метод, который возвращает список InputStreams:

public static List<InputStream> loadResources(
        final String name, final ClassLoader classLoader) throws IOException {
    final List<InputStream> list = new ArrayList<InputStream>();
    final Enumeration<URL> systemResources = 
            (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
            .getResources(name);
    while (systemResources.hasMoreElements()) {
        list.add(systemResources.nextElement().openStream());
    }
    return list;
}

Применение:

List<InputStream> resources = loadResources("config.properties", classLoader);
// or:
List<InputStream> resources = loadResources("config.properties", null);

Ответ 2

Файлы jar - это zip файлы.

Откройте файл с помощью java.util.zip.ZipFile

Затем перечислите его записи, которые ищут файл свойств, который вы хотите.

Когда у вас есть запись, вы можете получить свой поток с помощью .getInputStream()