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

Поиск ресурсов с помощью 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
....

Как я могу это сделать? Я должен загружать банки динамически, и я не знаю имена ресурсов заранее.

4b9b3361

Ответ 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());
}