I have a usecase where I am attempting to map an existing module system's class loaders to JPMS modules by using the Layer API. In this case the existing module system is OSGi. I have run into an issue when an existing OSGi bundle contains code that uses the ServiceLoader. For the sake of discussion the existing code could look like this:
ServiceLoader<PrintServiceLookup> sl = ServiceLoader.load(PrintServiceLookup.class); System.out.println(sl.findFirst().orElseGet(() -> {return null;})); Without mapping OSGi to JPMS modules this code works fine. This is because the code ends up being loaded by an unnamed module for which JPMS assumes is allowed to use any service through the ServiceLoader. But once I map the OSGi bundle class loader to a JPMS module the code above fails to work with an exception: java.util.ServiceConfigurationError: javax.print.PrintServiceLookup: module test.service.loader does not declare `uses` Is there any way around this? I know there is an addUses method, and I also know that I can generate ModuleDescriptors for my Layer that specify a proper uses requirement. But that would require a code scan to discover all possible calls to the ServiceLoader in order to declare the uses. Tom