RE: Another module system question

2017-02-20 Thread Langer, Christoph
Thanks, Alan. That sounds promising. I'll try it.

> -Original Message-
> From: Alan Bateman [mailto:alan.bate...@oracle.com]
> Sent: Montag, 20. Februar 2017 20:49
> To: Langer, Christoph <christoph.lan...@sap.com>; jigsaw-
> d...@openjdk.java.net
> Subject: Re: Another module system question
> 
> On 20/02/2017 19:15, Langer, Christoph wrote:
> 
> > :
> >
> > However, the main issue I have with this approach is: When is the time that
> my service from the second module 'b' will be available and registered? I
> assume, module 'a' will load first, then 'b'. So, when I use some static class
> initialization as the place in 'a' where I try to load the service from 'b', 
> I guess
> the service couldn't be available yet. Is there some module system
> initialization hook, where I could plug in and then assume the service from 
> 'b'
> is ready? Or should I maybe add a static class initializer in 'a' which would 
> try
> to resolve the implementing service from 'b' in a loop until it is ready?
> >
> Declaring the `uses` and `provides` and deploy the modules on the module
> path should be enough. When the consumer module (the module with
> `uses`)
> is resolved then it will trigger any providers to be resolved. The
> resolved modules are loaded eagerly (meaning they are defined to the VM)
> but there is nothing actually loaded. When you invoke ServiceLoader to
> get a stream or to iterate over the providers then it will load the
> provider from `b`. It's probably best to just try it out as it's easy to
> get something working. Often the hard bit is deciding on the service
> interface and choosing the methods to expose to allow a consumer select.
> 
> -Alan


Re: Another module system question

2017-02-20 Thread Alan Bateman

On 20/02/2017 19:15, Langer, Christoph wrote:


:

However, the main issue I have with this approach is: When is the time that my 
service from the second module 'b' will be available and registered? I assume, 
module 'a' will load first, then 'b'. So, when I use some static class 
initialization as the place in 'a' where I try to load the service from 'b', I 
guess the service couldn't be available yet. Is there some module system 
initialization hook, where I could plug in and then assume the service from 'b' 
is ready? Or should I maybe add a static class initializer in 'a' which would 
try to resolve the implementing service from 'b' in a loop until it is ready?

Declaring the `uses` and `provides` and deploy the modules on the module 
path should be enough. When the consumer module (the module with `uses`) 
is resolved then it will trigger any providers to be resolved. The 
resolved modules are loaded eagerly (meaning they are defined to the VM) 
but there is nothing actually loaded. When you invoke ServiceLoader to 
get a stream or to iterate over the providers then it will load the 
provider from `b`. It's probably best to just try it out as it's easy to 
get something working. Often the hard bit is deciding on the service 
interface and choosing the methods to expose to allow a consumer select.


-Alan