On 14/12/2024 00:02, David Lloyd wrote:
:

The problem with having one (or a few) broad layer for all named modules is twofold: first, that every module that *might* be needed for an application must be found and loaded before *any* module is able to be loaded. This works in some simpler packaging scenarios but is too startup-heavy in cases with very large numbers of modules. The "--add-modules" switch on the Java launcher is a direct result of forbidding late binding of modules. From a usability perspective, this is already far from ideal, and if you start talking about hundreds or thousands of modules, it becomes completely unworkable. The second problem is that it makes it very difficult to support any kind of dynamicity (for example adding additional plugins/service implementations at run time) since an outsized amount of static analysis must be done to categorize the layers, whereas lazily loading layers solves the problem easily and elegantly.

If the real issue here is "too startup-heavy" then that might be something to focus on.

The --add-modules command line option serves many cases where additional modules may be needed. The intention with `--add-modules ALL-DEFAULT` was to help container like applications that in turn load other applications at run-time. The container can of course create a module layer before creating layers for applications and the only real challenge there is the JDK "platform modules", cue the requirement for "dynamic augmentation of platform modules". We only got so far on this topic, but enough for needs such as allow the JMX agent or a Java agent be loaded into a running VM when the modules required to support that are not in the boot layer.

Module layers works well for plugins and services and are of course created on-demand. I don't think I understand what you mean by "outsized amount of static analysis must be done to categorize the layers", is this a reference to your exploration into multi-parent configurations and one-module-per-layer?

-Alan



Reply via email to