Использование метода ClassLoader для получения всех ресурсов в классах как входных потоков

Моя проблема, как вы думаете, довольно распространена, но мне пока не удалось найти решение.

Создание веб-приложения Java под Tomcat 5.5 (хотя требуется, чтобы его можно было развернуть где угодно, например, в среде WebLogic, отсюда и необходимость загрузки ресурсов в виде потоков). Хорошая практика требует, чтобы файлы ресурсов помещались в WEB-INF / classes и загружались с помощью метода getResourceAsStream () ClassLoader. Все хорошо, когда вы знаете имя ресурса, который хотите загрузить.

Моя проблема в том, что мне нужно загрузить все (в том числе рекурсивно в непустые подкаталоги), что находится в подкаталоге классов.

Так, например, если у меня есть следующее в WEB-INF / classes:

folderX / folderY

folderX / folderY / fileA.properties

folderX / fileB.properties

Мне нужно загрузить классы fileA.properties и fileB.properties, не зная их имен до запуска приложения (т.е. мне нужна возможность произвольно загружать ресурсы из любого каталога в WEB-INF / classes).

Как это сделать наиболее элегантно? Какой объект я мог бы опросить, чтобы найти нужную мне информацию (пути к каждому из требуемых ресурсов)? Лучше всего было бы решение, не относящееся к сервлету (если возможно, сохраняя все в рамках структуры загрузки классов).

Заранее спасибо!


person ubermensch    schedule 26.05.2009    source источник


Ответы (2)


Вы можете сделать это с помощью некоторых хитростей :)

Получите ресурс как URL, извлеките протокол:

  • файловый протокол - получите URL-путь и у вас есть папка, поиск файлов.
  • протокол jar / zip - извлеките путь jar / zip и используйте JarFile для просмотра файлов и извлечения всего, что находится под вашим путем / пакетом.
person adrian.tarau    schedule 26.05.2009
comment
Не может веб-сервер вернуть HTTP-протокол, указывающий на себя? Я бы сказал, что, как минимум, такой подход следует протестировать на всех целевых веб-серверах, чтобы убедиться, что он работает. - person Yishai; 26.05.2009
comment
Реализация REST Sun Jersey использует этот подход для поиска определенных классов на основе имени пакета (поиск классов с определенной аннотацией). - person adrian.tarau; 26.05.2009
comment
А как насчет ограничений WebLogic с точки зрения развертывания неразорвавшейся WAR? Разве любая попытка создания экземпляров и опроса файловых объектов не вызовет проблем в WebLogic? - person ubermensch; 27.05.2009
comment
Нет, абсолютно нет. Игра с объектами File или ZipFile не влияет на контейнер, независимо от того, какой из них вы используете. - person adrian.tarau; 27.05.2009
comment
Файловый протокол может работать. Извлечение jar / zip рекурсивно будет включать в себя все архивы .war и / или .ear вашего приложения. Это кажется более чем сложным! Если кто-то в этом разбирается, он должен сделать хороший проект с открытым исходным кодом! - person Adam; 22.09.2010

Насколько мне известно, такой возможности нет, поскольку загрузчик классов пытается только загрузить то, что он запрашивает. Он не выполняет предварительную выборку всех элементов в пути к классам и не рассматривает их как структуру каталогов.

Способ, которым я решил бы проблему, - это создать список каталогов в текстовом файле всех соответствующих ресурсов во время сборки и включить его в войну, а затем пройти через это таким образом.

person Yishai    schedule 26.05.2009