I am trying to load all resources with a specific file-extension which are loaded dynamically at runtime using a URLClassloader.
Unfortunately the PathMatchingResourcePatternResolver return no Resources when I use the pattern classpath*:/*.myextension
. When I specify a file with its complete name like classpath*:/test.myextension
the resource gets loaded, so I think the Classloader is configured right.
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 ....
How can I do this? I have to load the jars dynamically and I dont know the resource-names in advance.
Loading the files dynamically in Spring is simple, I'd change the approach to finding the files with extensions.
Try the following:
ClassLoader cl = this.getClass().getClassLoader(); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); Resource[] resources = resolver.getResources("classpath*:/*.xml") ; for (Resource resource: resources){ logger.info(resource.getFilename()); }
As Tech Trip mentioned in the comment to his answer, I had an error in my pattern. The Spring-documentation is also quiet clear about that (see Warning): "classpath*:" when combined with Ant-style patterns will only work reliably with at least one root directory before the pattern starts...originates from a limitation in the JDK's ClassLoader.getResources()
So I changed my pattern to
classpath*/model/*.myextension
Since the JARs are created from an xText-DSL I have to enforce a convention that the model-folder has to be used.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With