How Does Jakarta Faces Version Support Actually Work?
Jakarta Faces is a specification, not a standalone product -- which means it does not have its own independent EOL dates. Support is tied directly to the Jakarta EE platform release that ships it. Each Jakarta EE platform release targets a specific Faces version, and when a platform version ages out, so does the Faces version bundled with it. The specification itself is maintained by the Eclipse Foundation under the Jakarta EE Working Group.
Jakarta EE follows a roughly two-year release cadence. Each platform release supersedes the previous one as the actively developed version. There is no formal LTS designation within Jakarta EE itself -- the "supported" version is whichever Jakarta EE release your application server vendor is currently maintaining. That vendor relationship is where real-world support timelines come from.
Specification vs. Implementation
In practice, you run an implementation of the Faces spec, not the spec itself. The two major implementations are Eclipse Mojarra (the reference implementation, used in GlassFish and Payara) and Apache MyFaces (used in TomEE and WildFly/JBoss EAP). Each implementation has its own release cadence and support policy, and each is bundled differently depending on your application server. For Mojarra 2.3 and earlier, the Mojarra project explicitly directs users to their application server vendor for support. Details on current specification versions are available at jakarta.ee/specifications/faces.
What Breaks When You Run an Outdated Faces Version?
Running an old Jakarta Faces version in a modern Java environment creates dependency chain problems that are harder to debug than a simple version mismatch. Faces integrates deeply with CDI, the Servlet API, Expression Language, and Bean Validation -- all of which also evolve with each Jakarta EE release. An outdated Faces version may be incompatible with a newer version of any of these dependencies, causing subtle runtime failures rather than clean startup errors.
The javax-to-jakarta namespace migration (Faces 3.0) is the most disruptive example of this. Code compiled against javax.faces.* simply cannot be loaded in a container that only provides jakarta.faces.*, and vice versa. There is no transparent bridge -- applications and component libraries all need to be on the same side of that divide. Teams still running Faces 2.x on a modern Jakarta EE 10+ server will find that nothing resolves correctly at the class loader level.
| Risk Area | Impact on Faces Applications |
|---|---|
| Namespace incompatibility | javax.faces.* vs jakarta.faces.* -- class loading failures when mixing old Faces with modern containers |
| CDI integration drift | Older Faces versions rely on CDI APIs that have evolved -- injection, scopes, and interceptors behave differently across versions |
| Component library compatibility | PrimeFaces, OmniFaces, and other libraries track Faces spec versions closely -- older Faces blocks you from upgrading these libraries |
| Security patches | Faces-level vulnerabilities (XSS via component rendering, ViewState exposure) are fixed only in current implementation releases |
| Java version conflicts | Faces 4.0+ requires Java SE 11 minimum; Faces 4.1 aligns with Java SE 17+ -- older Faces versions block JDK upgrades |
What Happens After a Faces Version Falls Out of the Current Jakarta EE Release?
When Jakarta EE moves to a new platform release, the previous Faces spec version does not receive further development from the Eclipse Foundation. Bug reports and feature requests are directed to the new version. The specification document for the old version remains published and accessible -- the spec does not disappear -- but no new TCK tests are written and no errata are issued.
For the implementations, behavior differs by project. The Mojarra project on GitHub currently focuses on the current spec version; for Mojarra 2.3 and earlier, the README explicitly states that support comes from your application server vendor -- Red Hat, IBM, Oracle, Payara, and others -- rather than from the upstream project directly. Apache MyFaces follows a similar pattern, with older spec versions maintained primarily through community contributions rather than active development.
In practice, this means your real support window is determined by your application server vendor. Red Hat JBoss EAP, IBM Liberty, and Payara Enterprise each publish their own lifecycle policies with specific dates for Jakarta EE version support. Teams running Faces 2.3 on a JBoss EAP 7.x subscription, for example, are still covered -- until JBoss EAP 7 itself reaches end of support under Red Hat's terms. Once that vendor support ends, you are on your own regardless of what the upstream spec says.
How To Check Your Jakarta Faces Version
The Faces version in use at runtime can be read directly from the implementation JAR's manifest or via the API itself. The simplest approach from a Facelets view:
<!-- In any .xhtml page -->
#{facesContext.externalContext.applicationMap['jakarta.faces.version']}
From Java code, query the implementation version directly:
import jakarta.faces.context.FacesContext;
String version = FacesContext.class.getPackage().getImplementationVersion();
System.out.println("Faces impl version: " + version);
On the server side, check the JAR manifest of your implementation. For Mojarra:
unzip -p /path/to/jakarta.faces.jar META-INF/MANIFEST.MF | grep -i version
You can also check the version declared in your pom.xml or build.gradle against the current release listed in the release table above. The current spec versions are listed at
jakarta.ee/specifications/faces.
FAQ
Q1: Does Jakarta Faces have its own EOL dates independent of Jakarta EE?
No. Jakarta Faces is a specification under the Jakarta EE umbrella and does not publish independent EOL dates. Support lifecycle is determined by the Jakarta EE platform release that bundles the spec version, and ultimately by your application server vendor's own support policy. There is no central "Jakarta Faces EOL" announcement -- you track the Jakarta EE platform release cadence and your vendor's lifecycle page instead.
Q2: Is Faces 4.0 still supported now that Faces 4.1 is out?
At the specification level, Faces 4.0 (Jakarta EE 10) is no longer the actively developed version now that Jakarta EE 11 with Faces 4.1 has shipped. However, application server vendors that certified against Jakarta EE 10 -- such as Payara, WildFly, and Liberty -- continue to support those products under their own commercial timelines. Check your specific vendor's lifecycle page to determine how long Faces 4.0 on your server remains in active support.
Q3: Can I use PrimeFaces or OmniFaces with older Faces versions?
Component libraries like PrimeFaces and OmniFaces track the Faces spec version closely. Each major release of these libraries targets a specific minimum Faces version and uses APIs introduced in that version. Running an older Faces implementation typically means being locked to an older version of these libraries as well. Check the library's compatibility matrix before planning an upgrade -- the dependency chain between Faces version, CDI version, and component library version is tight.
Q4: What is the difference between Mojarra and MyFaces, and which should I use?
Both are full, compatible implementations of the Jakarta Faces specification. Mojarra is the reference implementation maintained under the Eclipse Foundation and is the default in GlassFish and Payara. MyFaces is the Apache Foundation's implementation and ships with TomEE and some JBoss EAP configurations. For most applications the choice is determined by your application server rather than a deliberate decision. If you are deploying to a bare Servlet container like Tomcat, you need to bundle one explicitly -- Mojarra and MyFaces both work, and the choice comes down to preference and existing familiarity with the implementation's behavior.
Q5: Does the javax-to-jakarta namespace change affect me if I upgrade Faces versions?
Yes, if you are currently on Faces 2.x (Java EE) and want to move to Faces 3.0 or newer (Jakarta EE), the namespace change is a hard migration requirement. All imports in your Java source, all EL expressions, and all third-party libraries must switch from javax.faces.* to jakarta.faces.*. The two namespaces are binary incompatible and cannot coexist in the same classloader. Tools like the Eclipse Transformer or the OpenRewrite recipes for Jakarta EE migration can automate the bulk of the source-level changes, but library dependencies also need to be upgraded to their Jakarta EE-compatible versions first.
