How Does Jakarta EE Handle Version Support?
Jakarta EE does not define end-of-life dates for its specification versions. Unlike runtimes such as Node.js or Python, Jakarta EE is a set of specifications maintained by the Eclipse Foundation -- and the specification itself never officially "expires." What expires is the support from the application server vendors who implement it.
Once the Jakarta EE Working Group releases a new major version, the previous specification receives no further updates. It is not deprecated with a formal EOL date; it simply stops evolving. Whether you can keep running it in production depends entirely on how long your chosen implementation -- GlassFish, WildFly, Payara, TomEE, WebLogic, JBoss EAP, or others -- continues to ship security patches for that version.
The table below reflects the general status pattern across Jakarta EE major versions:
| Version Series | Specification Status | Implementation Support |
|---|---|---|
| Java EE 8 / Jakarta EE 8 | Superseded -- no further updates | Vendor-dependent; some vendors still ship patches |
| Jakarta EE 9 / 9.1 | Superseded -- namespace migration release only | Transitional; most vendors moved past this quickly |
| Jakarta EE 10 | Superseded -- stable, widely adopted | Broad vendor support; production-ready for most teams |
| Jakarta EE 11 | Current -- active development | Latest; aligned with Java 21 LTS features |
The release cadence follows Java LTS releases roughly every two years. This means each major Jakarta EE version targets a specific Java SE baseline, and upgrading usually requires upgrading your JDK alongside your application server.
References: Jakarta EE Specifications -- Eclipse Foundation | Jakarta EE Specification Process (JESP)
What Are the Real Risks of Running an Older Jakarta EE Version?
The most immediate risk is not a missing security patch in the spec itself -- it is the cascade of incompatibilities that builds up as the rest of the ecosystem moves on. Jakarta EE applications do not run in isolation; they depend on the intersection of your spec version, your app server, your JDK, and your third-party libraries.
Namespace lock-in (javax.* vs jakarta.*)
Jakarta EE 9 introduced a hard namespace break. Code written for Java EE 8 or Jakarta EE 8 uses the javax.* package namespace. Everything from Jakarta EE 9 onwards uses jakarta.*. Libraries, frameworks (Spring, Hibernate, Quarkus), and tooling have progressively dropped javax.* support. If you stay on Jakarta EE 8, you are increasingly cut off from current library versions.
App server vendor dropping your version
The specification itself is frozen -- but your runtime is not. Vendors like Red Hat (JBoss EAP), Payara, IBM (Open Liberty), and Oracle (WebLogic) each publish their own support timelines. Once a vendor drops a Jakarta EE version, you stop receiving CVE patches for the server, even if your application code is untouched. Check the lifecycle page of your specific app server, not just the Jakarta EE spec page.
Missing specifications your dependencies now require
Each Jakarta EE major version adds and updates component specs -- CDI, JPA, Servlet, Jakarta Data, Jakarta Concurrency. If a library you use requires CDI 4.x or Jakarta Data 1.0, those are only available in the current Jakarta EE version, as shown in the release table above. Staying on an older profile version forces you to vendor-patch or shadow these APIs, which is fragile at best.
What Actually Happens When a Newer Jakarta EE Version Supersedes Yours?
Nothing dramatic happens on day one. Your application keeps running, your app server keeps booting. The specification does not have a kill switch. What changes is slower and more cumulative -- and that is exactly what makes it easy to ignore until it becomes a migration crisis.
First, the specification project stops accepting changes. Bug reports against the old version are closed or redirected to the current one. If a flaw exists in how a spec was written, it will not be fixed retroactively.
Second, your application server vendor starts its own countdown. Vendors typically announce a support window when a new Jakarta EE version ships. JBoss EAP, Payara Platform, and Open Liberty all have published lifecycle pages that map which Jakarta EE version each product release supports and for how long. Once your app server version hits end-of-vendor-support, you lose access to security patches regardless of the spec status.
Third, the broader Java ecosystem stops testing against your version. CI pipelines in popular projects drop older Jakarta EE compatibility test profiles. Hibernate, Weld, and other spec implementations prioritize the current spec. In practice, you end up inheriting bugs that were fixed upstream but never backported.
Most teams running a superseded Jakarta EE version are not blocked immediately -- they are paying an accumulating tax of workarounds, pinned dependency versions, and skipped upgrades that eventually forces a larger migration than an incremental one would have required.
How Do You Check Which Jakarta EE Version Your Application Is Targeting?
There are three places to look: your build descriptor, your runtime, and your application server.
Check your Maven pom.xml
The Jakarta EE API dependency in your pom.xml is the authoritative source for which spec version your application is compiled against:
<!-- Jakarta EE 10 full platform -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>10.0.0</version>
<scope>provided</scope>
</dependency>
<!-- Or for Jakarta EE 11 -->
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>11.0.0</version>
<scope>provided</scope>
</dependency>
Check at runtime via the Servlet API
You can query the Servlet spec version at runtime, which reflects the Jakarta EE version your app server implements:
// Inside a Servlet or CDI bean
int major = servletContext.getMajorVersion();
int minor = servletContext.getMinorVersion();
System.out.println("Servlet " + major + "." + minor);
// Servlet 6.0 = Jakarta EE 10
// Servlet 6.1 = Jakarta EE 11
Check your application server version
Each application server maps its version to a Jakarta EE spec version. For GlassFish:
asadmin version
For WildFly:
$WILDFLY_HOME/bin/standalone.sh --version
Then cross-reference the server version against the vendor's compatibility matrix -- GlassFish 7.x implements Jakarta EE 10, GlassFish 8.x targets Jakarta EE 11, as shown in the release table above.
FAQ
Q1: Is Jakarta EE the same as Java EE?
Jakarta EE is the direct successor to Java EE. Oracle transferred Java EE to the Eclipse Foundation in 2017, and the platform was renamed Jakarta EE. The core architecture and most APIs are the same, but starting from Jakarta EE 9, the package namespace changed from javax.* to jakarta.*. Code written for Java EE 8 is binary-compatible with Jakarta EE 8 but requires source-level changes to run on Jakarta EE 9 and above.
Q2: Does Jakarta EE have LTS versions?
No. Jakarta EE does not designate Long-Term Support versions at the specification level. The concept of LTS applies to the implementations, not the spec itself. If you need LTS-style support, choose an application server that offers it -- Payara Enterprise, IBM Open Liberty, and Red Hat JBoss EAP all publish multi-year support windows for specific Jakarta EE-compatible releases.
Q3: Is an older Jakarta EE version still supported?
The specification is frozen but not officially retired -- it simply receives no further updates. Whether your deployment is "supported" depends on your application server vendor's policy. Check your specific server's lifecycle page: the spec being old does not mean your runtime is still receiving CVE patches. As shown in the release table above, older versions are superseded, meaning only the current version sees active development.
Q4: Is Jakarta EE backward compatible across major versions?
Partially. Within the jakarta.* namespace (Jakarta EE 9 and later), the working group strives for API-level compatibility -- existing code that compiled against an older version should mostly work against the newer one. However, each major release removes deprecated APIs and adjusts component spec versions, so full compatibility is not guaranteed. The javax.* to jakarta.* namespace change between Jakarta EE 8 and 9 is a hard break and requires a source migration -- it is not backward compatible at the binary level.
Q5: Which Jakarta EE version should I use for a new project?
Use the latest version, as shown in the release table above. It targets a current Java LTS release, includes the newest specs (including Jakarta Data for simplified data access and Virtual Threads support via Jakarta Concurrency), and will have the longest runway before it is superseded. If your team is locked to an older JDK, check which Jakarta EE version aligns with that JDK baseline -- each major version has a minimum Java SE requirement that you cannot work around at the runtime level.
