On 16/09/2014 15:14, Pavel Rappo wrote:
Daniel,

Given that helper.loadClass uses the context class loader,
Should you also simply use
  ServiceLoader<InitialContextFactory> loader =
                     ServiceLoader.load(InitialContextFactory.class);
at lines 680-681 ?
It needs to be the system class loader to allow for JNDI providers that might 
be on the class path or module path.
The TCCL would be more appropriate here as that would allow for JNDI providers that are bundled with the application (the TCCL should eventually delegate to the system class loader so it should find the JNDI provider on the class path or linked into the runtime image too).

:

IMO, it's not just an inconvenience, but rather a part of ServiceLoader's design. I mean, 
it's definitely designed to provide, so to say, a "one-to-many" mapping for the 
classes (providers) that implements some interface (a service) to a client. It merely 
delivers you implementations. You should than iterate though them and decide which one 
satisfies your needs. I'm not sure it's a good idea to get services based on their 
implementation classnames.
Right, it's the user of ServiceLoader that does the selection. The real issue here of course is the JNDI API where the user specifies the class name of the implementation factory when creating the initial context. I've no doubt that it would be done differently if re-designed now.

-Alan

Reply via email to