Loading an automatic module from an exploded directory

Alan Bateman Alan.Bateman at oracle.com
Fri Apr 10 11:08:44 UTC 2020


On 09/04/2020 19:23, Eirik Bjørsnøs wrote:
>
> Alan,
>
>     If I read your mail correctly, you are creating "multi-module JAR
>     files"
>     where the modules are "exploded" under /META-INF/modules in
>     ${NAME}-${VERSION} directories.
>
>
> Correct.
Do they need to be "exploded"? If the dependences are automatic modules 
then I assume putting the JAR files (without unpacking) into 
META-INF/modules should just work without needing a new ModuleFinder 
implementation or implementing the exploded equivalent of multi-module 
JAR files (or modular multi-release JAR files).

(The reason it should work is that the built-in implementation can work 
with paths to locations in virtual file systems. It handles this by 
copying the JAR files from the virtual file system to the default file 
system so that it can be opened with the JarFile API. It does this in 
order to support signed JARs as the zip file system provider doesn't 
have any support for validating signatures. It's possible this approach 
isn't very efficient, also we haven't looked into interactions with the 
cron jobs that clean tmpfs so there may be a bit more work needed here).

>
> To achieve this, I had to copy / replicate quite a bit of code from 
> the ModulePath class which is not accessible outside java.base.
>
> It wasn't all that hard, I just wasn't happy with the amount of 
> classes / methods I had to copy from java.base only to slightly modify 
> them
>
> This includes:
>
> Code to create / build the ModuleDescriptor (stolen from 
> deriveModuleDescriptor)
> Code to clean the artifactId used to produce the automatic name 
> (Stolen from cleanModuleName, Patterns and Checks)
> Duplication of ExplodedModuleReader which also dragged in Resources.
Understood although you probably don't need a deep copy of everything as 
there is a lot in exploded module reader related to potential security 
and traversal on the default file system that is less interesting in JAR 
files.


> :
>
> The runtime loads a graph of module layers, each containing one or 
> more modules. Layers may depend on other layers, forming a DAG with 
> corresponding class loader delegation.
>
> When the runtime detects that a module needs to be redeployed, the 
> transitive closure of depending layers is removed from the graph and 
> new module layers are created and added to the graph.
>
> Services are bound using dependency injection, so there's also a DAG 
> of service dependencies. This allows restarting services which are 
> affected by the redeploy, either because they are provided from 
> updated modules or because they consume services from updated modules.
>
> So not really hot-deploying in the JVM sense, but still pretty fast 
> and developer-friendly.
>
> My demo has a module which provides a JAX-RS resource which is 
> consumed by a Jersey module which provides an HttpServlet which is 
> again consumed by a Jetty module which deploys the servlet in a 
> servlet context.
>
> Redeploying the module containing the JAX-RS resource takes something 
> like 50ms IIRC.
>
This sounds very interesting. I'm sure there are several people here 
that would be interesting in seeing a write-up or demo of this. I'm 
curious if the service wiring make use of the existing uses/provides or 
something else. I'm also curious if you've run into any issues with 
multi-parent configurations as that is an area that might need attention 
some day.

-Alan





More information about the jigsaw-dev mailing list