# Timeline for Jakarta Faces support?

**URL:** <https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525>\
**Category:** JSP, JSF, Spring, etc.\
**Created:** [April 16, 2026, 2:23pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525 "2026-04-16T14:23:29Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![matthias.blaesing](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/matthias.blaesing/32/608_2.png) [@matthias.blaesing](https://discuss.liferay.com/u/matthias.blaesing)\
**Post date:** [April 16, 2026, 2:23pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/1 "2026-04-16T14:23:29Z")

</div>

I asked this in the past and was told, that 2026.Q01 will have Jakarta Faces support for portlet released together with it. Unless I’m missing something obvious, that was not the case.

So is there a timeline when Jakarta Faces support will come?

Thank you!

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [April 16, 2026, 9:09pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/2 "2026-04-16T21:09:26Z")

</div>

Liferay JSF for Jakarta is already available.

While we finalize the documentation, check out the [sample PrimeFaces portlet](https://github.com/liferay/liferay-faces-bridge-impl/tree/master/demo/primefaces-applicant-portlet) that uses Jakarta.

---

<div class="post-metadata">

**Author:** ![matthias.blaesing](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/matthias.blaesing/32/608_2.png) [@matthias.blaesing](https://discuss.liferay.com/u/matthias.blaesing)\
**Post date:** [April 19, 2026, 12:16pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/3 "2026-04-19T12:16:56Z")

</div>

Thanks for the pointer. After I fixed the dependency list of the sample I managed to compile it. But if fails to runtime. I get:

```auto
2026-04-19 12:06:09.051 ERROR [http-nio-8080-exec-1][header_portlet_jsp:122] /WEB-INF/views/applicant.xhtml @34,52 <f:validateRegex> Parent not an instance of EditableValueHolder: jakarta.faces.component.html.HtmlForm@5a193d38
jakarta.faces.view.facelets.TagException: /WEB-INF/views/applicant.xhtml @34,52 <f:validateRegex> Parent not an instance of EditableValueHolder: jakarta.faces.component.html.HtmlForm@5a193d38
at com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.applyNested(ValidatorTagHandlerDelegateImpl.java:214) ~[?:?]
at com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl.apply(ValidatorTagHandlerDelegateImpl.java:65) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:111) ~[?:?]
at jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:55) ~[?:?]
at jakarta.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:55) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) ~[?:?]
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:179) ~[?:?]
at jakarta.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:111) ~[?:?]

```

It also looks very fishy. There is a dependency “jakarta.faces” with a version 2.3. That can’t be correct as Jakarta Faces is still in the `javax.*` namespace and Jakarta Server Faces is the first version switching namespace and current is 4.0.

The same applies to the three patched dependencies (JSF API, Implementation and Primefaces).

Maybe the documentation will shed some light onto the complete plan.

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [April 20, 2026, 3:43pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/4 "2026-04-20T15:43:32Z")

</div>

This is expected. Faces started supporting Jakarta namespaces in 2.3, not just in 4.0.

To simplify the migration to Lifeary DXP on Jakarta, we are using a Jakarta-compatible version of Faces 2.3 for Liferay DXP.

Are there specific features of Jakarta Faces 4.0 you need for your project?

---

<div class="post-metadata">

**Author:** ![matthias.blaesing](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/matthias.blaesing/32/608_2.png) [@matthias.blaesing](https://discuss.liferay.com/u/matthias.blaesing)\
**Post date:** [April 21, 2026, 6:58am UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/5 "2026-04-21T06:58:23Z")

</div>

Sorry, I just noticed that version numbers were partially missing from my text. To be more concrete:

My understanding is, that Jakarta Server Faces 2.3 is a rerelease of JSR372 (Java Server Faces 2.3) with the eclipse foundation specification license, nothing more. So that version is still in the `javax.*` Namespace. (see: [Jakarta Server Fages API documentation](https://jakarta.ee/specifications/faces/2.3/apidocs/))

3.0 (not 4.0) is the Jakarta Server Faces version that switched to `jakarta.*`. (see: [Jakarta Server Faces](https://jakarta.ee/specifications/faces/3.0/jakarta-faces-3.0#backward-compatibility-with-previous-versions) )

As this currently does not render (see exception) I can only speculate how it will turn out in reality.

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [April 21, 2026, 2:54pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/6 "2026-04-21T14:54:48Z")

</div>

The error you are getting looks related to the tag formatting

Reported pattern in your applicant.xhtml:  
`<h:form>`  
` <f:validateRegex pattern=“…” /> `  
`</h:form>`

Correct Format (Nested under an input):  
`<h:form>`  
` <h:inputText value=“#{bean.value}”>`  
` <f:validateRegex pattern=“…” />`  
` </h:inputText>`  
`</h:form>`

---

<div class="post-metadata">

**Author:** ![matthias.blaesing](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/matthias.blaesing/32/608_2.png) [@matthias.blaesing](https://discuss.liferay.com/u/matthias.blaesing)\
**Post date:** [April 21, 2026, 6:57pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/7 "2026-04-21T18:57:42Z")

</div>

The stack trace is from the demo project you referenced. To be concrete it is here:

> <https://github.com/liferay/liferay-faces-bridge-impl/blob/9f0e9a3100140368631618f84fc5dae5e33d79bd/demo/primefaces-applicant-portlet/src/main/webapp/WEB-INF/views/applicant.xhtml#L31-L38>

This is a validator inside the primefaces inputtext field. From a quick look the code I see in the project makes sense.

I patched the project like this (`com.liferay.faces.util` is required for the loggers):

```auto
diff --git a/demo/primefaces-applicant-portlet/pom.xml b/demo/primefaces-applicant-portlet/pom.xml
index 2354d65ec..0ac884b7d 100644
--- a/demo/primefaces-applicant-portlet/pom.xml
+++ b/demo/primefaces-applicant-portlet/pom.xml
@@ -87,6 +87,10 @@
                        <groupId>jakarta.annotation</groupId>
                        <artifactId>jakarta.annotation-api</artifactId>
                </dependency>
- </dependencies>
+ <dependency>
+ <groupId>com.liferay</groupId>
+ <artifactId>com.liferay.faces.util</artifactId>
+ </dependency>
+ </dependencies>
 
 </project>

```

and then build the project with `mvn clean package`.

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [April 21, 2026, 8:08pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/8 "2026-04-21T20:08:16Z")

</div>

I tested with the demo to confirm it deploys successfully on 2026.Q1

In the `pom.xml` I just needed to add 5.0.0 version

```auto
        <dependency>
            <groupId>com.liferay</groupId>
            <artifactId>com.liferay.faces.util</artifactId>
            <version>5.0.0</version>
        </dependency>

```

Make sure to update your versions to the latest from our repository  
e.g. [Index of /repositories/liferay-public-releases/com/liferay/com.liferay.faces.util/5.0.0](https://repository-cdn.liferay.com/nexus/content/repositories/liferay-public-releases/com/liferay/com.liferay.faces.util/5.0.0/)

---

<div class="post-metadata">

**Author:** ![matthias.blaesing](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/matthias.blaesing/32/608_2.png) [@matthias.blaesing](https://discuss.liferay.com/u/matthias.blaesing)\
**Post date:** [April 26, 2026, 9:36am UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/9 "2026-04-26T09:36:11Z")

</div>

Thank your for taking time to test. So I restartet from scratch and it does indeed seem to work. I think I screwed up building the portlets with the proper profiles (`mvn clean package -P liferay,mojarra,tomcat`).

Both the `jsf-applicant-portlet` and `primefaces-applicant-portlet` seem to work correctly. The `jsf-showcase-portlet` loads, but the accordions don’t work.

For a few of the problems I found, I pushed PRs:

- Fixes for the Liferay Faces Showcase: [Improve/fix build setup (missing repositories, a missing property, resource filtering) by matthiasblaesing · Pull Request #104 · liferay/liferay-faces-showcase · GitHub](https://github.com/liferay/liferay-faces-showcase/pull/104)
- Fixes for the Liferay Faces Bridge Implementation: [Enable building demo applications by matthiasblaesing · Pull Request #374 · liferay/liferay-faces-bridge-impl · GitHub](https://github.com/liferay/liferay-faces-bridge-impl/pull/374)

For the alloy showcase I built from [GitHub - liferay/liferay-faces-alloy · GitHub](https://github.com/liferay/liferay-faces-alloy). The mvn call had to be modified to `mvn -Dbnd.baseline.fail.on.missing=false install` to skip the OSGI baseline check.

---

<div class="post-metadata">

**Author:** ![Jan\_Binder](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/jan_binder/32/661_2.png) [@Jan\_Binder](https://discuss.liferay.com/u/Jan_Binder)\
**Post date:** [May 6, 2026, 10:22pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/10 "2026-05-06T22:22:22Z")

</div>

@Victor_Ware are Thin Wars also supported already in 2026.q1? When I tried deploying the newest versions of the jsf artifacts we used in 2025.q1 the were still using javax at some points.  
The artifacts we used were

 ![image](https://europe1.discourse-cdn.com/flex014/uploads/liferay/original/1X/13a9361d3a4d2670db3e9456facd980d0382844a.png)

At least jakarta faces is using javax as you stated in an earlier response but i could not find a osgi ready implementation of jakarta faces 4.x in the liferay mvn repository that could have been placed in the osgi modules as standalone module.

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [May 7, 2026, 6:54pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/11 "2026-05-07T18:54:27Z")

</div>

Yes, Thin WAR is supported on 2026.Q1, but it still uses JSF 2.3.

Liferay’s approach is JSF 2.3 under Jakarta namespace. We do not support Jakarta Faces **4.x** on DXP currently. This is intentional to keep behavior changes minimal while moving from `javax.* → jakarta.*`.

If you’re seeing `javax.*` at runtime, check for a mixed set of artifacts or if they are `javax` packages that are still part of Java SE.

You might also need 2 additional JARs depending on your usage  
portal tags: `com.liferay.faces.portal-7.0.0.jar`  
alloy tags: `com.liferay.faces.alloy-5.0.0.jar`

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [May 11, 2026, 9:51pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/12 "2026-05-11T21:51:31Z")

</div>

@Jan_Binder Also make sure you are using the Jakarta versions of the Liferay patched jars:

`jakarta.faces-2.3.21.LIFERAY-PATCHED-4.JAKARTA-LIFERAY-PATCHED-1.jar`  
`org.primefaces-15.0.6.LIFERAY-PATCHED-3.JAKARTA-LIFERAY-PATCHED-1.jar`

---

<div class="post-metadata">

**Author:** ![Jan\_Binder](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/jan_binder/32/661_2.png) [@Jan\_Binder](https://discuss.liferay.com/u/Jan_Binder)\
**Post date:** [May 13, 2026, 2:22am UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/13 "2026-05-13T02:22:56Z")

</div>

@Victor_Ware Thank you for your answers! I’ve got the Thin Wars working with those versions and the com.liferay.jakarta.portlet.api-4.0.0.jar.  
I also needed to to change one package additional to the javax → jakarta change as the javax.portlet.faces moved to com.liferay.faces but after that the portlets ran.

---

<div class="post-metadata">

**Author:** ![Victor\_Ware](https://dub1.discourse-cdn.com/flex014/user_avatar/discuss.liferay.com/victor_ware/32/119_2.png) [@Victor\_Ware](https://discuss.liferay.com/u/Victor_Ware)\
**Post date:** [May 13, 2026, 11:46pm UTC](https://discuss.liferay.com/t/timeline-for-jakarta-faces-support/525/14 "2026-05-13T23:46:38Z")

</div>

Glad this is working! The official migration documentation is now live [Upgrading Faces to Jakarta - Liferay Official Documentation - Liferay Learn](https://learn.liferay.com/w/dxp/development/traditional-java-based-development/developing-a-web-application/using-jsf/upgrading-faces-to-jakarta)
