Adding modules from a child layer
Code Ranger
coderanger2025 at outlook.com
Fri Mar 14 11:03:10 UTC 2025
There is a framework for working with layers, see https://github.com/techsenger/alpha
It has several demos and every demo shows how to work with Jetty 12 and Web application
when they are in different layers. Maybe it can be interesting for you.
On 3/14/25 12:54, Simone Bordet wrote:
> Hi,
>
> I'm working on improving JPMS support in Jetty.
>
> Jetty 12 has a set of core modules that do not depend on Jakarta EE,
> and then has "environments" such as ee9, ee10, etc. so it is possible
> to deploy on the same server both an EE9 web application and an EE10
> web application: Jetty isolates the jakarta.servlet-api-5.0.0.jar (for
> EE9) from the jakarta.servlet-api-6.0.0.jar (for EE10).
>
> Previously, this was done using ClassLoaders only.
>
> Now I am trying to use ModuleLayers, with the following setup.
>
> - server ModuleLayer
> + jetty-util-12.1.0.jar (plus a bunch of other Jetty core jars)
>
> - ee10 ModuleLayer (child of the server ModuleLayer)
> + jakarta.servlet-api-6.0.0.jar
> + jetty-ee10-webapp-12.1.0.jar (plus a bunch of other Jetty ee10 jars)
>
> The server ModuleLayer is created by the JVM at startup, via command
> line (i.e. java -p jetty-util-12.1.0.jar:... -m ...).
> The ee10 ModuleLayer is created at runtime by the Jetty code (reading
> command line arguments).
>
> Now, it happens that jetty-ee10-webapp.jar requires java.instrument
> (declared in the jetty-ee10-webapp's module-info).
>
> Running in this setup yields:
>
> Exception in thread "main" java.lang.module.FindException: Module
> java.instrument not found
> at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)
> at java.base/java.lang.module.Resolver.resolve(Resolver.java:129)
> at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)
> at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)
>
> My interpretation of this error is that the ee10 ModuleLayer tries to
> resolve the jetty-ee10-webapp dependencies; obviously the
> java.instrument module is not in the ee10 ModuleLayer, so it delegates
> to the server ModuleLayer.
> The server ModuleLayer has modules, but none depend on
> java.instrument, and there is no explicit --add-modules
> java.instrument directive (as it is not necessary for the server
> ModuleLayer), so the java.instrument module is not in the module
> graph, and hence the error.
>
> If I manually add the --add-modules java.instrument directive to the
> server ModuleLayer, the error is gone.
>
> The question is whether there is a way for a child ModuleLayer to
> perform the equivalent of "--add-modules", but programmatically at
> runtime, that would add the module to the graph?
>
> As a side question, I was wondering what is the benefit of using
> ModuleLayers versus just using ClassLoaders.
> I can think of earlier error detection: if the ModuleLayer is not
> setup correctly (as above) I get an early error, which I would only
> get much later at runtime if I was using ClassLoaders.
> Isolation is provided by the ClassLoaders anyway.
> Anything else I could not think of?
>
> Thanks!
More information about the jigsaw-dev
mailing list