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. > It shouldn't be too hard to create your > own ModuleFinder that finds modules under META-INF/modules. This would > mean implementing ModuleFinder rather trying to use > ModuleFinder.of(Path...). This is what my implementation currently does. 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. I assume you've found ModuleDescriptor.read to > read/parse the module-info.class of explicit modules. I don't actually need to read the explicit modules. I just check that they have module-info.class and use let ModuleFinder.of do the rest of the job. > You are right that > it would require code to scan directory trees, at least the equivalent > of automatic modules, maybe for explicit modules too. However, it > shouldn't be too hard. Have you tried the zip file system provider? That > would allow you to open the JAR file as a file system so you can use the > file system API. > > Yes, I'm opening a ZIP filesystem on the single-jar and using the file system API to navigate it. > > I have also identify an additional use case which is to allow > hot-deploying > > automatic modules during development from target/classes using a Maven > > plugin. > > > I'm not sure how to interpret this but just to say that the unit of > replacement is the module layer, you can't replace modules in a layer > and/or dynamically change the set of packages in a loaded module. > 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. Cheers, Eirik.