What is the optimal way to get all files in META-INF/services/ in automatic module
PavelTurk
pavelturk2000 at gmail.com
Tue Dec 24 08:04:13 UTC 2024
On 12/24/24 08:54, Alan Bateman wrote:
>
>
> On 23/12/2024 09:12, PavelTurk wrote:
>> Hello everyone,
>>
>> I have `Module module`. If this module is automatic I need to get the list of all its services/providers, so,
>> as I understand the only way to do it is to read its META-INF/services folder. I tried:
>>
>> if (module.getDescriptor().isAutomatic()) {
>> ClassLoader classLoader = module.getClassLoader();
>> Enumeration<URL> resources = classLoader.getResources("META-INF/services/");
>> while (resources.hasMoreElements()) {
>> URL resource = resources.nextElement();
>> ...
>> }
>> }
>>
>> but it doesn't work. All `resource`s have same path ending in `....META-INF/service`.
>> I tried:
>>
>> ModuleReference reference = ... ;
>> var entries = reference.open().list().collect(Collectors.toList());
>>
>> It worked, but I need only one folder, but not all with all classes etc. Could anyone what is the optimal way to do it?
>
> In your second attempt then you course add a filter it to just the resources with names that start with META-INF/services.
>
It is clear that it is possible to use filter. The question was how to do it not iterating ALL entries in jar. That's why I was asking about the optimal way.
Do I understand correctly, that there is no way to do it. If so, maybe it is necessary to add method ModuleReference#open(String path)?
> In any case, I assume the method you are looking for is ModuleDescriptor::provides. It returns the set of Provides objects for service providers in the module (it doesn't matter than the module is an automatic module).
>
Thank you. I thought that module descriptor returns providers only for explicit modules on the base of `module-info`.
> -Alan.
Best regards, Pavel
More information about the jigsaw-dev
mailing list