For the last month we've been focusing quite a bit of energy toward seeing what it will take for WildFly to run well on the upcoming JDK 17. This post is one of two I plan. This one is an attempt to start a discussion around a couple topics; the other will be more of a status update.
Status summary is things are progressing well, no show-stoppers so far, but plenty more to do. More on that in the other post....
WF 23 runs well on SE 13. We want to get to 17. The key barriers are:
1) SE 14 dropped the java.security.acl package.
2) SE 15 introduced hidden classes (JEP 371)
3) SE 16 strongly encapsulated JDK internals by default (JEP 396)
SE 17 will eliminate global --illegal-access command line option (JEP 403) so explicit enumeration
of --add-opens and --add-exports will be the only possibility to open JDK internal packages.
The discussion points relate to #3. WildFly does quite a lot reflection stuff, plus we have some use cases where end users may want to use internal JDK classes. SE 16 locks this down. For a good primer on the basic things SE allows us when we need things to be made available, see [1]. Richard Opalka did a lot of good analysis of what JPMS-related VM launch settings we need for WF to work properly; see [2] and [3]. It's not a huge set, which is nice.
But, it's not complete, because it doesn't account for user applications. If application code requires additional deep reflection, then additional VM launch settings will be needed. I think that's ok in general; we provide hooks for users to add things to the JAVA_OPTS flags that are passed to java. But the less users need to do that the better. Hence the discussion topics:
AFAIR there are two places where modular jdk params must be specified.
One place is shell scripts (common.sh(.bat), etc) and second place is org.jboss.as.host.controller.jvm.JvmType .
That is a minor problem. We should configure these params either in shell scripts or in config files but not in Java code.
The problematic part is also how to propagate (configure) modular jdk parameters?
1) Should we have just one global place where modular jdk params will be specified (e.g. common.sh(.bat)) and propagated ( e.g. domain -> host controller(s) -> server(s) )?
2) Or should users be able to specify modular jdk params for each entity like domain, server, host controller?
Maybe that is already supported via standard configuration?