Поиск ресурсов с помощью PathMatchingResourcePatternResolver и URLClassloader в JAR
Я пытаюсь загрузить все ресурсы с определенным расширением файла, которые динамически загружаются во время выполнения с помощью URLClassloader.
К сожалению, PathMatchingResourcePatternResolver не возвращает ресурсы, когда я использую шаблон classpath*:/*.myextension
. Когда я указываю файл с его полным именем, например classpath*:/test.myextension
, ресурс загружается, поэтому я думаю, что Codeloader настроен правильно.
URLClassloader classloader = new URLClassloader(jarURLs); // jarURLs look like "file:C:/Temp/test.jar"
Thread.getCurrentThread().setContextClassloader(classloader)
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classloader);
Resource[] resources = resolver.getResources("classpath*:/*.myextension") // yields empty array
....
Как я могу это сделать? Я должен загружать банки динамически, и я не знаю имена ресурсов заранее.
Ответы
Ответ 1
Как упоминалось в комментариях к "Тройной поездке" в комментарии к его ответу, у меня была ошибка в моей схеме. Spring -документация также об этом ясно говорит (см. Предупреждение): "classpath *:" в сочетании с Ant -образными шаблонами будет только работайте надежно с хотя бы одним корневым каталогом до запуска шаблона... возникает из ограничения в JDK ClassLoader.getResources()
Итак, я изменил свой шаблон на
classpath*/model/*.myextension
Поскольку JAR создаются из xText-DSL, я должен применять соглашение, которое должна использоваться папка модели.
Ответ 2
Загрузка файлов динамически в Spring проста, я бы изменил подход к поиску файлов с расширениями.
Попробуйте следующее:
ClassLoader cl = this.getClass().getClassLoader();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
Resource[] resources = resolver.getResources("classpath*:/*.xml") ;
for (Resource resource: resources){
logger.info(resource.getFilename());
}