Hi folks,

There's been quite a bit of progress recently on development of an EE 9 variant of WildFly so I'd like to provide an update.

For context, the goal is to produce in Sept/Oct a tech-preview/beta/milestone release of a variant of WildFly that exposes EE 9 APIs, so the community can get a chance to try those out. Most of the implementation libraries in that release will use EE 8 APIs internally (javax.* packages instead of jakarta.*) so to make that work, when Galleon provisions an EE9 server it will bytecode transform any artifacts that use EE 8 APIs into ones that use EE 9 APIs.

For deployments the server management layer will, when it reads in managed deployment content, transform EE 8 APIs to EE 9. This allows existing apps to work, which is particularly important for our testsuite, which is full of EE 8 apps.

Thanks to a lot of hard work from Richard Opalka, Scott Marlow and Jean-Francois Denise and the folks on the Eclipse Transformer project I have a branch[2] that does this. It is based on the current WildFly master, but overrides most of the EE spec artifacts to use the ones that were included in the June EE 9 milestone release of Glassfish. It also overrides a few of the spec impls with native EE 9 artifacts that were used in that release.

That branch adds a new "ee-9" maven with a few child modules, the most important of which are 'feature-pack' and 'dist'.  The 'feature-pack' module produces a Galleon feature pack which is analogous to the wildfly-ee feature pack, but provides EE 9 APIs. The 'dist' module then builds a dist using that feature pack.

At this point there is no EE 9 equivalent to the top level 'wildfly' feature pack, which adds in the Eclipse Microprofile JWT, Fault Tolerance and Open API specs. Dealing with those is a todo.

If you do a normal 'mvn install' of this branch, the ee-9 modules will build.

To run part of the testsuite against the EE 9 dist, do this:

mvn install -Dts.ee9 -Dts.basic

That runs testsuite/integration's 'smoke', 'web', 'ws' and 'basic' modules. Don't include -Dts.basic if you don't want the basic module to run.

Not all tests run; some for known reasons, some for unknown ones. But a whole lot do.

Over the course of the next few days I'll be working to get more testsuite modules to run with the ts.ee9 profile.  Once that is done I'd like us to give some thought to producing an alpha release of WildFly so folks can more easily try this out.

There are some important difference between this feature pack and the regular wildfly-ee one:

1) It does not depend on the wildfly-servlet feature pack. That feature pack IMO is a bit of a evolutionary appendix that serves little purpose in a Galleon driven architecture; it just adds complexity. So for this EE 9 feature pack I'm directly incorporating the content that would have been in wildfly-servlet, instead of having a dependency on an EE 9 variant of wildfly-servlet.

It is tempting to do the same with the wildfly-core feature pack. Something to discuss.

See [4] for more on this.

2) It does not include the legacy picketbox-based security subsystem. We want to move to a purely Elytron-based security architecture so legacy picketbox security is being left behind.

This brings some interesting challenges, as it surfaces a few places where there's a default expectation for legacy security, with the user having to do work they shouldn't have to to make that go away.  Darran Lofthouse has been looking at this.

It also brings some effort on the testing side, just because quite a few tests expect legacy security. We've dealt with that before with running tests with pure elytron configs.

Picketbox is still present, which means the security vault works, but I expect at some point that will be removed. Right now it was easier to leave it in place; otherwise it would have been removed as Picketbox is a barrier to using JDK 14 or later.

3) The default messaging subsystem config does not include an embedded JMS broker. Instead it is configured to point to a remote Artemis broker. Using an external broker is a more cloud-native way to deploy an app, which is why this variant is moving that way. The docs/examples/configs dir includes a standalone-activemq-embedded.xml config that provides the embedded broker.

This definitely brings a big testing challenge as almost all of our tests involving messaging, including EJB MDB tests, assume the embedded broker is present. A quick workaround would be to run those against a server using the example standalone-activemq-embedded.xml config, but we also need to work out proper testing for the standard config that uses a remote broker.

4) The feature pack doesn't include various misc stuff that we either intended to prune from WF in general at some point (JSR77, picketlink extension, legacy subsystems that only provide domain-mode Domain Controller support for AS 7 hosts) or where it wasn't clear what we'd do so I left things behind just to reduce the initial scope (agroal, versions of Hibernate other than 5.3).

5) As noted above, this is equivalent to a wildfly-ee feature pack so it doesn't include MP FT, JWT or OpenAPI.

6) A 'thin server' (where JBoss Modules finds artifacts in maven, rather than in the local modules dir) does not work really well, as the transformed artifacts are not in the usual local or remote maven repos.  There are things you can do in this area, but that's too much of an advanced case to get into here.

Besides what I noted above there are some known issues, just in case you experiment and hit them:

a) Transforming unmanaged EE 8 apps to EE 9 is not supported. This likely won't change for quite a while if ever. (Note: zipped apps deployed by the deployment scanner *are* managed apps. This limitation primary relates to exploded deployments.)
b) The transformation of the jastow library needs improvement so the classes it generates from JSPs properly use the jakarta packages.
c) The JSF impl doesn't properly provide a jsf.js file.

I'm aiming to frequently merge master into this branch, so it keeps up to date with changes in master. It might make sense to create an ee-9 branch in the wildfly/wildfly github repo just to make it easier to coordinate updates, run CI etc. But for now I'm happy to receive PRs against this branch in my repo.

I encourage people to give this a spin.

If you're looking for things to do on this topic, please reach out to myself or Scott Marlow or Richard Opalka. There's plenty to do but this post is already way too long!


Best regards,
Brian

[1] https://wildfly.org/news/2020/06/23/WildFly-and-Jakarta-EE-9/