<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

<channel>
	<title>Jakarta Blogs</title>
	<link>http://jakartablogs.ee</link>
	<language>en</language>
	<description>Jakarta Blogs - http://jakartablogs.ee</description>
	<atom:link rel="self" href="http://jakartablogs.ee/rss20.xml" type="application/rss+xml"/>

<item>
	<title>Adam Bien: AWS Infrastructure as Code: CloudFormation Origins, CDK Stacks, and Terraform Trade-offs--airhacks.fm podcast</title>
	<guid isPermaLink="true">https://adambien.blog/roller/abien/entry/aws_infrastructure_as_code_cloudformation_origins_cdk_stac</guid>
	<link>https://adambien.blog/roller/abien/entry/aws_infrastructure_as_code_cloudformation_origins_cdk_stac</link>
	<description>&lt;p&gt;
Subscribe to &lt;a href=&quot;https://airhacks.fm&quot;&gt;airhacks.fm podcast&lt;/a&gt; via:
&lt;a href=&quot;https://open.spotify.com/show/6nOTQLa2uZxeyGpMW8eppS&quot;&gt;spotify&lt;/a&gt;|
&lt;a href=&quot;https://itunes.apple.com/de/podcast/airhacks-fm/id1296655154?l=en&quot;&gt;iTunes&lt;/a&gt;|
&lt;/p&gt;
&lt;article&gt;
The #393 &lt;a href=&quot;https://airhacks.fm&quot;&gt;airhacks.fm&lt;/a&gt; episode with Thorsten HoÌˆger (&lt;a href=&quot;https://twitter.com/hoegertn&quot;&gt;@hoegertn&lt;/a&gt;) about:
&lt;blockquote&gt;
Migrating a German bank to AWS in 2012, the evolution from CloudFormation JSON to CDK, declarative state management, Terraform trade-offs, CDK stacks as atomic deployment units, regulated industries and compliance, and the CDK Book.
&lt;/blockquote&gt;
is available for &lt;a href=&quot;https://airhacks.fm/#episode_393&quot;&gt;download.&lt;/a&gt;
&lt;/article&gt;</description>
	<pubDate>Thu, 16 Apr 2026 13:13:56 +0000</pubDate>
</item>
<item>
	<title>Ivar Grimstad: Hashtag Jakarta EE #328</title>
	<guid isPermaLink="false">https://www.agilejava.eu/?p=9043</guid>
	<link>https://www.agilejava.eu/2026/04/12/hashtag-jakarta-ee-328/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Welcome to issue number three hundred and twenty-eight of &lt;a href=&quot;https://www.agilejava.eu/category/hashtag-jakartaee/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Hashtag Jakarta EE&lt;/em&gt;&lt;/a&gt;!&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;In just about a week, &lt;a href=&quot;https://www.ocxconf.org/event/2026/summary&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Open Community eXperience&lt;/a&gt; is happening in &lt;strong&gt;Brussels, Belgium&lt;/strong&gt;. The four days between &lt;strong&gt;April 21 and April 23&lt;/strong&gt; are packed with talks from amazing speakers delivering keynotes, regular talks, workshops, and BOFs. In addition to all the scheduled content, we have the hallway track. This is where it happens. Spontaneous conversations about all kinds of topics just appear out of nowhere. The hallway track is by far the most valuable aspect of attending conferences.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;a href=&quot;https://www.agilejava.eu/wp-content/uploads/2026/01/EF-Ivar-Grimstad-1.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-8780&quot; height=&quot;535&quot; src=&quot;https://www.agilejava.eu/wp-content/uploads/2026/01/EF-Ivar-Grimstad-1-1024x535.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;My talk titled &lt;em&gt;&lt;strong&gt;The Past, Preseent, and Future of Enterprise Java – with Jakarta EE&lt;/strong&gt;&lt;/em&gt; is scheduled for Wednesday. When I am not attending other talks or roaming the hallway, I can be found staffing the &lt;a href=&quot;https://www.eclipse.org/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Eclipse Foundation&lt;/a&gt; booth in the exhibition area.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-medium&quot;&gt;&lt;a href=&quot;https://www.agilejava.eu/wp-content/uploads/2026/01/Jakarta_EE_12.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-8762&quot; height=&quot;130&quot; src=&quot;https://www.agilejava.eu/wp-content/uploads/2026/01/Jakarta_EE_12-300x130.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;wp-block-paragraph&quot;&gt;In the &lt;a href=&quot;https://jakartaee.github.io/platform/minutes/minutes.html&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE Platform call&lt;/a&gt; this week, we discussed what that would be needed for &lt;a href=&quot;https://jakarta.ee/specifications/nosql/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta NoSQL&lt;/a&gt; to be included as one of the specifications in &lt;a href=&quot;https://jakarta.ee/specifications/platform/12/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE 12&lt;/a&gt;. There is still some reluctance among some of our members to include this specification, so please make your voice heard if you want to see Jakarta NoSQL in Jakarta EE 12. If you have some extra time on your hand, you can also step in and help the project address the issues that the platform project has requested to strenghen its position as a candidate for inclusion.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 12 Apr 2026 09:59:00 +0000</pubDate>
</item>
<item>
	<title>Adam Bien: Green Java with Quarkus: Performance Benchmarks, SBOM, and Serverless Architecture--airhacks.fm podcast</title>
	<guid isPermaLink="true">https://adambien.blog/roller/abien/entry/green_java_with_quarkus_performance_benchmarks_sbom_and_s</guid>
	<link>https://adambien.blog/roller/abien/entry/green_java_with_quarkus_performance_benchmarks_sbom_and_s</link>
	<description>Subscribe to &lt;a href=&quot;https://airhacks.fm&quot;&gt;airhacks.fm podcast&lt;/a&gt; via:
&lt;a href=&quot;https://open.spotify.com/show/6nOTQLa2uZxeyGpMW8eppS&quot;&gt;spotify&lt;/a&gt;|
&lt;a href=&quot;https://itunes.apple.com/de/podcast/airhacks-fm/id1296655154?l=en&quot;&gt;iTunes&lt;/a&gt;|
&lt;p&gt;&lt;/p&gt;
&lt;article&gt;
The #392 &lt;a href=&quot;https://airhacks.fm&quot;&gt;airhacks.fm&lt;/a&gt; episode with Holly Cummins (&lt;a href=&quot;https://twitter.com/holly_cummins&quot;&gt;@holly_cummins&lt;/a&gt;) about:
&lt;blockquote&gt;
Quarkus energy efficiency benchmarks, greener Java, serverless SnapStart, JVM tuning, SBOM generation, and cheese fondue
&lt;/blockquote&gt;
is available for &lt;a href=&quot;https://airhacks.fm/#episode_392&quot;&gt;download.&lt;/a&gt;
&lt;/article&gt;</description>
	<pubDate>Sat, 11 Apr 2026 12:52:50 +0000</pubDate>
</item>
<item>
	<title>Open Liberty: Jakarta EE 11 Platform, Java 26, and more in 26.0.0.4-beta</title>
	<guid isPermaLink="false">https://openliberty.io/blog/2026/04/07/26.0.0.4-beta</guid>
	<link>https://openliberty.io/blog/2026/04/07/26.0.0.4-beta.html</link>
	<description>&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This beta introduces Jakarta EE 11 Platform and Web Profile, and delivers enhancements across Jakarta Authentication 3.1, Jakarta Authorization 3.0, and Jakarta Security 4.0. In addition, it provides a preview of Jakarta Data 1.1 M2, support for Java 26, MCP Server updates, and Jandex index improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://openliberty.io/&quot;&gt;Open Liberty&lt;/a&gt; 26.0.0.4-beta includes the following beta features (along with &lt;a href=&quot;https://openliberty.io/docs/latest/reference/feature/feature-overview.html&quot;&gt;all GA features&lt;/a&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jakarta_ee&quot;&gt;Jakarta EE 11 Platform and Web Profile&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jakarta_auth&quot;&gt;Application Authentication 3.1 (Jakarta Authentication 3.1)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jakarta_authz&quot;&gt;Application Authorization 3.0 (Jakarta Authorization 3.0)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jakarta_security&quot;&gt;Application Security 6.0 (Jakarta Security 4.0)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#java_26&quot;&gt;Beta support for Java 26&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#mcp&quot;&gt;Updates to &lt;code&gt;mcpServer-1.0&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jakarta_data&quot;&gt;Preview of some Jakarta Data 1.1 M2 capability&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jandex_index&quot;&gt;Support for Reading Jandex Indexes from WEB-INF/classes in Web Modules&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See also &lt;a href=&quot;https://openliberty.io/blog/?search=beta&amp;amp;key=tag&quot;&gt;previous Open Liberty beta blog posts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jakarta_ee&quot;&gt;Jakarta EE 11 Platform and Web Profile&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open Liberty 24.0.0.11-beta was one of the ratifying implementations for Jakarta EE 11 Core Profile. Building on that foundation, the 26.0.0.4-beta release completes Jakarta EE 11 beta support, including Jakarta EE Application Client 11.0, Jakarta EE Web Profile 11.0, and Jakarta EE Platform 11.0.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Liberty provides convenience features that bundle all component specifications in the Jakarta EE Web Profile and Jakarta EE Platform. The &lt;code&gt;webProfile-11.0&lt;/code&gt; Liberty feature includes all Jakarta EE Web Profile functions, including the new Jakarta Data 1.0 component. The &lt;code&gt;jakartaee-11.0&lt;/code&gt; Liberty feature provides the Jakarta EE Platform version 11 implementation. For Jakarta EE 11 features in the application client, use the &lt;code&gt;jakartaeeClient-11.0&lt;/code&gt; Liberty feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These convenience features enable developers to rapidly develop applications using all APIs in the Web Profile and Platform specifications. Unlike the &lt;code&gt;jakartaee-10.0&lt;/code&gt; Liberty feature, the &lt;code&gt;jakartaee-11.0&lt;/code&gt; Liberty feature does not enable the Managed Beans specification function any longer, as this specification was removed from the platform which includes removal of the &lt;code&gt;jakarta.annotation.ManagedBean&lt;/code&gt; annotation API. Applications relying on the &lt;code&gt;@ManagedBean&lt;/code&gt; annotation must migrate to use CDI annotations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jakarta EE 11 Platform specification removes all optional specifications from the platform, meaning Jakarta SOAP with Attachments, XML Binding, XML Web Services, and Enterprise Beans 2.x APIs functions are not included with the &lt;code&gt;jakartaee-11.0&lt;/code&gt; Liberty feature. To use these capabilities, explicitly add Liberty features to your &lt;code&gt;server.xml&lt;/code&gt; feature list: &lt;code&gt;xmlBinding-4.0&lt;/code&gt; for XML Binding, &lt;code&gt;xmlWS-4.0&lt;/code&gt; for SOAP with Attachments and XML Web Services, and &lt;code&gt;enterpriseBeansHome-4.0&lt;/code&gt; for Jakarta Enterprise Beans 2.x APIs. Alternatively, use the equivalent versionless features with the &lt;code&gt;jakartaee-11.0&lt;/code&gt; platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When using the Liberty application client with the &lt;code&gt;jakartaeeClient-11.0&lt;/code&gt; feature, Jakarta SOAP with Attachments, XML Binding, and XML Web Services client functions are not available. To continue using these functions in your Liberty application client, enable the &lt;code&gt;xmlBinding-4.0&lt;/code&gt; and the new &lt;code&gt;xmlWSClient-4.0&lt;/code&gt; features in your &lt;code&gt;client.xml&lt;/code&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To enable the Jakarta EE 11 beta features in your Liberty server’s &lt;code&gt;server.xml&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;jakartaee-11.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or you can add the Web Profile convenience feature to enable all of the Jakarta EE 11 Web Profile beta features at once:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;webProfile-11.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can enable the Jakarta EE 11 features on the Application Client Container in the &lt;code&gt;client.xml&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;jakartaeeClient-11.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://jakarta.ee/specifications/platform/11/jakarta-platform-spec-11.0&quot;&gt;Jakarta EE Platform 11 Specification&lt;/a&gt; and the &lt;a href=&quot;https://jakarta.ee/specifications/webprofile/11/jakarta-webprofile-spec-11.0&quot;&gt;Jakarta EE Web Profile 11 Specification&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jakarta_auth&quot;&gt;Application Authentication 3.1 (Jakarta Authentication 3.1)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jakarta Authentication defines a general SPI for authentication mechanisms, which are controllers that interact with a caller and the container’s environment to obtain and validate the caller’s credentials. It then passes an authenticated identity (such as name and groups) to the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 3.1 version of the Jakarta Authentication API removes the deprecated Permission-related fields in the &lt;code&gt;jakarta.security.auth.message.config.AuthConfigFactory&lt;/code&gt; class. The methods in the class no longer do permission checking also. These changes are part of Jakarta EE 11’s removal of SecurityManager support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can enable the Jakarta Authentication 3.1 feature by adding the &lt;code&gt;appAuthentication-3.1&lt;/code&gt; Liberty feature in the &lt;code&gt;server.xml&lt;/code&gt; file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;appAuthentication-3.1&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the Jakarta Authentication 3.1 &lt;a href=&quot;https://jakarta.ee/specifications/authentication/3.1/jakarta-authentication-spec-3.1&quot;&gt;specification&lt;/a&gt; and &lt;a href=&quot;https://jakarta.ee/specifications/authentication/3.1/apidocs/jakarta.security.auth.message/module-summary.html&quot;&gt;javadoc&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jakarta_authz&quot;&gt;Application Authorization 3.0 (Jakarta Authorization 3.0)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jakarta Authorization defines an SPI for authorization modules, which are repositories of permissions that facilitate subject-based security by determining whether a subject has a specific permission. It also defines algorithms that transform security constraints for specific containers, such as Jakarta Servlet or Jakarta Enterprise Beans, into these permissions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 3.0 API introduces the new &lt;code&gt;jakarta.security.jacc.PolicyFactory&lt;/code&gt; and &lt;code&gt;jakarta.security.jacc.Policy&lt;/code&gt; classes for doing authorization decisions. These classes are added to remove the dependency on the &lt;code&gt;java.security.Policy&lt;/code&gt; class, which is deprecated in newer versions of Java. With the new &lt;code&gt;PolicyFactory&lt;/code&gt; API, now you can have a &lt;code&gt;Policy&lt;/code&gt; per policy context instead of having a global policy. This design allows separate policies to be maintained for each application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, the 3.0 specification defines a mechanism to define &lt;code&gt;PolicyConfigurationFactory&lt;/code&gt; and &lt;code&gt;PolicyFactory&lt;/code&gt; classes in your application by using a &lt;code&gt;web.xml&lt;/code&gt; file. This design allows for an application to have a different configuration than the server-scoped one, but still allow for it to delegate to a server scoped factory for any other applications. Authorization modules can do this delegation by using decorator constructors for both &lt;code&gt;PolicyConfigurationFactory&lt;/code&gt; and &lt;code&gt;PolicyFactory&lt;/code&gt; classes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To configure your authorization modules in your application’s &lt;code&gt;web.xml&lt;/code&gt; file, add specification defined context parameters:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;preprocessor&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;web-app&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;xmlns&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;https://jakarta.ee/xml/ns/jakartaee&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;attribute-name&quot;&gt;xmlns:xsi&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;attribute-name&quot;&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_1.xsd&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;attribute-name&quot;&gt;version&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;6.1&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;tag&quot;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;jakarta.security.jacc.PolicyConfigurationFactory.provider&lt;span class=&quot;tag&quot;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;com.example.MyPolicyConfigurationFactory&lt;span class=&quot;tag&quot;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;tag&quot;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;tag&quot;&gt;&amp;lt;context-param&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;param-name&amp;gt;&lt;/span&gt;jakarta.security.jacc.PolicyFactory.provider&lt;span class=&quot;tag&quot;&gt;&amp;lt;/param-name&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;param-value&amp;gt;&lt;/span&gt;com.example.MyPolicyFactory&lt;span class=&quot;tag&quot;&gt;&amp;lt;/param-value&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;tag&quot;&gt;&amp;lt;/context-param&amp;gt;&lt;/span&gt;

&lt;span class=&quot;tag&quot;&gt;&amp;lt;/web-app&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to Jakarta Authorization 3.0 no longer using the &lt;code&gt;java.security.Policy&lt;/code&gt; class and introducing a new configuration mechanism for authorization modules, the &lt;code&gt;com.ibm.wsspi.security.authorization.jacc.ProviderService&lt;/code&gt; Liberty API is no longer available with the appAuthorization-3.0 feature. If a Liberty user feature configures authorization modules, the OSGi service that provided a &lt;code&gt;ProviderService&lt;/code&gt; implementation must be updated to use the &lt;code&gt;PolicyConfigurationFactory&lt;/code&gt; and &lt;code&gt;PolicyFactory&lt;/code&gt; &lt;code&gt;set&lt;/code&gt; methods. These methods configure the modules in the OSGi service. Alternatively you can use a Web Application Bundle (WAB) in your user feature to specify your security modules in a &lt;code&gt;web.xml&lt;/code&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, the 3.0 API adds a new &lt;code&gt;jakarta.security.jacc.PrincipalMapper&lt;/code&gt; class that you can obtain from the &lt;code&gt;PolicyContext&lt;/code&gt; class when authorization processing is done in your &lt;code&gt;Policy&lt;/code&gt; implementation. From this class, you can obtain the roles that are associated with a specific Subject to be able to determine whether the Subject is in the required role.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use the &lt;code&gt;PrincipalMapper&lt;/code&gt; class in your &lt;code&gt;Policy&lt;/code&gt; implementation’s &lt;code&gt;impliesByRole&lt;/code&gt; (or &lt;code&gt;implies&lt;/code&gt;) method, as shown in the following example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;boolean&lt;/span&gt; impliesByRole(&lt;span class=&quot;predefined-type&quot;&gt;Permission&lt;/span&gt; p, &lt;span class=&quot;predefined-type&quot;&gt;Subject&lt;/span&gt; subject) {
        &lt;span class=&quot;predefined-type&quot;&gt;Map&lt;/span&gt;&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;predefined-type&quot;&gt;PermissionCollection&lt;/span&gt;&amp;gt; perRolePermissions =
            PolicyConfigurationFactory.get().getPolicyConfiguration(contextID).getPerRolePermissions();
        PrincipalMapper principalMapper = PolicyContext.get(PolicyContext.PRINCIPAL_MAPPER);

        &lt;span class=&quot;comment&quot;&gt;// Check to see if the Permission is in the all authenticated users role (**)&lt;/span&gt;
        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (!principalMapper.isAnyAuthenticatedUserRoleMapped() &amp;amp;&amp;amp; !subject.getPrincipals().isEmpty()) {
            &lt;span class=&quot;predefined-type&quot;&gt;PermissionCollection&lt;/span&gt; rolePermissions = perRolePermissions.get(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);
            &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (rolePermissions != &lt;span class=&quot;predefined-constant&quot;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; rolePermissions.implies(p)) {
                &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;;
            }
        }

        &lt;span class=&quot;comment&quot;&gt;// Check to see if the roles for the Subject provided imply the permission&lt;/span&gt;
        &lt;span class=&quot;predefined-type&quot;&gt;Set&lt;/span&gt;&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt;&amp;gt; mappedRoles = principalMapper.getMappedRoles(subject);
        &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; mappedRole : mappedRoles) {
            &lt;span class=&quot;predefined-type&quot;&gt;PermissionCollection&lt;/span&gt; rolePermissions = perRolePermissions.get(mappedRole);
            &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (rolePermissions != &lt;span class=&quot;predefined-constant&quot;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; rolePermissions.implies(p)) {
                &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;;
            }
        }
        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can enable the Jakarta Authorization 3.0 feature by adding the &lt;code&gt;appAuthorization-3.0&lt;/code&gt; Liberty feature in the &lt;code&gt;server.xml&lt;/code&gt; file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;appAuthorization-3.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the Jakarta Authorization 3.0 &lt;a href=&quot;https://jakarta.ee/specifications/authorization/3.0/jakarta-authorization-spec-3.0&quot;&gt;specification&lt;/a&gt; and &lt;a href=&quot;https://jakarta.ee/specifications/authorization/3.0/apidocs/jakarta.security.jacc/module-summary.html&quot;&gt;javadoc&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jakarta_security&quot;&gt;Application Security 6.0 (Jakarta Security 4.0)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An In-memory Identity Store is a developer-defined store of credential information that is used during the Open Liberty authentication and authorization work flow. It provides a quick, simple, and convenient authentication mechanism for Liberty application testing, debugging, demos, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Multiple HTTP Authentication Mechanisms (HAMs) can now be defined within the same application. These mechanisms can be specified through built-in Jakarta annotations such as &lt;code&gt;@FormAuthenticationMechanismDefinition&lt;/code&gt; or through custom implementations of the &lt;code&gt;HttpAuthenticationMechanism&lt;/code&gt; interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new method is added to the &lt;code&gt;SecurityContext&lt;/code&gt; interface called &lt;code&gt;getAllDeclaredCallerRoles()&lt;/code&gt;, which returns a list of all static (declared) application roles that the authenticated caller is in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;References to the &lt;code&gt;IdentityStorePermission&lt;/code&gt; class are removed as it was previously deprecated.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All features are available as part of &lt;code&gt;appSecurity-6.0&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All feature use cases are targeted towards Jakarta EE web application developers who want to move to a modern Jakarta version and use implementations of the Jakarta Security 4.0 specification.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;in-memory-identity-store&quot;&gt;In-memory identity store&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before the introduction of the new identity store specification, Jakarta Security natively supported only two types of identity stores: &lt;strong&gt;database&lt;/strong&gt; and &lt;strong&gt;LDAP&lt;/strong&gt;, both of which are used for credential validation. While effective for production environments, these options were considered heavyweight for testing, debugging, and demonstration scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers can also implement custom identity stores, but doing so requires bespoke code to collect, validate, and manage credential information. This effort can divert attention from core application development. A built-in, in-memory identity store reduces this burden for non-production use cases such as testing, debugging, and demonstrations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;multiple-hams&quot;&gt;Multiple HAMs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is now possible for multiple authentication mechanisms to logically act as a single HTTP Authentication Mechanism (HAM), providing a more flexible, dynamic, and configurable approach to the authentication workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Access to the &lt;code&gt;HttpAuthenticationMechanism&lt;/code&gt; is now abstracted by an internal implementation of the new Jakarta &lt;code&gt;HttpAuthenticationMechanismHandler&lt;/code&gt; interface. This implementation prioritizes custom‑defined HAMs first and then falls back to the built‑in (annotation‑defined) HAMs, in the following order: OpenID, custom form, form, and basic authentication mechanisms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers are free to provide their own implementation of the &lt;code&gt;HttpAuthenticationMechanismHandler&lt;/code&gt;, allowing them to define a custom prioritization strategy for selecting HAMs. They &lt;strong&gt;must&lt;/strong&gt; supply such an implementation if any built‑in HAMs are defined with the optional &lt;code&gt;qualifiers&lt;/code&gt; attribute set.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;getalldeclaredcallerroles&quot;&gt;getAllDeclaredCallerRoles()&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;SecurityContext&lt;/code&gt; interface implementation is updated to include a new method, &lt;code&gt;getAllDeclaredCallerRoles()&lt;/code&gt;, which returns a list of the declared application roles for an authenticated caller. If the caller is not authenticated or has no declared roles, the method returns an empty list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use&quot;&gt;How to use&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enable Jakarta Security 4.0 features within the &lt;code&gt;server.xml&lt;/code&gt; file by adding the &lt;code&gt;appSecurity-6.0&lt;/code&gt; feature as shown in the following example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;server&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;description&lt;/span&gt; = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Liberty server&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;

    . . .

    &lt;span class=&quot;tag&quot;&gt;&amp;lt;featureManager&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;appSecurity-6.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;/featureManager&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;tag&quot;&gt;&amp;lt;webAppSecurity&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;allowInMemoryIdentityStores&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;

    . . .&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
As shown in the preceding example, when an application defines an in‑memory identity store in code, its use must also be explicitly enabled in the &lt;code&gt;server.xml&lt;/code&gt; configuration. By default, the &lt;code&gt;allowInMemoryIdentityStores&lt;/code&gt; attribute is set to false, which instructs the Liberty authentication workflows not to use in‑memory identity stores, even when a custom identity store handler is present. For applications that rely on multiple HAMs, the &lt;code&gt;allowInMemoryIdentityStores&lt;/code&gt; attribute does not need to be set.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;in-memory-identity-store-2&quot;&gt;In-Memory Identity Store&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://jakarta.ee/specifications/security/4.0/jakarta-security-spec-4.0#in-memory-annotation&quot;&gt;Jakarta Security Specification 4.0&lt;/a&gt; provides details on how to specify credential information to be used during the authentication workflow through the new &lt;code&gt;@InMemoryIdentityStoreDefinition&lt;/code&gt; annotation, as shown in the following example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;. . .

&lt;span class=&quot;annotation&quot;&gt;@InMemoryIdentityStoreDefinition&lt;/span&gt; (
    priority = &lt;span class=&quot;integer&quot;&gt;10&lt;/span&gt;,
    priorityExpression = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;${80/20}&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
    useFor = {VALIDATE, PROVIDE_GROUPS},
    useForExpression = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;#{'VALIDATE'}&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
    value = {
        &lt;span class=&quot;annotation&quot;&gt;@Credentials&lt;/span&gt;(callerName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;jasmine&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, password = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;secret1&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, groups = { &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;caller&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; } )
    }
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All attributes for the &lt;code&gt;@InMemoryIdentityStoreDefinition&lt;/code&gt; annotation are shown in the example. The &lt;code&gt;priority&lt;/code&gt;, &lt;code&gt;priorityExpression&lt;/code&gt;, &lt;code&gt;useFor&lt;/code&gt;, and &lt;code&gt;useForExpression&lt;/code&gt; attributes are optional and set to sensible defaults.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;@Credentials&lt;/code&gt; annotation maps one or more caller names to a password and optional group values. The &lt;code&gt;callerName&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; attributes are mandatory. If either one is omitted, a compilation error occurs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The example demonstrates a single caller definition with credential information that uses a plain-text password. However, it is highly recommended that passwords be supplied that uses an Open Liberty–supported encoding mechanism, as illustrated in the next example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@InMemoryIdentityStoreDefinition&lt;/span&gt; (
    value = {
        &lt;span class=&quot;annotation&quot;&gt;@Credentials&lt;/span&gt;(callerName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;jasmine&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,  password = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;{xor}LDo8LTorbg==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, groups = { &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;caller&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; } ),
        &lt;span class=&quot;annotation&quot;&gt;@Credentials&lt;/span&gt;(callerName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;frank&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, groups = { &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; }, password = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;{hash}ARAAA &amp;lt;sequence shortened&amp;gt; Fyyw==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;),
        &lt;span class=&quot;annotation&quot;&gt;@Credentials&lt;/span&gt;(callerName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;sally&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, groups = { &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; }, password = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;{aes}ARAFIYJ &amp;lt;sequence shortened&amp;gt; WRQNA==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
    }
)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Encrypted and encoded passwords can be generated by using the Open Liberty &lt;code&gt;securityUtility&lt;/code&gt;, which is included under the &lt;code&gt;wlp/bin/securityUtility&lt;/code&gt; path. The following example demonstrates how to encode a text string by using the &lt;code&gt;xor&lt;/code&gt; encoding mechanism.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;wlp/bin/securityUtility encode --encoding=xor
Enter text: &amp;lt;enter text to encode&amp;gt;
Re-enter text:
{xor}PTA9Lyg&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;multiple-hams-2&quot;&gt;Multiple HAMs&lt;/h4&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;application-specification&quot;&gt;Application Specification&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://jakarta.ee/specifications/security/4.0/jakarta-security-spec-4.0#handling-multiple-authentication-mechanisms&quot;&gt;Jakarta Security 4.0&lt;/a&gt; specification allows multiple HTTP Authentication Mechanisms (HAMs) to be defined within a single application, as shown in the following example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@BasicAuthenticationMechanismDefinition&lt;/span&gt;(realmName=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;basicAuth&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)

&lt;span class=&quot;annotation&quot;&gt;@FormAuthenticationMechanismDefinition&lt;/span&gt;(
                loginToContinue = &lt;span class=&quot;annotation&quot;&gt;@LoginToContinue&lt;/span&gt;(errorPage = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/form-login-error.html&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                loginPage = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/form-login.html&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;))

&lt;span class=&quot;annotation&quot;&gt;@CustomFormAuthenticationMechanismDefinition&lt;/span&gt;(
                loginToContinue = &lt;span class=&quot;annotation&quot;&gt;@LoginToContinue&lt;/span&gt;(errorPage = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/custom-login-error.html&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                loginPage = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/custom-login.html&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This example demonstrates how three HTTP Authentication Mechanisms (HAMs) can be defined within a single application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Custom HAMs can also be defined in the same application by implementing the &lt;code&gt;HttpAuthenticationMechanism&lt;/code&gt; interface in one or more classes, as shown in the following example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@ApplicationScoped&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;// @Priority is optional and used to control selection priority if multiple custom definitions exist&lt;/span&gt;
&lt;span class=&quot;annotation&quot;&gt;@Priority&lt;/span&gt;(&lt;span class=&quot;integer&quot;&gt;100&lt;/span&gt;)
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;CustomHAM&lt;/span&gt; &lt;span class=&quot;directive&quot;&gt;implements&lt;/span&gt; HttpAuthenticationMechanism {

    &lt;span class=&quot;annotation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; AuthenticationStatus validateRequest(
        HttpServletRequest request,
        HttpServletResponse response,
        HttpMessageContext httpMessageContext) &lt;span class=&quot;directive&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;exception&quot;&gt;AuthenticationException&lt;/span&gt; {

            &lt;span class=&quot;comment&quot;&gt;// implement custom logic here, and return an AuthenticationStatus&lt;/span&gt;
            &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; AuthenticationStatus.NOT_DONE;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So a single application can have a mix of both annotation-defined HAMs and custom ones. In the previous two snippets of code, a total of four HAMs are defined (three by annotation and one custom one).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;code&gt;@Priority&lt;/code&gt; must be used to raise or lower the priority of one custom HAM over another. If not specified, then a default priority is assigned. If more than one custom HAM is defined, their priorities need to be explicitly set to unique values. If the priorities are set to the same value or remain unset and inherit the same default value, an error occurs.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;ham-resolution&quot;&gt;HAM resolution&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An internal implementation of the Jakarta Security 4.0 &lt;code&gt;HttpAuthenticationMechanismHandler&lt;/code&gt; interface (the &quot;internal HAM handler&quot;) is provided. When an application defines multiple HAMs, this internal handler selects a single HAM to be used in the authentication flow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The order in which HAMs are considered (when present) is as follows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Custom (developer‑provided) HAMs&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If multiple custom HAMs are defined, their relative order is resolved by using &lt;code&gt;@Priority&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;OpenIdAuthenticationMechanismDefinition&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CustomFormAuthenticationMechanismDefinition&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FormAuthenticationMechanismDefinition&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;BasicAuthenticationMechanismDefinition&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given this ordering, the Custom HAM is always selected in the authentication workflow if all five HAM types are defined in the application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
A developer must provide a custom implementation of the &lt;code&gt;HttpAuthenticationMechanismHandler&lt;/code&gt; interface (a &quot;custom HAM handler&quot;) if the internal HAM handler does not meet their requirements. A custom handler always takes precedence over the internal HAM handler, allowing any tailored algorithm to select a single HAM from multiple available mechanisms. Additional information about creating and using a custom HAM handler is provided in a later section.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;qualifiers&quot;&gt;Qualifiers&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;HAMs - whether defined through annotations or as custom defined - can also include an optional class‑level qualifier to simplify HAM injection into a custom HAM handler. For example, if you want to define qualified HAMs, you would first declare qualifier interfaces such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@Qualifier&lt;/span&gt;
&lt;span class=&quot;annotation&quot;&gt;@Retention&lt;/span&gt;(RUNTIME)
&lt;span class=&quot;annotation&quot;&gt;@Target&lt;/span&gt;({TYPE, METHOD, FIELD, PARAMETER})
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;annotation&quot;&gt;@interface&lt;/span&gt; Admin {
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;(Not shown is the qualifier definitions for &lt;code&gt;User&lt;/code&gt;, &lt;code&gt;Fallback&lt;/code&gt; which follow an identical pattern, and are used below).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, import and use the qualifiers in your in-built or custom HAM specifications, such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@CustomFormAuthenticationMechanismDefinition&lt;/span&gt;(&amp;lt;existing details not shown&amp;gt;, qualifiers={Admin.class})

&lt;span class=&quot;annotation&quot;&gt;@BasicAuthenticationMechanismDefinition&lt;/span&gt;(&amp;lt;existing details not shown&amp;gt;, qualifiers={User.class})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@ApplicationScoped&lt;/span&gt;
&lt;span class=&quot;annotation&quot;&gt;@Fallback&lt;/span&gt;   &lt;span class=&quot;comment&quot;&gt;// add custom qualifier to be used during injection&lt;/span&gt;
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;CustomHAM&lt;/span&gt; &lt;span class=&quot;directive&quot;&gt;implements&lt;/span&gt; HttpAuthenticationMechanism {

    &lt;span class=&quot;annotation&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; AuthenticationStatus validateRequest (. . .)  {
         . . .
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The three HAMs defined in the example are available for injection into a custom HAM handler based on their qualifier names. This scenario represents the typical use case for applications that define multiple HAMs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
If qualifiers are specified in any of the built-in HAM definitions, a custom HAM handler must be provided; otherwise, an error is raised. This requirement comes directly from the Jakarta Security specification. Details about creating and using a custom HAM handler are explained in the next section.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To implement a custom HAM handler, define a public class that is annotated with &lt;code&gt;@ApplicationScoped&lt;/code&gt; that implements the &lt;code&gt;HttpAuthenticationMechanismHandler&lt;/code&gt; interface. Also, inject the qualified HAMs by using standard CDI syntax, as shown in the following section:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@Default&lt;/span&gt;
&lt;span class=&quot;annotation&quot;&gt;@ApplicationScoped&lt;/span&gt;
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;CustomHAMHandler&lt;/span&gt; &lt;span class=&quot;directive&quot;&gt;implements&lt;/span&gt; HttpAuthenticationMechanismHandler {

    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt; &lt;span class=&quot;annotation&quot;&gt;@Admin&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;// this will be the FormHAM&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;private&lt;/span&gt; HttpAuthenticationMechanism adminHAM;

    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt; &lt;span class=&quot;annotation&quot;&gt;@User&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;// this will be the BasicHAM&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;private&lt;/span&gt; HttpAuthenticationMechanism userHAM;

    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt; &lt;span class=&quot;annotation&quot;&gt;@Fallback&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;// this will be the Custom HAM&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;private&lt;/span&gt; HttpAuthenticationMechanism fallbackHAM;

    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; AuthenticationStatus validateRequest(
        HttpServletRequest request,
        HttpServletResponse response,
        HttpMessageContext context
    ) &lt;span class=&quot;directive&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;exception&quot;&gt;AuthenticationException&lt;/span&gt; {

        &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; path = request.getRequestURI();

        &lt;span class=&quot;comment&quot;&gt;// route to appropriate mechanism based on path, default to my-realm&lt;/span&gt;
        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (path.startsWith(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/admin&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)) { &lt;span class=&quot;comment&quot;&gt;// FormHAM&lt;/span&gt;
            &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; adminHAM.validateRequest(request, response, context);
        } &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (path.startsWith(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;/user&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)) { &lt;span class=&quot;comment&quot;&gt;// BasicHAM&lt;/span&gt;
            &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; userHAM.validateRequest(request, response, context);
        } &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt; { &lt;span class=&quot;comment&quot;&gt;// Custom HAM&lt;/span&gt;
            &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; fallbackHAM.validateRequest(request, response, context);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This custom HAM handler takes priority over the internal HAM handler, allowing a different prioritisation algorithm to be implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;getalldeclaredcallerroles-2&quot;&gt;getAllDeclaredCallerRoles()&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use the new &lt;code&gt;SecurityContext&lt;/code&gt; method, inject the &lt;code&gt;SecurityContext&lt;/code&gt; implementation into your application and call the method directly, as shown in the following section:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;private&lt;/span&gt; SecurityContext securityContext;

. . .

    Set&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt;&amp;gt; allDeclaredCallerRoles = securityContext.getAllDeclaredCallerRoles();

    &lt;span class=&quot;predefined-type&quot;&gt;System&lt;/span&gt;.out.println(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;All declared caller roles for caller [&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        + securityContext.getCallerPrincipal().getName()
        + &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;] are &lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        + allDeclaredCallerRoles.toString());&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;learn-more&quot;&gt;Learn more&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Further information can be found in the Jakarta Security Specification 4.0:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jakarta.ee/specifications/security/4.0/jakarta-security-spec-4.0#in-memory-annotation&quot;&gt;in-memory identity store&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jakarta.ee/specifications/security/4.0/jakarta-security-spec-4.0#handling-multiple-authentication-mechanisms&quot;&gt;multiple-hams&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jakarta.ee/specifications/security/4.0/jakarta-security-spec-4.0#retrieving-and-testing-for-caller-data&quot;&gt;getAllDeclaredCallerRoles()&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information about the &lt;code&gt;securityUtility&lt;/code&gt; command, see the &lt;a href=&quot;https://www.ibm.com/docs/en/was-liberty/base?topic=applications-securityutility-command&quot;&gt;WAS Liberty base topic&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java_26&quot;&gt;Beta support for Java 26&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 26 is a recent Java release that introduces new features and enhancements over earlier versions that can be useful to review. This release is not a long-term support (LTS) release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are 10 new features (JEPs) in &lt;a href=&quot;https://openjdk.org/projects/jdk/26/&quot;&gt;Java 26&lt;/a&gt;. Five are test features and five are fully delivered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Test Features:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;524: &lt;a href=&quot;https://openjdk.org/jeps/524&quot;&gt;PEM Encodings of Cryptographic Objects (Second Preview)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;525: &lt;a href=&quot;https://openjdk.org/jeps/525&quot;&gt;Structured Concurrency (Sixth Preview)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;526: &lt;a href=&quot;https://openjdk.org/jeps/526&quot;&gt;Lazy Constants (Second Preview)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;529: &lt;a href=&quot;https://openjdk.org/jeps/529&quot;&gt;Vector API (Eleventh Incubator)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;530: &lt;a href=&quot;https://openjdk.org/jeps/530&quot;&gt;Primitive Types in Patterns, instanceof, and switch (Fourth Preview)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Delivered Features:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;500: &lt;a href=&quot;https://openjdk.org/jeps/500&quot;&gt;Prepare to Make Final Mean Final&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;504: &lt;a href=&quot;https://openjdk.org/jeps/504&quot;&gt;Remove the Applet API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;516: &lt;a href=&quot;https://openjdk.org/jeps/516&quot;&gt;Ahead-of-Time Object Caching with Any GC&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;517: &lt;a href=&quot;https://openjdk.org/jeps/517&quot;&gt;HTTP/3 for the HTTP Client API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;522: &lt;a href=&quot;https://openjdk.org/jeps/522&quot;&gt;G1 GC: Improve Throughput by Reducing Synchronization&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new change JEP 500 (&quot;Prepare to Make Final Mean Final&quot;) in Java 26 starts enforcing true immutability of final fields by restricting their mutation when using deep reflection.
In Java 26, such mutations still work but trigger runtime warnings by default, preparing developers for stricter enforcement.
Future releases would likely throw exceptions instead, making the final truly nonmutable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers can opt in early to this stricter behavior by using a JVM flag (for example, &lt;code&gt;--illegal-final-field-mutation=deny&lt;/code&gt;) to detect issues sooner.
This change improves program correctness, security, and JVM optimizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take advantage of these changes now to gain more time to evaluate how your applications
and microservices behave on Java 26.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Get started today by downloading the latest release of  &lt;a href=&quot;https://developer.ibm.com/languages/java/semeru-runtimes/downloads/&quot;&gt;IBM Semeru Runtime 26&lt;/a&gt; or &lt;a href=&quot;https://adoptium.net/temurin/releases/?version=26&quot;&gt;Temurin 26&lt;/a&gt;, then download and install the Open Liberty &lt;a href=&quot;https://openliberty.io/downloads/#runtime_betas&quot;&gt;26.0.0.4-beta&lt;/a&gt;. Update your Liberty server’s &lt;a href=&quot;https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html#server-env&quot;&gt;server.env&lt;/a&gt; file with &lt;code&gt;JAVA_HOME&lt;/code&gt; set to your Java 26 installation directory and start testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information on Java 26, see the Java 26 &lt;a href=&quot;https://jdk.java.net/26/release-notes&quot;&gt;release notes page&lt;/a&gt; and &lt;a href=&quot;https://docs.oracle.com/en/java/javase/26/docs/api/index.html&quot;&gt;API Javadoc page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;mcp&quot;&gt;Updates to &lt;code&gt;mcpServer-1.0&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot;&gt;Model Context Protocol (MCP)&lt;/a&gt; is an open standard that enables AI applications to access real-time information from external sources. The Liberty MCP Server feature &lt;code&gt;mcpServer-1.0&lt;/code&gt; allows developers to expose the business logic of their applications, allowing it to be integrated into agentic AI workflows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This beta release of Open Liberty includes updates to the &lt;code&gt;mcpServer-1.0&lt;/code&gt; feature including dynamic registration of tools and support for version &lt;code&gt;2025-11-25&lt;/code&gt; of the protocol.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dynamically-register-mcp-tools&quot;&gt;Dynamically register MCP tools&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tools can now be registered dynamically through an API. This capability allows the set of available tools on the server to be adjusted based on configuration or environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tools can be registered by injecting &lt;code&gt;ToolManager&lt;/code&gt; and calling its methods to add, remove, and list the available tools on the server. The full Javadoc for &lt;code&gt;ToolManager&lt;/code&gt; can be found within the Liberty beta in &lt;code&gt;dev/api/ibm/javadoc/io.openliberty.mcp_1.0-javadoc.zip&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tools can be registered when the application starts through the CDI &lt;code&gt;Startup&lt;/code&gt; event. See the following example where the &lt;code&gt;Startup&lt;/code&gt; event is used to register a weather forecast tool only if a &lt;code&gt;WeatherClient&lt;/code&gt; bean is available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt;
    ToolManager toolManager;

    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt;
    Instance&amp;lt;WeatherClient&amp;gt; weatherClientInstance;

    &lt;span class=&quot;directive&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;void&lt;/span&gt; createWeatherTool(&lt;span class=&quot;annotation&quot;&gt;@Observes&lt;/span&gt; Startup startup) {
        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (weatherClientInstance.isResolvable()) {
            WeatherClient weatherClient = weatherClientInstance.get();
            toolManager.newTool(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;getForecast&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
                       .setTitle(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Weather Forecast Provider&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
                       .setDescription(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Get weather forecast for a location&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
                       .addArgument(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Latitude of the location&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;.class)
                       .addArgument(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;Longitude of the location&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;predefined-constant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;.class)
                       .setHandler(toolArguments -&amp;gt; {
                           &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt; latitude = (&lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;) toolArguments.args().get(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;latitude&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);
                           &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt; longitude = (&lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;) toolArguments.args().get(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;longitude&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);
                           &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; result = weatherClient.getForecast(
                                     latitude,
                                     longitude,
                                     &lt;span class=&quot;integer&quot;&gt;4&lt;/span&gt;,
                                     &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;temperature_2m,snowfall,rain,precipitation,precipitation_probability&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);
                           &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; ToolResponse.success(result);
                       })
                       .register();
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tool registration starts with &lt;code&gt;newTool()&lt;/code&gt;, then the information about the tool is added, including its title, description, and arguments. The handler supplies the code to run when the tool is called. It has one parameter, which is a &lt;code&gt;ToolArguments&lt;/code&gt; object, which provides access to the arguments and other information about the tool call request. The handler must always create and return a &lt;code&gt;ToolResponse&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;accept-the-2025-11-25-mcp-protocol&quot;&gt;Accept the 2025-11-25 MCP protocol&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;mcpServer-1.0&lt;/code&gt; feature now accepts version &lt;code&gt;2025-11-25&lt;/code&gt; of the Model Context Protocol (MCP), although it does not support any new features introduced in this version of the protocol.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Supporting MCP 2025-11-25 introduces two notable behavior changes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tool name restrictions&lt;/strong&gt;: Tool names are now limited to ASCII letters ('A–Z, a–z'), digits ('0–9'), and the underscore ('_'), hyphen ('-'), and dot ('.') characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved handling of invalid tool arguments&lt;/strong&gt;: Invalid arguments passed when invoking a tool are now treated as &lt;em&gt;tool execution errors&lt;/em&gt; rather than &lt;em&gt;protocol errors&lt;/em&gt;. This change allows the LLM to receive feedback that the tool was called incorrectly and to retry with corrected arguments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;paginated-results&quot;&gt;Paginated results&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result of a &lt;code&gt;tools/list&lt;/code&gt; call is now paginated with a page size of 20. This means that if there are more than 20 tools deployed on the server, clients make several small calls to retrieve the list of tools, rather than one large call.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;During cancellation of a tool call, we check that both the session id and the authenticated user match the session id and the user that made the tool call. Previously only the session id was checked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Messages that are returned to the MCP client no longer contain Open Liberty message codes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Structured content is only returned when client is using protocol version &lt;code&gt;2025-06-18&lt;/code&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;further-information&quot;&gt;Further information&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For more information about the &lt;code&gt;mcpServer-1.0&lt;/code&gt; feature and how to get started using the beta, see our &lt;a href=&quot;https://openliberty.io/blog/2025/10/23/mcp-standalone-blog.html&quot;&gt;dedicated blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For more information about the Model Context Protocol, see &lt;a href=&quot;https://modelcontextprotocol.io/docs/getting-started/intro&quot;&gt;modelcontextprotocol.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jakarta_data&quot;&gt;Preview of some Jakarta Data 1.1 M2 capability&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previews some new capability at the Jakarta Data 1.1 Milestone 2 level: &lt;code&gt;Constraint&lt;/code&gt; subtype parameters for repository methods that constrain to repository &lt;code&gt;@Find&lt;/code&gt; operations and limited use of &lt;code&gt;Restriction&lt;/code&gt; with repository &lt;code&gt;@Find&lt;/code&gt; operations. Also included from the prior beta are: retrieving a subset/projection of entity attributes and the &lt;code&gt;@Is&lt;/code&gt; annotation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, parameter-based &lt;code&gt;@Find&lt;/code&gt; reposotory methods could filter results only using equality conditions. This limitation has now been removed, allowing additional filtering options to be defined.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Filtering can now be specified in several ways. One approach is to define the repository method parameter as a &lt;code&gt;Constraint&lt;/code&gt; subtype, or to indicate the constraint subtype by using the &lt;code&gt;@Is&lt;/code&gt; annotation. Alternatively, a repository &lt;code&gt;@Find&lt;/code&gt; method can include a special parameter of type &lt;code&gt;Restriction&lt;/code&gt;, allowing the application to supply one or more restrictions dynamically at runtime when the method is invoked.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jakarta Data, you define simple Java objects called &lt;code&gt;entities&lt;/code&gt; to represent data, and interfaces called &lt;code&gt;repositories&lt;/code&gt; to define data operations. You inject a repository into your application and use it. The implementation of the repository is automatically provided.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Start by defining an entity class that corresponds to your data. With relational databases, the entity class corresponds to a database table and the entity properties (public methods and fields of the entity class) generally correspond to the columns of the table. An entity class can be:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;annotated with &lt;code&gt;jakarta.persistence.Entity&lt;/code&gt; and related annotations from Jakarta Persistence&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a Java class without entity annotations, in which case the primary key is inferred from an entity property named &lt;code&gt;id&lt;/code&gt; or ending with &lt;code&gt;Id&lt;/code&gt; and an entity property named &lt;code&gt;version&lt;/code&gt; designates an automatically incremented version column.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a simple entity:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@Entity&lt;/span&gt;
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;Product&lt;/span&gt; {
    &lt;span class=&quot;annotation&quot;&gt;@Id&lt;/span&gt;
    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;long&lt;/span&gt; id;

    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; name;

    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;double&lt;/span&gt; price;

    &lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;double&lt;/span&gt; weight;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After you define the entity to represent the data, it is usually helpful to have your IDE generate a static metamodel class for it. By convention, static metamodel classes begin with the underscore ('_') character, followed by the entity name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because this beta is available well before the release of Jakarta Data 1.1, IDE support for this generation cannot be expected yet. However, a static metamodel class can be provided in the same form that an IDE would generate for the &lt;code&gt;Product&lt;/code&gt; entity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@StaticMetamodel&lt;/span&gt;(Product.class)
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;_Product&lt;/span&gt; {
    &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; ID = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;;
    &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; NAME = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;;
    &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; PRICE = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;;
    &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; WEIGHT = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;weight&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;;

    NumericAttribute&amp;lt;Product, &lt;span class=&quot;predefined-type&quot;&gt;Long&lt;/span&gt;&amp;gt; id = NumericAttribute.of(
            Product.class, ID, &lt;span class=&quot;type&quot;&gt;long&lt;/span&gt;.class);
    &lt;span class=&quot;predefined-type&quot;&gt;TextAttribute&lt;/span&gt;&amp;lt;Product&amp;gt; name = &lt;span class=&quot;predefined-type&quot;&gt;TextAttribute&lt;/span&gt;.of(
            Product.class, NAME);
    NumericAttribute&amp;lt;Product, &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;&amp;gt; price = NumericAttribute.of(
            Product.class, PRICE, &lt;span class=&quot;type&quot;&gt;double&lt;/span&gt;.class);
    NumericAttribute&amp;lt;Product, &lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;&amp;gt; weight = NumericAttribute.of(
            Product.class, WEIGHT, &lt;span class=&quot;type&quot;&gt;double&lt;/span&gt;.class);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first half of the static metamodel class includes constants for each of the entity attribute names so that you don’t need to otherwise hardcode string values into your application. The second half of the static metamodel class provides a special instance for each entity attribute, from which you can build restrictions and sorting to apply to queries at run time. This capability enables many powerful operations with repository queries, but those features are deferred to a future beta.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A repository defines operations that are related to the Product entity. Your repository interface can inherit from built-in interfaces such as &lt;code&gt;BasicRepository&lt;/code&gt; and &lt;code&gt;CrudRepository&lt;/code&gt; to gain various general-purpose repository methods for inserting, updating, deleting, and querying for entities. In addition to these capabilities, the repository can define custom operations by using the static metamodel and annotations such as @Find or @Delete.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@Repository&lt;/span&gt;(dataStore = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;java:app/jdbc/my-example-data&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;Products&lt;/span&gt; &lt;span class=&quot;directive&quot;&gt;extends&lt;/span&gt; CrudRepository&amp;lt;Product, &lt;span class=&quot;predefined-type&quot;&gt;Long&lt;/span&gt;&amp;gt; {

    &lt;span class=&quot;comment&quot;&gt;// Filtering is pre-defined at development time by the @Is annotation,&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Find&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@OrderBy&lt;/span&gt;(_Product.PRICE)
    &lt;span class=&quot;annotation&quot;&gt;@OrderBy&lt;/span&gt;(_Product.NAME)
    &lt;span class=&quot;predefined-type&quot;&gt;List&lt;/span&gt;&amp;lt;Product&amp;gt; costingUpTo(&lt;span class=&quot;annotation&quot;&gt;@By&lt;/span&gt;(_Product.PRICE) &lt;span class=&quot;annotation&quot;&gt;@Is&lt;/span&gt;(AtMost.class) &lt;span class=&quot;type&quot;&gt;double&lt;/span&gt; maxPrice);

    &lt;span class=&quot;comment&quot;&gt;// Constraint types, such as Like, can also pre-define filtering.&lt;/span&gt;
    &lt;span class=&quot;comment&quot;&gt;// Allow additional filtering at run time by including a Restriction,&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Find&lt;/span&gt;
    Page&amp;lt;Product&amp;gt; named(&lt;span class=&quot;annotation&quot;&gt;@By&lt;/span&gt;(_Product.Name) Like namePattern,
                        Restriction&amp;lt;Product&amp;gt; filter,
                        Order&amp;lt;Product&amp;gt; sorting,
                        PageRequest pageRequest);

    &lt;span class=&quot;comment&quot;&gt;// Retrieve a single entity attribute, identified by @Select,&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Find&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Select&lt;/span&gt;(_Product.PRICE)
    Optional&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;Double&lt;/span&gt;&amp;gt; priceOf(&lt;span class=&quot;annotation&quot;&gt;@By&lt;/span&gt;(_Product.ID) &lt;span class=&quot;type&quot;&gt;long&lt;/span&gt; productNum);

    &lt;span class=&quot;comment&quot;&gt;// Retrieve multiple entity attributes as a Java record,&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Find&lt;/span&gt;
    &lt;span class=&quot;annotation&quot;&gt;@Select&lt;/span&gt;(_Product.WEIGHT)
    &lt;span class=&quot;annotation&quot;&gt;@Select&lt;/span&gt;(_Product.NAME)
    Optional&amp;lt;WeightInfo&amp;gt; weightAndNameOf(&lt;span class=&quot;annotation&quot;&gt;@By&lt;/span&gt;(_Product.ID) &lt;span class=&quot;type&quot;&gt;long&lt;/span&gt; productNum);

    &lt;span class=&quot;directive&quot;&gt;static&lt;/span&gt; record WeightInfo(&lt;span class=&quot;type&quot;&gt;double&lt;/span&gt; itemWeight, &lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt; itemName) {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is an example of using the repository and static metamodel:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;annotation&quot;&gt;@DataSourceDefinition&lt;/span&gt;(name = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;java:app/jdbc/my-example-data&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                      className = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;org.postgresql.xa.PGXADataSource&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                      databaseName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;ExampleDB&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                      serverName = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;localhost&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                      portNumber = &lt;span class=&quot;integer&quot;&gt;5432&lt;/span&gt;,
                      user = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;${example.database.user}&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
                      password = &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;${example.database.password}&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;MyServlet&lt;/span&gt; &lt;span class=&quot;directive&quot;&gt;extends&lt;/span&gt; HttpServlet {
    &lt;span class=&quot;annotation&quot;&gt;@Inject&lt;/span&gt;
    Products products;

    &lt;span class=&quot;directive&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;void&lt;/span&gt; doGet(HttpServletRequest req, HttpServletResponse resp)
            &lt;span class=&quot;directive&quot;&gt;throws&lt;/span&gt; ServletException, &lt;span class=&quot;exception&quot;&gt;IOException&lt;/span&gt; {
        &lt;span class=&quot;comment&quot;&gt;// Insert:&lt;/span&gt;
        Product prod = ...
        prod = products.insert(prod);

        &lt;span class=&quot;comment&quot;&gt;// Filter by supplying values only:&lt;/span&gt;
        &lt;span class=&quot;predefined-type&quot;&gt;List&lt;/span&gt;&amp;lt;Product&amp;gt; found = products.costingUpTo(&lt;span class=&quot;float&quot;&gt;50.0&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;%keyboard%&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);

        &lt;span class=&quot;comment&quot;&gt;// Compute filtering at run time,&lt;/span&gt;
        Page&amp;lt;Product&amp;gt; page1 = products.named(
                        Like.suffix(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;printer&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;),
                        Restrict.all(_Product.price.times(taxRate).plus(shipping).lessThan(&lt;span class=&quot;float&quot;&gt;250.0&lt;/span&gt;),
                                     _Product.weight.times(kgToPounds).between(&lt;span class=&quot;float&quot;&gt;10.0&lt;/span&gt;, &lt;span class=&quot;float&quot;&gt;20.0&lt;/span&gt;)),
                        Order.by(_Product.price.desc(),
                                 _Product.name.asc(),
                                 _Product.id.asc()),
                        PageRequest.ofSize(&lt;span class=&quot;integer&quot;&gt;10&lt;/span&gt;));

        &lt;span class=&quot;comment&quot;&gt;// Find one entity attribute:&lt;/span&gt;
        price = products.priceOf(prod.id).orElseThrow();

        &lt;span class=&quot;comment&quot;&gt;// Find multiple entity attributes as a Java record:&lt;/span&gt;
        WeightInfo info = products.getWeightAndName(prod.id);
        &lt;span class=&quot;predefined-type&quot;&gt;System&lt;/span&gt;.out.println(info.itemName() + &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; weighs &lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; + info.itemWeight() + &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt; kg.&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);

        ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;learn-more-2&quot;&gt;Learn more&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jakarta.ee/specifications/data/1.1/apidocs&quot;&gt;Jakarta Data 1.1 API Javadoc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jakarta.ee/specifications/data/1.1/&quot;&gt;Jakarta Data 1.1 overview page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven coordinates for Data 1.1 Milestone 2:&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;jakarta.data&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jakarta.data-api&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.1.0-M2&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
This beta includes only the Data 1.1 features for entity subsets and projections, the @Is annotation, and Constraint subtypes as parameters for repository Find methods. It also includes limited support for Restriction as a special parameter for repository Find methods. The &lt;code&gt;navigate&lt;/code&gt; operations are not implemented for restrictions and constraints. Other new Data 1.1 features are not included in this beta.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jandex_index&quot;&gt;Support for Reading Jandex Indexes from WEB-INF/classes in Web Modules.&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, Jandex indexes across all module types were read only from &lt;code&gt;META-INF/jandex.idx&lt;/code&gt;. This update extends support for web modules to also read indexes from &lt;code&gt;WEB-INF/classes/META-INF/jandex.idx&lt;/code&gt;, bringing it in line with industry practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jandex indexes are read from the original or the new location only when Jandex use is enabled. For compatibility with earlier versions, reading indexes from the new location must be enabled using a new application property.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improved Compatibility: Improve compatibility with industry standard practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faster Startup Times: Continue to benefit from Jandex’s efficient annotation indexing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;target-persona&quot;&gt;Target Persona&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Customers who wish to place Jandex indexes at industry standard locations in their web modules.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;target-features&quot;&gt;Target Features&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This update applies to the scanning of classes within applications. Class scanning (which includes annotation scanning) is a general purpose function that is used by many features.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;problem-description&quot;&gt;Problem Description&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To gather information about application classes, including annotation data, the classes must be scanned. This scanning process is expensive because the entire application must be read and processed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To improve performance, class scanning can be performed during application packaging, with the scan results stored in an index within the application. Jandex provides this capability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jandex scan results are typically written to &lt;code&gt;META-INF/jandex.idx&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For JAR files, this path is relative to the root of the JAR. For WAR files, however, the &lt;code&gt;META-INF/jandex.idx&lt;/code&gt; path can have two interpretations: it can be relative to the root of the WAR file, or relative to the &lt;code&gt;WEB-INF/classes&lt;/code&gt; directory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before this update, Liberty used the location relative to the root of the WAR file. However, industry-standard practices place the location relative to the &lt;code&gt;WEB-INF/classes&lt;/code&gt; directory. This update enables Liberty to also use the &lt;code&gt;WEB-INF/classes&lt;/code&gt; location.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use-2&quot;&gt;How to Use&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Support for reading Jandex indexes under &lt;code&gt;WEB-INF/classes&lt;/code&gt; is enabled by a new property on the &lt;code&gt;application&lt;/code&gt; and &lt;code&gt;applicationManager&lt;/code&gt; elements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Property: &lt;strong&gt;useJandexUnderClasses&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Description: Enables use of a Jandex index for WAR &lt;code&gt;WEB-INF/classes&lt;/code&gt; under &lt;code&gt;/WEB-INF/classes/META-INF/jandex.idx&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Possible values: true | false&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Default value: false&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example: applicationManager&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;applicationManager&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;useJandex&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;useJandexUnderClasses&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example: application&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;application&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;location&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;TestServlet40.ear&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;useJandex&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;attribute-name&quot;&gt;useJandexUnderClasses&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the new property is placed on an application manager element, it applies to all web modules of all applications. When the new property is placed on an application element, the property applies to only that application. If the property is set on both the application manager element and an application element, the value on the application element overrides the value on the application manager element for that application.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;limitation&quot;&gt;Limitation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jandex index support requires explicit enablement. See the &lt;code&gt;useJandex&lt;/code&gt; property  on &lt;code&gt;applicationManager&lt;/code&gt; and on &lt;code&gt;application&lt;/code&gt; elements. The new &lt;code&gt;useJandexUnderClasses&lt;/code&gt; property is meaningful only if the &lt;code&gt;useJandex&lt;/code&gt; property is &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For compatibility with earlier versions, reads of Jandex from the new location require explicit enablement. See the new &lt;strong&gt;useJandexUnderClasses&lt;/strong&gt; property, as documented previously. Explicit enablement is required to prevent applications from accidentally reading an out of date Jandex index from the new location. An out of date Jandex index might cause application errors that are hard to detect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The name of the new property, &lt;strong&gt;useJandexUnderClasses&lt;/strong&gt;, is subject to revision.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;learn-more-3&quot;&gt;Learn More&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://smallrye.io/jandex/jandex/3.5.3/index.html&quot;&gt;Jandex Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/docs/latest/reference/config/applicationManager.html&quot;&gt;Application Manager Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/docs/latest/reference/config/application.html&quot;&gt;Application Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues/32438&quot;&gt;Look for jandex index under WEB-INF/classes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;run&quot;&gt;Try it now&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To try out these features, update your build tools to pull the Open Liberty All Beta Features package instead of the main release. To enable the MCP server feature, follow the instructions from &lt;a href=&quot;https://openliberty.io/blog/2025/10/23/mcp-standalone-blog.html&quot;&gt;MCP standalone blog&lt;/a&gt;. The beta works with Java SE 25, Java SE 21, Java SE 17, Java SE 11, and Java SE 8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using &lt;a href=&quot;https://openliberty.io/guides/maven-intro.html&quot;&gt;Maven&lt;/a&gt;, you can install the All Beta Features package using:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.openliberty.tools&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;liberty-maven-plugin&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.12.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;runtimeArtifact&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.openliberty.beta&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;openliberty-runtime&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;26.0.0.4-beta&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;tag&quot;&gt;&amp;lt;type&amp;gt;&lt;/span&gt;zip&lt;span class=&quot;tag&quot;&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;/runtimeArtifact&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You must also add dependencies to your &lt;code&gt;pom.xml&lt;/code&gt; file for the beta version of the APIs that are associated with the beta features that you want to try. For example, the following block adds dependencies for two example beta APIs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.example.spec&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;exampleApi&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;7.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;type&amp;gt;&lt;/span&gt;pom&lt;span class=&quot;tag&quot;&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;provided&lt;span class=&quot;tag&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;example.platform&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;example.example-api&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;11.0.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;provided&lt;span class=&quot;tag&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or for &lt;a href=&quot;https://openliberty.io/guides/gradle-intro.html&quot;&gt;Gradle&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.openliberty.tools:liberty-gradle-plugin:4.0.0'
    }
}
apply plugin: 'liberty'
dependencies {
    libertyRuntime group: 'io.openliberty.beta', name: 'openliberty-runtime', version: '[26.0.0.4-beta,)'
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or if you’re using &lt;a href=&quot;https://openliberty.io/docs/latest/container-images.html&quot;&gt;container images&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;FROM icr.io/appcafe/open-liberty:beta&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or take a look at our &lt;a href=&quot;https://openliberty.io/downloads/#runtime_betas&quot;&gt;Downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using &lt;a href=&quot;https://plugins.jetbrains.com/plugin/14856-liberty-tools&quot;&gt;IntelliJ IDEA&lt;/a&gt;, &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Open-Liberty.liberty-dev-vscode-ext&quot;&gt;Visual Studio Code&lt;/a&gt; or &lt;a href=&quot;https://marketplace.eclipse.org/content/liberty-tools&quot;&gt;Eclipse IDE&lt;/a&gt;, you can also take advantage of our open source &lt;a href=&quot;https://openliberty.io/docs/latest/develop-liberty-tools.html&quot;&gt;Liberty developer tools&lt;/a&gt; to enable effective development, testing, debugging and application management all from within your IDE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information on using a beta release, refer to the &lt;a href=&quot;https://openliberty.io/docs/latest/installing-open-liberty-betas.html&quot;&gt;Installing Open Liberty beta releases&lt;/a&gt; documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;feedback&quot;&gt;We welcome your feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let us know what you think on &lt;a href=&quot;https://groups.io/g/openliberty&quot;&gt;our mailing list&lt;/a&gt;. If you hit a problem, &lt;a href=&quot;https://stackoverflow.com/questions/tagged/open-liberty&quot;&gt;post a question on StackOverflow&lt;/a&gt;. If you hit a bug, &lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues&quot;&gt;please raise an issue&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Ivar Grimstad: Hashtag Jakarta EE #327</title>
	<guid isPermaLink="false">https://www.agilejava.eu/?p=9041</guid>
	<link>https://www.agilejava.eu/2026/04/05/hashtag-jakarta-ee-327/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Welcome to issue number three hundred and twenty-seven of &lt;a href=&quot;https://www.agilejava.eu/category/hashtag-jakartaee/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Hashtag Jakarta EE&lt;/em&gt;&lt;/a&gt;!&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Happy Easter to everyone who celebrates! Right before the Easter holiday, I went to Amsterdam for &lt;a href=&quot;https://www.agilejava.eu/2026/04/04/voxxed-days-amsterdam-2026/&quot;&gt;Voxxed Days Amsterdam 2026&lt;/a&gt;. This was the second year this conference was organized, and they had almost 1000 registered attendees. Could this be the next &lt;a href=&quot;https://devoxx.com/#/events/devoxx&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Devoxx&lt;/a&gt;? It should certainly be a candidate. I wouldn’t be surprised if we see Devoxx Amsterdam next year.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I also attended the Jakarta EE Platform call, which was pretty good this week. Well attended and lots of good discussions. Among other things, we talked about how the three security specifications relate to each other. For historic reasons, &lt;a href=&quot;https://jakarta.ee/specifications/authorization/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta Authorization&lt;/a&gt; is not a part of &lt;a href=&quot;https://devoxx.com/#/events/devoxx&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE Web Profile&lt;/a&gt;, while both &lt;a href=&quot;https://jakarta.ee/specifications/authentication/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta Authentication&lt;/a&gt; and &lt;a href=&quot;https://jakarta.ee/specifications/security/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta Security&lt;/a&gt; are. There has been talk about merging the security specifications into one Jakarta Security at some point. The first step would be to include Authorization in Web Profile. This is certainly something we can do for &lt;a href=&quot;https://jakarta.ee/specifications/platform/12/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE 12&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-medium&quot;&gt;&lt;a href=&quot;https://javaforum-malmo.github.io/&quot; rel=&quot; noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6588&quot; height=&quot;300&quot; src=&quot;https://www.agilejava.eu/wp-content/uploads/2024/01/java_forum_malmo_512x512-300x300.jpg&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Since I am enjoying a couple of extra days at home over Easter (the first time I am home more than two consecutive days since January), I decided to do some cleaning up of the online resources for &lt;a href=&quot;https://javaforum-malmo.github.io/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Javaforum Malmö&lt;/a&gt;. I have been in the fortunate situation of having &lt;a href=&quot;https://foocafe.org/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Foo Café&lt;/a&gt; as a venue for the Java User Group over the last 10 years. I would provide the speaker and agenda, and Foo Café would handle everything else. Promotion, registration, catering, and sponsors. Our February event was one of the last at Foo Café before they closed down, so now I have to think differently. I created a simple &lt;a href=&quot;https://javaforum-malmo.github.io/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;website&lt;/a&gt; to gather our contact points and set up an &lt;a href=&quot;https://www.eventbrite.com/o/121214358292&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Eventbrite&lt;/a&gt; account to use for registration to our events.&lt;/p&gt;


&lt;div class=&quot;wp-block-image is-style-default wp-duotone-unset-1&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;a href=&quot;https://javaforum-malmo.github.io/&quot; rel=&quot; noreferrer noopener&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-9093&quot; height=&quot;1432&quot; src=&quot;https://www.agilejava.eu/wp-content/uploads/2026/04/Screenshot-2026-04-05-at-09.55.38.png&quot; width=&quot;1988&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 05 Apr 2026 09:59:00 +0000</pubDate>
</item>
<item>
	<title>Open Liberty: UserRegistry Attribute Reader Enhancement, Jandex Index Format Support Update and more in 26.0.0.3</title>
	<guid isPermaLink="false">https://openliberty.io/blog/2026/03/24/26.0.0.3</guid>
	<link>https://openliberty.io/blog/2026/03/24/26.0.0.3.html</link>
	<description>&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release introduces UserRegistry Attribute Reader APIs for retrieving user attributes from LDAP and custom registries, and adds support for Jandex index formats 11-13 to improve application startup performance. Other highlights include changes to AES encoding and fixes for security vulnerabilities and bugs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://openliberty.io/&quot;&gt;Open Liberty&lt;/a&gt; 26.0.0.3:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#userregistry&quot;&gt;UserRegistry Attribute Reader Enhancement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#jandex&quot;&gt;Jandex Index Format Support Update&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#aes&quot;&gt;AES encoding changes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#CVEs&quot;&gt;Security Vulnerability (CVE) Fixes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/jakartaee.xml#bugs&quot;&gt;Notable bug fixes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;View the list of fixed bugs in &lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues?q=label%3Arelease%3A26003+label%3A%22release+bug%22&quot;&gt;26.0.0.3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://openliberty.io/blog/?search=release&amp;amp;search!=beta&quot;&gt;previous Open Liberty GA release blog posts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;run&quot;&gt;Develop and run your apps using 26.0.0.3&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using &lt;a href=&quot;https://openliberty.io/guides/maven-intro.html&quot;&gt;Maven&lt;/a&gt;, include the following in your &lt;code&gt;pom.xml&lt;/code&gt; file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.openliberty.tools&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;liberty-maven-plugin&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.12.0&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or for &lt;a href=&quot;https://openliberty.io/guides/gradle-intro.html&quot;&gt;Gradle&lt;/a&gt;, include the following in your &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'io.openliberty.tools:liberty-gradle-plugin:4.0.0'
    }
}
apply plugin: 'liberty'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or if you’re using &lt;a href=&quot;https://openliberty.io/docs/latest/container-images.html&quot;&gt;container images&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;FROM icr.io/appcafe/open-liberty&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or take a look at our &lt;a href=&quot;https://openliberty.io/start/&quot;&gt;Downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using &lt;a href=&quot;https://plugins.jetbrains.com/plugin/14856-liberty-tools&quot;&gt;IntelliJ IDEA&lt;/a&gt;, &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Open-Liberty.liberty-dev-vscode-ext&quot;&gt;Visual Studio Code&lt;/a&gt; or &lt;a href=&quot;https://marketplace.eclipse.org/content/liberty-tools&quot;&gt;Eclipse IDE&lt;/a&gt;, you can also take advantage of our open source &lt;a href=&quot;https://openliberty.io/docs/latest/develop-liberty-tools.html&quot;&gt;Liberty developer tools&lt;/a&gt; to enable effective development, testing, debugging and application management all from within your IDE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://stackoverflow.com/tags/open-liberty&quot;&gt;&lt;img alt=&quot;Ask a question on Stack Overflow&quot; src=&quot;https://openliberty.io/img/blog/blog_btn_stack.svg&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;userregistry&quot;&gt;UserRegistry Attribute Reader Enhancement&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The UserRegistry API provides applications with the ability to retrieve specific user attributes and search for users based on attribute values directly from LDAP and custom user registries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-new&quot;&gt;What’s New?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, the UserRegistry API supported only basic user lookups such as searching by &lt;code&gt;userSecurityName&lt;/code&gt; or by using wildcard pattern matching. However, it did not allow applications to retrieve specific user attributes or search for users based on attribute values. These capabilities were available in traditional WebSphere through the VMM API. The introduction of these two new APIs now enables applications to search for users and retrieve attributes from LDAP and custom user registries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this enhancement, you can now retrieve specific attributes for a user by using the &lt;code&gt;getAttributesForUser()&lt;/code&gt; method. This method supports retrieval of individual attributes such as email or phoneNumber, or &quot;*&quot; to retrieve all available attributes for a user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also search for users based on attribute values by using the &lt;code&gt;getUsersByAttribute()&lt;/code&gt; method, enabling applications to locate users by matching specific attribute criteria. These methods are supported for LDAP user registries. Custom user registry implementations can also implement and support these methods.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use-it&quot;&gt;How to Use It&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New API methods added to &lt;code&gt;UserRegistry.java&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;default Map&amp;lt;String, Object&amp;gt; getAttributesForUser(String userSecurityName, Set&amp;lt;String&amp;gt; attributeNames)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Returns a Map&amp;lt;String, Object&amp;gt; containing the specified &lt;code&gt;attributesNames&lt;/code&gt; and their corresponding values for the given &lt;code&gt;userSecurityName&lt;/code&gt;, as configured in the LDAP user registry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;UserRegistry ur = RegistryHelper.getUserRegistry(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;realmName&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);

&lt;span class=&quot;comment&quot;&gt;// valid ldap attribute names&lt;/span&gt;
&lt;span class=&quot;predefined-type&quot;&gt;Set&lt;/span&gt;&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt;&amp;gt; attributeNames = &lt;span class=&quot;predefined-type&quot;&gt;Set&lt;/span&gt;.of(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;telephoneNumber&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;mail&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);  &lt;span class=&quot;comment&quot;&gt;// or &quot;*&quot; for retrieving all attributes&lt;/span&gt;
&lt;span class=&quot;predefined-type&quot;&gt;Map&lt;/span&gt;&amp;lt;&lt;span class=&quot;predefined-type&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;predefined-type&quot;&gt;Object&lt;/span&gt;&amp;gt; result = ur.getAttributesForUser(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;testuser&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, attributeNames);

&lt;span class=&quot;comment&quot;&gt;// output in trace.log&lt;/span&gt;
&amp;gt; getAttributesForUser Entry
  testuser
  [telephoneNumber, uid, mail]

&amp;lt; getAttributesForUser Exit
  {uid=testuser, mail=testuser&lt;span class=&quot;annotation&quot;&gt;@example&lt;/span&gt;.com, telephoneNumber=&amp;lt;telephone-number&amp;gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;default SearchResult getUsersByAttribute(String attributeName, String value, int limit)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Returns a &lt;code&gt;SearchResult&lt;/code&gt; object that contains a list of users that match an &lt;code&gt;attributeName&lt;/code&gt; with specified &lt;code&gt;value&lt;/code&gt; that is configured in the LDAP user registry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;UserRegistry ur = RegistryHelper.getUserRegistry(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;realmName&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;);

&lt;span class=&quot;predefined-type&quot;&gt;SearchResult&lt;/span&gt; searchResult = ur.getUsersByAttribute(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;testuser@example.com&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;);

&lt;span class=&quot;comment&quot;&gt;// output in trace.log&lt;/span&gt;
&amp;gt; getUsersByAttribute Entry
  email
  testuser&lt;span class=&quot;annotation&quot;&gt;@example&lt;/span&gt;.com
  &lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;

&amp;lt; getUsersByAttribute Exit
  &lt;span class=&quot;predefined-type&quot;&gt;SearchResult&lt;/span&gt; hasMore=&lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt; [testuser]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To learn more about the user registry, see the following resources:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/was-liberty/base?topic=infrastructure-customizing-user-registries-repositories-liberty&quot;&gt;Open Liberty Custom User Registry documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/docs/modules/reference/24.0.0.3/com.ibm.websphere.appserver.api.securityClient_1.1-javadoc/com/ibm/websphere/security/UserRegistry.html&quot;&gt;UserRegistry API Javadoc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/docs/latest/user-registries-application-security.html#_federated_user_registries&quot;&gt;Federated User Registry configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jandex&quot;&gt;Jandex Index Format Support Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open Liberty now supports the latest Jandex index formats, allowing the use of Jandex indexes that are created with Jandex version 3.1.0 and later. Jandex is a space‑efficient Java annotation indexer and offline reflection library that improves application startup performance by pre‑indexing class metadata.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature targets application developers and DevOps engineers who work with Jakarta EE and MicroProfile applications. It is designed to optimize application startup times and reduce runtime costs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-new-2&quot;&gt;What’s New?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this update, Open Liberty supports Jandex index formats &lt;strong&gt;11, 12, and 13&lt;/strong&gt;. Jandex versions 3.1.0 through the current latest version, 3.5.3, generate indexes that use these formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, Open Liberty supported Jandex index format versions only up to and including version 10. This index format limitation meant that applications packaged with Jandex indexes could not use index formats beyond version 10 while retaining the expected performance improvements. To preserve these performance benefits, build tooling had to continue using a Jandex version prior to 3.1.0, or explicitly configure Jandex index generation to produce indexes that use index format up to and including version 10.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The added support for Jandex index formats has several benefits:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved Compatibility:&lt;/strong&gt; Works seamlessly with the latest versions of build tools and frameworks that use newer Jandex versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Faster Startup Times:&lt;/strong&gt; Continue to benefit from Jandex’s efficient annotation indexing without version constraints&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reduced Maintenance:&lt;/strong&gt; No need to maintain multiple Jandex versions or regenerate indexes for compatibility&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future-Proof:&lt;/strong&gt; Stay current with the Jandex ecosystem as it evolves&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;limitations&quot;&gt;Limitations&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;When using Jandex indexes, ensure that the index files are kept up to date with the application classes.&lt;/strong&gt; If a Jandex index is not synchronized with the application classes, it can contain incorrect annotation data, which can cause the application to function incorrectly. Out‑of‑date Jandex indexes cannot be reliably detected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open Liberty does not read index formats higher than index format 13. If a new version of Jandex adds a higher index format version, Open Liberty requires an update before it can read Jandex indexes that use the higher index format version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Open Liberty feature &lt;code&gt;mpGraphQL&lt;/code&gt;, which is obtained from an external source, is limited to reading Jandex index formats no higher than index format 10. If the feature &lt;code&gt;mpGraphQL&lt;/code&gt; is used, Jandex indexes should be generated by using index format 10. This limitation applies to all current versions of &lt;code&gt;mpGraphQL&lt;/code&gt;, including the current highest version, &lt;code&gt;mpGraphQL-2.0&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lifting-restriction&quot;&gt;Lifting Restriction&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, when Jandex usage was enabled and an application included Jandex indexes that used formats 11 through 13, Open Liberty displayed an error message and ignored those indexes. In such cases, annotation scanning was performed by using Liberty’s internal annotation scanning mechanism.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the addition of support for Jandex index formats 11 through 13, Open Liberty now uses indexes that are generated in these formats. These indexes must be kept up to date with the application classes. Ensure that the Jandex indexes packaged with your application accurately reflect the current application classes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use&quot;&gt;How to Use&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No configuration changes are required in the &lt;code&gt;server.xml&lt;/code&gt; file to enable support for the new Jandex index formats. Open Liberty automatically detects the Jandex index format and selects the appropriate index reader for that format. It reads indexes that use formats 11, 12, and 13, and continues to support indexes that use format up to version 10.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By default, Jandex usage is disabled. To enable Jandex, set the &lt;code&gt;useJandex&lt;/code&gt; property to &lt;code&gt;true&lt;/code&gt; in either an &lt;code&gt;application&lt;/code&gt; element or the &lt;code&gt;applicationManager&lt;/code&gt; element.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are generating Jandex indexes as part of your build process, you can now use the latest Jandex Maven plugin or Gradle plugin versions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Maven Example:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.smallrye&lt;span class=&quot;tag&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jandex-maven-plugin&lt;span class=&quot;tag&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.5.3&lt;span class=&quot;tag&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;tag&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;make-index&lt;span class=&quot;tag&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;tag&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;tag&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;jandex&lt;span class=&quot;tag&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;tag&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;tag&quot;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;tag&quot;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
&lt;span class=&quot;tag&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Gradle Example:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;plugins {
    id 'org.kordamp.gradle.jandex' version '2.3.0'
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open Liberty automatically detects and recognizes the generated &lt;code&gt;META-INF/jandex.idx&lt;/code&gt; file for any supported index format version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://smallrye.io/jandex/jandex/3.5.3/index.html&quot;&gt;Jandex Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;aes&quot;&gt;AES encoding changes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;securityUtility encode&lt;/code&gt; command now requires a key to be specified for AES encodings. Specify a key by including one of the following options: &lt;code&gt;--key&lt;/code&gt;, &lt;code&gt;--base64Key&lt;/code&gt;, &lt;code&gt;--aesConfigFile&lt;/code&gt;, or &lt;code&gt;--keyring&lt;/code&gt;. This update resolves &lt;a href=&quot;https://www.ibm.com/support/pages/node/7261638&quot;&gt;CVE-2025-14923&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following command now results in an error because a key is not specified in the command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;securityUtility encode --encoding=aes &quot;password&quot;

When using AES encoding, one of the following arguments must be specified: --key, --base64Key, --aesConfigFile, or --keyring.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following is an example of a valid usage with the new requirement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;CodeRay highlight&quot;&gt;&lt;code&gt;securityUtility encode --encoding=aes --key=mycustomkey &quot;password&quot;
{aes}ARArmkfkgGyE1eiN8mKKjnkUDrFUFuuq2FlpDqrJKBgTAEYeN+PLP45wChLvIhlnWEDHnSA4zJI9KA3k5R9e/QDC+O2tzr3EwD3IMMAfvfOYxxqNPmoXqIeRVPD8TPZWnIIPmCnvyROw5A8=&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the full documentation for &lt;a href=&quot;https://openliberty.io/docs/latest/reference/command/securityUtility-encode.html&quot;&gt;securityUtility encode&lt;/a&gt; and &lt;a href=&quot;https://openliberty.io/docs/latest/password-encryption.html&quot;&gt;password encryption&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;CVEs&quot;&gt;Security vulnerability (CVE) fixes in this release&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 20%;&quot; /&gt;
&lt;col style=&quot;width: 20%;&quot; /&gt;
&lt;col style=&quot;width: 20%;&quot; /&gt;
&lt;col style=&quot;width: 20%;&quot; /&gt;
&lt;col style=&quot;width: 20%;&quot; /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;CVE&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;CVSS Score&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Vulnerability Assessment&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Versions Affected&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-14923&quot;&gt;CVE-2025-14923&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;4.7&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Weaker security&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;17.0.0.3-26.0.0.2&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-29371&quot;&gt;CVE-2024-29371&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;7.5&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Denial of service&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;21.0.0.3-26.0.0.2&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Affects the &lt;code&gt;openidConnectClient-1.0&lt;/code&gt;, &lt;code&gt;socialLogin-1.0&lt;/code&gt;, &lt;code&gt;mpJwt-1.2&lt;/code&gt;, &lt;code&gt;mpJwt-2.0&lt;/code&gt;, &lt;code&gt;mpJwt-2.1&lt;/code&gt;, and &lt;code&gt;jwt-1.0&lt;/code&gt; features&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a list of past security vulnerability fixes, reference the &lt;a href=&quot;https://openliberty.io/docs/latest/security-vulnerabilities.html&quot;&gt;Security vulnerability (CVE) list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bugs&quot;&gt;Notable bugs fixed in this release&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve spent some time fixing bugs. The following sections describe some of the issues resolved in this release. If you’re interested, here’s the &lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues?q=label%3Arelease%3A26003+label%3A%22release+bug%22&quot;&gt;full list of bugs fixed in 26.0.0.3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues/34017&quot;&gt;Missing error message in JMX REST client&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues/34052&quot;&gt;NullPointerException resurfaced in Open Liberty due to removal of EclipseLink 2.7.16 fix&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/OpenLiberty/open-liberty/issues/34171&quot;&gt;IBM WebSphere Application Server Liberty is affected by a denial of service due to jose4j (CVE-2024-29371 CVSS 7.5)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-open-liberty-26-0-0-3-now&quot;&gt;Get Open Liberty 26.0.0.3 now&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Available through &lt;a href=&quot;https://openliberty.io/jakartaee.xml#run&quot;&gt;Maven, Gradle, Docker, and as a downloadable archive&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>The OmniFish Team: Eclipse GlassFish: This Isn’t Your Father’s GlassFish</title>
	<guid isPermaLink="false">https://omnifish.ee/?p=5712</guid>
	<link>https://omnifish.ee/eclipse-glassfish-this-isnt-your-fathers-glassfish/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=eclipse-glassfish-this-isnt-your-fathers-glassfish</link>
	<description>&lt;p&gt;For years, developers and organizations have held certain beliefs about GlassFish, often based on their experiences with older versions. If you still think of GlassFish as a slow, unsupported, and purely for-development application server, it’s time to take a fresh look. At OmniFish, we’ve been working hard to change that perception since 2022. The Eclipse GlassFish of today, particularly from version 7.0 onwards, is a completely different platform, and we’re proud to show you what we’ve helped to build with the rest of the Eclipse GlassFish contributors.&lt;/p&gt;



&lt;p&gt;This article explores the key differences between the modern Eclipse GlassFish and its predecessor, Oracle GlassFish and older Eclipse GlassFish versions. We’ll show you how GlassFish has evolved into a robust, enterprise-grade platform with commercial support from our team at OmniFish, with frequent updates, and a strong commitment to modern Java standards and modern lightweight deployments. In short, this is no longer your father’s GlassFish.&lt;/p&gt;


&lt;div class=&quot;wp-block-table-of-contents-block-table-of-contents-block&quot;&gt;&lt;div class=&quot;eb-parent-wrapper eb-parent-eb-toc-h9mvb &quot;&gt;&lt;div class=&quot;eb-toc-container eb-toc-h9mvb  eb-toc-is-not-sticky eb-toc-not-collapsible eb-toc-initially-not-collapsed eb-toc-scrollToTop style-2 &quot;&gt;&lt;div class=&quot;eb-toc-header&quot;&gt;&lt;div class=&quot;eb-toc-title&quot;&gt;Article Contents&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; [â€¦]</description>
	<pubDate>Wed, 04 Mar 2026 17:04:42 +0000</pubDate>
</item>
<item>
	<title>The OmniFish Team: GlassFish 8 Released: Enterprise-Grade Java, Redefined. What’s new?</title>
	<guid isPermaLink="false">https://omnifish.ee/?p=5670</guid>
	<link>https://omnifish.ee/glassfish-8-released-enterprise-grade-java-redefined/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=glassfish-8-released-enterprise-grade-java-redefined</link>
	<description>&lt;div class=&quot;wp-block-spacer&quot; style=&quot;height: 29px;&quot;&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The next generation of enterprise Java is here. The final version of Eclipse GlassFish 8 landed on 5 February 2026. It’s a big milestone and reinforces GlassFish as a top-tier, enterprise-grade platform for mission-critical systems. Backed by the commercial support and expertise of OmniFish, GlassFish 8 is not just an open-source project; it is a robust, production-ready solution designed for organizations that demand reliability, performance, and innovation.&lt;/strong&gt;&lt;/p&gt;



&lt;div class=&quot;wp-block-spacer&quot; style=&quot;height: 21px;&quot;&gt;&lt;/div&gt;



&lt;p&gt;The final version of Eclipse GlassFish 8.0.0:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list ghostkit-list-columns-1&quot;&gt;
&lt;li&gt;&lt;strong&gt;Is Jakarta EE 11 Platform compatible*&lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Requires at least Java 21, tested on Java 21 and 25&lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Quality assured by OmniFish using a comprehensive test suite&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;has-small-font-size&quot;&gt;* GlassFish 8.0.0 passed the Jakarta EE 11 TCK and the compatibility request will be raised as soon as the summary for all the tests suites is assembled together. The previous milestone release of GlassFish 8, released in December 2025, is already certified.&lt;/p&gt;



&lt;div class=&quot;wp-block-spacer&quot; style=&quot;height: 21px;&quot;&gt;&lt;/div&gt;



&lt;p&gt;This release represents a significant leap forward, with support for the whole Jakarta EE 11 platform, the latest major version of Jakarta EE. GlassFish 8 builds upon the solid foundation of GlassFish 7.1 and introduces a host of new features that empower developers to build scalable, secure, and high-performance applications with ease. GlassFish continues to be at the forefront of the Jakarta EE ecosystem, with frequent updates and a strong commitment to modern Java standards.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Building on a Solid&lt;/h2&gt; […]</description>
	<pubDate>Thu, 12 Feb 2026 10:07:48 +0000</pubDate>
</item>
<item>
	<title>Christopher Guindon: Scaling the Open VSX Registry responsibly with rate limiting</title>
	<guid isPermaLink="true">https://www.chrisguindon.com/post/scaling-open-vsx-registry-rate-limiting/</guid>
	<link>https://www.chrisguindon.com/post/scaling-open-vsx-registry-rate-limiting/</link>
	<description>&lt;p&gt;The &lt;a href=&quot;https://open-vsx.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Open VSX Registry&lt;/a&gt; has become widely used infrastructure for modern developer tools. That growth reflects strong trust from the ecosystem, and it brings a shared responsibility to keep the Registry reliable, predictable, and equitable for everyone who depends on it.&lt;/p&gt;
&lt;p&gt;In a previous post, I shared an update on &lt;a href=&quot;https://blogs.eclipse.org/post/christopher-guindon/strengthening-supply-chain-security-open-vsx&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;strengthening supply-chain security in the Open VSX Registry&lt;/a&gt;, including the introduction of pre-publish checks for extensions. This post focuses on the operational side of the same goal: ensuring the Registry remains resilient and sustainable as usage continues to grow.&lt;/p&gt;
&lt;h2&gt;The Open VSX Registry is free to use, but not free to operate&lt;/h2&gt;
&lt;p&gt;Operating a global extension registry requires sustained investment in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compute and storage&lt;/strong&gt; to serve and index extensions at scale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt; to deliver downloads and metadata worldwide&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; to protect users, publishers, and the service itself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staff&lt;/strong&gt; to operate, monitor, secure, and support the Registry&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These costs scale directly with usage.&lt;/p&gt;
&lt;h2&gt;AI-driven usage is scaling faster than ever&lt;/h2&gt;
&lt;p&gt;Demand on the Open VSX Registry is increasing rapidly, and AI-enabled development is accelerating that trend. A single developer can now orchestrate dozens of agents and automated workflows, generating traffic that previously would have required entire teams. In practical terms, that can mean the equivalent load of twenty or more traditional users, with direct impact on compute, bandwidth, storage, security capacity, and operational oversight.&lt;/p&gt;
&lt;p&gt;This is not unique to the Open VSX Registry. It is an industry-wide challenge. Stewards of public package registries such as Maven Central, PyPI, crates.io, and Packagist have recently raised the same sustainability concerns in a &lt;a href=&quot;https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;joint statement on sustainable stewardship&lt;/a&gt;. Mike Milinkovich, Executive Director of the Eclipse Foundation, echoed that message in his &lt;a href=&quot;https://blogs.eclipse.org/post/mike-milinkovich/businesses-built-open-infrastructure-have-responsibility-sustain-it&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;post on aligning responsibility with usage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As reliance on shared open infrastructure grows, sustaining it becomes a collective responsibility across the ecosystem.&lt;/p&gt;
&lt;h2&gt;Open VSX is critical, and often invisible, infrastructure&lt;/h2&gt;
&lt;p&gt;Many developers and organisations may not realise how often they rely on the Open VSX Registry. It provides the extension infrastructure behind a growing number of modern developer platforms and tools, including &lt;strong&gt;Amazon’s Kiro, Cursor, Google Antigravity, Windsurf, VSCodium, IBM’s Project Bob, Trae, Ona (formerly Gitpod)&lt;/strong&gt;, and others.&lt;/p&gt;
&lt;p&gt;If you use one of these tools, you use the Open VSX Registry.&lt;/p&gt;
&lt;p&gt;The Open VSX Registry remains a neutral, vendor-independent public service, operated in the open and governed by the Eclipse Foundation for the benefit of the entire ecosystem.&lt;/p&gt;
&lt;p&gt;For developers, the expectation is simple: Open VSX should remain fast, stable, secure, and dependable as the ecosystem grows.&lt;/p&gt;
&lt;p&gt;As more platforms and automated systems rely on the Registry, continuous machine-driven traffic can place sustained load on shared infrastructure. Without clear operational guardrails, that can affect performance and availability for everyone.&lt;/p&gt;
&lt;h2&gt;A practical step for sustainable and reliable operations&lt;/h2&gt;
&lt;p&gt;Usage has shifted from primarily human-driven access to continuous automation driven by CI systems, cloud-based tooling, and AI-enabled workflows. That shift requires operational controls that scale predictably.&lt;/p&gt;
&lt;p&gt;Rate limiting provides a structured way to manage high-volume automated traffic while preserving the performance developers expect. It also ensures that operational decisions are based on real usage patterns and that expectations for large-scale consumption are clear and transparent.&lt;/p&gt;
&lt;p&gt;Rate limits aren’t entirely new. Like most public infrastructure services, the Open VSX Registry has long had baseline protections in place to prevent sustained high-volume usage from degrading performance for everyone. What’s changing now is that we’re moving from a one-size-fits-all approach to defined tiers that more accurately reflect different usage patterns. This allows us to keep the Registry stable and responsive for developers and open source projects, while providing a clear, supported path for sustained at-scale consumption.&lt;/p&gt;
&lt;p&gt;For individual developers and open source projects, day-to-day workflows remain unchanged. Publishing extensions, searching the registry, and installing tools will continue to work as they always have for typical usage.&lt;/p&gt;
&lt;h2&gt;A measured, transparent rollout&lt;/h2&gt;
&lt;p&gt;Rate limiting will be introduced incrementally, with an emphasis on platform health and operational stability.&lt;/p&gt;
&lt;p&gt;The initial phase focuses on visibility and observation before any limits are adjusted. This includes improved insight into traffic patterns for registered consumers, baseline protections for anonymous high-volume usage, and a monitoring period before any limits are adjusted.&lt;/p&gt;
&lt;p&gt;This work is being done in the open so the community can follow what is changing and why. Progress and discussion are tracked publicly in the Open VSX deployment issue: &lt;br /&gt;
&lt;a href=&quot;https://github.com/EclipseFdn/open-vsx.org/issues/5970&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/EclipseFdn/open-vsx.org/issues/5970&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What this means for the community&lt;/h2&gt;
&lt;p&gt;The goal is to keep the Open VSX Registry reliable and fair as it scales, while minimizing impact on normal use.&lt;/p&gt;
&lt;p&gt;For most users, nothing should feel different. Developers should see little to no impact, and publishers should not experience disruption to normal publishing workflows. Sustained, high-volume automated consumers may need to coordinate with the Registry to ensure their usage can be supported reliably over time.&lt;/p&gt;
&lt;p&gt;Organisations that depend on the Open VSX Registry for sustained or commercial-scale usage are encouraged to get in touch. Coordinating early helps us plan capacity, maintain reliability, and support the broader ecosystem.  Please contact the Open VSX Registry team at &lt;a href=&quot;mailto:infrastructure@eclipse-foundation.org&quot;&gt;infrastructure@eclipse-foundation.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The intent is not restriction, but clarity in support of fairness, stability, and long-term sustainability.&lt;/p&gt;
&lt;h2&gt;Looking ahead&lt;/h2&gt;
&lt;p&gt;Automation is reshaping how developer infrastructure is consumed. Responsible rate limiting is one step toward ensuring the Open VSX Registry can continue to serve the ecosystem reliably as those patterns evolve.&lt;/p&gt;
&lt;p&gt;We will continue to adapt based on real-world usage and community input, with the goal of keeping the Open VSX Registry a dependable shared resource for the long term.&lt;/p&gt;</description>
	<pubDate>Wed, 11 Feb 2026 20:05:00 +0000</pubDate>
</item>
<item>
	<title>Christopher Guindon: We’re hiring: improving the services that support a global open source community</title>
	<guid isPermaLink="true">https://www.chrisguindon.com/post/were-hiring-improving-services-support-global-open-source-community/</guid>
	<link>https://www.chrisguindon.com/post/were-hiring-improving-services-support-global-open-source-community/</link>
	<description>&lt;p&gt;The Eclipse Foundation supports a global open source community by providing trusted platforms, services, and governance. As a vendor-neutral organisation, we operate infrastructure that enables collaboration across projects, organisations, and industries.&lt;/p&gt;
&lt;p&gt;This infrastructure supports project governance, developer tooling, and day-to-day operations across Eclipse open source projects. While much of it runs quietly in the background, it plays a critical role in the health, security, and sustainability of those projects.&lt;/p&gt;
&lt;p&gt;We are expanding the Software Development team with two new roles. Both positions involve contributing to the design, development, and operation of services that are widely used, security-sensitive, and expected to operate reliably at scale.&lt;/p&gt;
&lt;h2&gt;Software engineer: security and detection&lt;/h2&gt;
&lt;p&gt;One of the roles is a Software Engineer position with a focus on security and detection engineering, alongside general development and operations.&lt;/p&gt;
&lt;p&gt;This role will work on &lt;a href=&quot;https://open-vsx.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Open VSX Registry&lt;/a&gt;, an open source registry for VS Code extensions operated by the Eclipse Foundation. As adoption grows, maintaining the integrity and trustworthiness of the registry requires continuous analysis, detection, and operational safeguards.&lt;/p&gt;
&lt;p&gt;In this role, you will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analyse suspicious or malicious extensions and related artefacts&lt;/li&gt;
&lt;li&gt;Develop, test, and maintain YARA rules to detect malicious or policy-violating content&lt;/li&gt;
&lt;li&gt;Design, implement and contribute improvements to backend services, including new features, abuse prevention, rate-limiting, and operational safeguards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is hands-on work that combines backend development with practical security analysis. The outcome directly improves the reliability, integrity, and operation of services that are part of the developer tooling supply chain.&lt;/p&gt;
&lt;p&gt;For more context on this work, see my recent post on &lt;a href=&quot;https://blogs.eclipse.org/post/christopher-guindon/strengthening-supply-chain-security-open-vsx&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;strengthening supply-chain security in Open VSX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To apply: &lt;br /&gt;
&lt;a href=&quot;https://eclipsefoundation.applytojob.com/apply/eXFgacP5SJ/Software-Engineer&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://eclipsefoundation.applytojob.com/apply/eXFgacP5SJ/Software-Engineer&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Software developer: open source project tooling and services&lt;/h2&gt;
&lt;p&gt;The second role is a Software Developer position focused on improving the tools and services that support Eclipse open source projects.&lt;/p&gt;
&lt;p&gt;This work centres on maintaining and evolving systems that our open source projects and contributors rely on every day. It includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintaining and modernising project-facing applications such as projects.eclipse.org, built with Drupal and PHP&lt;/li&gt;
&lt;li&gt;Developing Python tooling to automate internal processes and improve project metrics&lt;/li&gt;
&lt;li&gt;Improving services written in Java or JavaScript that support project governance workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As with the Software Engineer role, this position involves contributing to production services. The focus is on incremental improvement, reducing technical debt, and ensuring systems remain maintainable, secure, and reliable as they evolve.&lt;/p&gt;
&lt;p&gt;To apply: &lt;br /&gt;
&lt;a href=&quot;https://eclipsefoundation.applytojob.com/apply/mvaSS7T8Ox/Software-Developer&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://eclipsefoundation.applytojob.com/apply/mvaSS7T8Ox/Software-Developer&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What we are looking for&lt;/h2&gt;
&lt;p&gt;Across both roles, we are looking for people who:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take a pragmatic approach to problem solving&lt;/li&gt;
&lt;li&gt;Are comfortable working in a remote, open source environment&lt;/li&gt;
&lt;li&gt;Value clear documentation and thoughtful communication&lt;/li&gt;
&lt;li&gt;Enjoy understanding how systems work and how to improve them over time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are interested in working on open source infrastructure with real users and real impact, we would be happy to hear from you.&lt;/p&gt;</description>
	<pubDate>Thu, 05 Feb 2026 19:02:00 +0000</pubDate>
</item>
<item>
	<title>Jan Supol: Jersey 3.1.0 behaviour changes</title>
	<guid isPermaLink="true">http://blog.supol.cz/?p=250</guid>
	<link>http://blog.supol.cz/?p=250</link>
	<description>This article discusses backward-incompatible changes in Jersey 3.1.0. While Jersey tries to minimize these incompatible changes, the changes are forced by the Platform Specification Project, API project, security reasons, or by an unstoppable evolution. Jersey 3.1.0 drops compatibility with JDK … &lt;a href=&quot;http://blog.supol.cz/?p=250&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;→&lt;/span&gt;&lt;/a&gt;</description>
	<pubDate>Wed, 21 Jan 2026 15:20:34 +0000</pubDate>
</item>
<item>
	<title>Alexius Diakogiannis: The Ultimate 10 Years Java Garbage Collection Guide (2016–2026) – Choosing the Right GC for Every Workload</title>
	<guid isPermaLink="false">https://jee.gr/?p=1004</guid>
	<link>https://jee.gr/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload</link>
	<description>&lt;p&gt;&lt;a class=&quot;a2a_button_printfriendly&quot; href=&quot;https://www.addtoany.com/add_to/printfriendly?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;PrintFriendly&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_facebook&quot; href=&quot;https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_twitter&quot; href=&quot;https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_email&quot; href=&quot;https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Email&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_linkedin&quot; href=&quot;https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;LinkedIn&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_hacker_news&quot; href=&quot;https://www.addtoany.com/add_to/hacker_news?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Hacker News&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_dd addtoany_share_save addtoany_share&quot; href=&quot;https://www.addtoany.com/share#url=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;title=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;First published on &lt;a href=&quot;https://foojay.io/today/the-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload/&quot;&gt;foojay.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Memory management remains the primary factor for application performance in enterprise Java environments. Between 2017 and 2025, the ecosystem shifted from manual tuning to architectural selection. Industry data suggests that 60 percent of Java performance issues and 45 percent of production incidents in distributed systems stem from suboptimal Garbage Collection (GC) behavior. This guide provides a strategic framework for selecting collectors based on workload characteristics. It covers the transition from legacy collectors to Generational ZGC, analyzing trade-offs regarding throughput, latency, and hardware constraints with mathematical precision.&lt;span id=&quot;more-1004&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-0--ntroduction&quot;&gt;&lt;a href=&quot;https://jee.gr/wp-content/uploads/2026/01/Gemini_Generated_Image_pa4tufpa4tufpa4t-scaled.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter wp-image-1007 size-large&quot; height=&quot;355&quot; src=&quot;https://jee.gr/wp-content/uploads/2026/01/Gemini_Generated_Image_pa4tufpa4tufpa4t-1024x559.png&quot; width=&quot;650&quot; /&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The era of “write once, run anywhere” has evolved. In modern cloud-native architectures, you must “tune everywhere.” The migration from bare-metal monoliths to containerized microservices fundamentally changed how the Java Virtual Machine (JVM) interacts with memory.&lt;/p&gt;
&lt;p&gt;A collector that performs well for a batch process often fails in a low-latency trading API. Selecting the wrong collector is no longer a minor configuration error. It is an architectural flaw. This flaw leads to cascading latency in microservices, instability in database connections, and wasted cloud resources.&lt;/p&gt;
&lt;p&gt;This guide analyzes five primary workload categories. It synthesizes performance data from &lt;strong&gt;JDK 8 through JDK 25&lt;/strong&gt;. It provides a technical decision matrix for Senior Architects and Site Reliability Engineers (SREs).&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-1--orkload-nalysis-and-trategic-election&quot;&gt;Workload Analysis and Strategic Selection&lt;/h2&gt;
&lt;p&gt;We categorize applications based on their resource patterns and business goals. Each category requires a distinct memory management strategy supported by specific mathematical tuning models.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-2--icroservices-pring-oot-uarkus-&quot;&gt;Microservices (Spring Boot/Quarkus)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; You must balance Resident Set Size (RSS) efficiency against startup time.&lt;br /&gt;
In Kubernetes environments, engineers often restrict pods to fewer than 2 processors and 2 GB of RAM. The JVM ergonomics often default to the Serial GC in these conditions. This happens even if you specify another collector.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Strategy:&lt;/strong&gt;&lt;br /&gt;
For most microservices, G1 GC is the balanced choice. However, deployment density matters. Research shows that G1 is the most memory-efficient collector for dense environments. In JDK 20 and later, engineers removed one of the marking bitmaps from G1. This reduced its native memory footprint, making it highly suitable for small containers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning on ZGC in Microservices:&lt;/strong&gt;&lt;br /&gt;
Do not blindly apply ZGC to small containers. ZGC requires significant headroom. It typically needs 25 to 35 percent free memory to function without stalling. In an 8 GB container, ZGC images are significantly larger than G1 images. Tests show that ZGC struggles to manage trees of 10 services in constrained RAM. It often fails with Out-Of-Memory (OOM) errors where G1 remains stable.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-3--egacy-eb-ogic-oss-ayara-&quot;&gt;Legacy JEE (WebLogic/JBoss/Payara)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; These systems handle large session states and accumulate legacy memory leaks.&lt;br /&gt;
Older applications relied on Concurrent Mark Sweep (CMS). CMS was designed for shorter pauses but required shared processor resources. It was deprecated in JDK 9 and removed in JDK 14.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Strategy:&lt;/strong&gt;&lt;br /&gt;
G1 GC is the primary successor for these workloads. It handles large heaps up to 128 GB by using region-based incremental collection.&lt;br /&gt;
Operators must monitor heap usage after full cycles. If heap usage consistently stays above 85 percent, the application likely has a memory leak. This indicates a code issue rather than a tuning issue.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-4--tateful-aadin-&quot;&gt;Stateful UI (Vaadin/JSF)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; These frameworks generate numerous medium-lived objects.&lt;br /&gt;
User sessions reside in the heap for minutes or hours. This behavior contradicts the “weak generational hypothesis” that most objects die young. Standard configurations often promote these session objects to the Old Generation too quickly. This leads to expensive full-heap collections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Strategy:&lt;/strong&gt;&lt;br /&gt;
Tuning the &lt;code&gt;SurvivorRatio&lt;/code&gt; is critical here. A standard ratio is 8 to 1. Changing this to 6 to 1 allows objects to stay in the Young Generation longer. Empirical testing shows this reduces premature promotions by &lt;strong&gt;25 to 30 percent&lt;/strong&gt;. Generational ZGC is also an optimal choice here. It manages mixed collections across generations effectively.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-5--ata-ntensive-park-link-atch-&quot;&gt;Data Intensive (Spark/Flink/Batch)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; The priority is raw throughput.&lt;br /&gt;
Batch workloads must complete processing windows quickly. Individual pause times do not matter. A 5-second pause is acceptable if the job finishes 10 minutes earlier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Strategy:&lt;/strong&gt;&lt;br /&gt;
Parallel GC (the “throughput collector”) remains the champion. It utilizes all available cores for collection, achieving 95 to 98 percent processing efficiency. However, it requires careful thread configuration on large multi-core servers to prevent OS context-switching overhead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mathematical Tuning Model: GC Threads&lt;/strong&gt;&lt;br /&gt;
To optimize Parallel GC, explicitly set the thread count (Threads&lt;sub&gt;GC&lt;/sub&gt;&lt;em&gt;) based on your available CPU cores (N&lt;/em&gt;&lt;sub&gt;cpu&lt;/sub&gt;).&lt;/p&gt;
&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-122362&quot; height=&quot;318&quot; src=&quot;https://foojay.io/wp-content/uploads/2026/01/gc-math-1.png&quot; width=&quot;932&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;This formula ensures the GC utilizes resources efficiently without overwhelming the operating system scheduler on massive batch servers.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-6--ltra-ow-atency&quot;&gt;Ultra-Low Latency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; High-frequency APIs require sub-millisecond pauses.&lt;br /&gt;
Trading systems cannot tolerate the unpredictable pauses of G1 or Parallel GC. However, low-latency collectors like ZGC race against the application’s object creation. If the application creates objects faster than the collector can clean them, you hit an “Allocation Stall.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Strategy:&lt;/strong&gt;&lt;br /&gt;
ZGC maintains pause times under 1 millisecond for heaps ranging from 8 GB to 16 TB using colored pointers and load barriers. To ensure stability, you must monitor the Allocation Rate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mathematical Tuning Model: Allocation Rate&lt;/strong&gt;&lt;br /&gt;
You must calculate the Allocation Rate (R&lt;sub&gt;alloc&lt;/sub&gt;) over a time period (&lt;em&gt;t&lt;/em&gt;) to determine if your heap headroom is sufficient.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-122363&quot; height=&quot;116&quot; src=&quot;https://foojay.io/wp-content/uploads/2026/01/gc-math-2.png&quot; width=&quot;937&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;If R&lt;sub&gt;alloc&lt;/sub&gt; consistently approaches the concurrent collection speed of ZGC, you must either increase the heap size or optimize the code. For modern stacks on JDK 21 or later, Generational ZGC is the superior choice as it handles high allocation rates by frequently clearing the Young Generation, preventing stalls.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-7--echnical-erformance-eep-ives&quot;&gt;Technical Performance Deep Dives&lt;/h2&gt;
&lt;p&gt;This section explores the specific trade-offs involved in migration and architecture design.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-8--igration-rade-offs-arallel-ld-to-&quot;&gt;Migration Trade-offs: ParallelOld to ZGC&lt;/h3&gt;
&lt;p&gt;Migrating from ParallelOld to ZGC is a trade-off between raw speed and predictability.&lt;/p&gt;
&lt;p&gt;You trade approximately 7 to 15 percent of raw throughput for a 1000x improvement in pause predictability.&lt;/p&gt;
&lt;p&gt;ZGC imposes a “tax” on the system.&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;CPU Overhead:&lt;/strong&gt; ZGC adds an 8 to 20 percent CPU overhead. This comes from the concurrent threads that run alongside your application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache Efficiency:&lt;/strong&gt; The use of colored pointers and read barriers impacts the processor cache. L3 cache hit rates often decline by 10 to 15 percent due to pointer metadata operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NUMA Penalty:&lt;/strong&gt; In Non-Uniform Memory Access (NUMA) architectures, ZGC relocation threads can suffer a 20 to 30 percent performance penalty. You must pin these threads to local memory domains to avoid this.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-9--icroservices-and-umulative-atency&quot;&gt;Microservices and Cumulative Latency&lt;/h3&gt;
&lt;p&gt;In a microservice architecture, latency accumulates. A single user request often triggers a chain of calls across 5 to 10 services. This creates a “fan-out” effect.&lt;/p&gt;
&lt;p&gt;If each service uses a collector like G1 or Parallel, the pauses add up. Cumulative GC pauses across a chain can amplify total latency by 3 to 5 times compared to a monolith.&lt;/p&gt;
&lt;p&gt;Using ZGC or Shenandoah dramatically mitigates this. Tests indicate that migrating to low-latency collectors reduces this cascading latency effect by 65 percent. However, this introduces resource contention. The collector competes with application threads for CPU cycles and memory bandwidth.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-10--atabase-onnectivity-tability&quot;&gt;Database Connectivity Stability&lt;/h3&gt;
&lt;p&gt;Database connections are heavy, long-lived objects. They test the stability of a collector.&lt;/p&gt;
&lt;p&gt;Empirical testing indicates that CMS was historically the most stable collector for database-intensive microservices. It handled the highest number of managed instances before crashing.&lt;/p&gt;
&lt;p&gt;Early versions of ZGC (Non-Generational) struggled here. In small container tests with DB connections, non-generational ZGC frequently threw NullPointerException errors. It failed to maintain connectivity due to allocation stalls.&lt;/p&gt;
&lt;p&gt;Generational ZGC (JDK 21+) resolves these issues. It frequently collects the young generation where session-related objects reside. This protects the long-lived database connections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benchmark:&lt;/strong&gt; In Apache Cassandra tests, non-generational ZGC failed at 75 concurrent clients. Generational ZGC &lt;strong&gt;maintained stability with up to 275 concurrent clients&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-11--echnical-atrix-and-ecision-ogic&quot;&gt;Technical Matrix and Decision Logic&lt;/h2&gt;
&lt;p&gt;Use this data to guide your architectural decisions.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-12--ollector-omparison-8-25-&quot;&gt;Collector Comparison (JDK 8–25)&lt;/h3&gt;
&lt;figure class=&quot;wp-block-table is-style-regular&quot;&gt;
&lt;table class=&quot;has-fixed-layout&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Supported JDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Ideal Heap Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Pause Time Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CPU Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Key Technology&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Serial&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8–25&lt;/td&gt;
&lt;td&gt;&amp;lt; 100 MB&lt;/td&gt;
&lt;td&gt;N/A (Long STW)&lt;/td&gt;
&lt;td&gt;Lowest&lt;/td&gt;
&lt;td&gt;Single-threaded STW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parallel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8–25&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Acceptable STW&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Multi-threaded STW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;G1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9–25 (Default)&lt;/td&gt;
&lt;td&gt;6 GB – 128 GB&lt;/td&gt;
&lt;td&gt;&amp;lt; 200ms&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Region-based evacuation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ZGC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11–25&lt;/td&gt;
&lt;td&gt;8 GB – 16 TB&lt;/td&gt;
&lt;td&gt;&amp;lt; 1ms&lt;/td&gt;
&lt;td&gt;High (8-20%)&lt;/td&gt;
&lt;td&gt;Colored pointers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shenandoah&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12–25&lt;/td&gt;
&lt;td&gt;2 GB – 10 TB&lt;/td&gt;
&lt;td&gt;&amp;lt; 10ms&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Concurrent compaction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/figure&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-13--he-ecision-ree&quot;&gt;The Decision Tree&lt;/h3&gt;
&lt;p&gt;Follow this logic to select the correct collector.&lt;/p&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Scenario A:&lt;/strong&gt; &lt;strong&gt;The Resource Constraint&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Is the environment a tiny container (&amp;lt; 2 cores/2GB RAM) or is the heap &amp;lt; 100 MB?&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Selection:&lt;/strong&gt; Use Serial GC (&lt;code&gt;-XX:+UseSerialGC&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Scenario B: The Batch Processor&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Is the priority 4–8 hour batch processing windows where total throughput is the only metric?&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Selection:&lt;/strong&gt; Use Parallel GC (&lt;code&gt;-XX:+UseParallelGC&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Scenario C: The Generalist&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Is the application a general web service with balanced latency and throughput needs? Is the heap-to-container ratio &amp;gt; 80%?&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Selection:&lt;/strong&gt; Use G1 GC (&lt;code&gt;-XX:+UseG1GC&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Scenario D: The High-Performance Specialist&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Does the application require sub-1ms response times on large heaps (&amp;gt; 32 GB) on JDK 21+? Do you have 25% memory headroom?&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Selection:&lt;/strong&gt; Use Generational ZGC (&lt;code&gt;-XX:+UseZGC -XX:+ZGenerational&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Scenario E: The Alternative&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Are you on a non-Oracle OpenJDK and require low latency without ZGC multi-mapping?&lt;/p&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Selection:&lt;/strong&gt; Use Shenandoah GC (&lt;code&gt;-XX:+UseShenandoahGC&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;G1 vs Generational ZGC in 2026&lt;/h4&gt;
&lt;p&gt;For years, the standard advice was “G1 is always best.” The arrival of Generational ZGC in JDK 21 through JDK 25 challenges this.&lt;/p&gt;
&lt;p&gt;The legacy non-generational ZGC suffered from allocation stalls. It had to scan the entire heap to find garbage. This works poorly when an application creates objects faster than the collector can clean them.&lt;/p&gt;
&lt;p&gt;Generational ZGC exploits the Weak Generational Hypothesis, most objects die young.&lt;/p&gt;
&lt;p&gt;By splitting the heap into generations, it achieves two goals:&lt;/p&gt;
&lt;ol class=&quot;wp-block-list&quot; start=&quot;1&quot;&gt;
&lt;li&gt;&lt;strong&gt;Throughput:&lt;/strong&gt; It improves throughput by 10 percent compared to its single-generation predecessor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stability:&lt;/strong&gt; It prevents the allocation stalls that plagued earlier versions in high-concurrency environments.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Architect’s Note:&lt;/p&gt;
&lt;p&gt;In JDK 25, G1 remains the most memory-efficient option regarding RSS. For performance-critical stacks on JDK 21+, Generational ZGC should be the baseline, provided you provision the infrastructure with at least 25 percent memory headroom.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-14--he-rchitect-s-oadmap-ptimization-by-ersion&quot;&gt;The Architect’s Roadmap: Optimization by JDK Version&lt;/h2&gt;
&lt;p&gt;As a Principal Java Architect, I recognize that being “stuck” on a specific JDK version often involves balancing legacy stability with the need for modern performance. Here is your roadmap for optimization and troubleshooting, depending on which version of the JVM you are currently tethered to.&lt;/p&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-15--f-you-are-on-ava-8-&quot;&gt;If you are on Java 8…&lt;/h3&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Manage the Metaspace Shift:&lt;/strong&gt; Since the Permanent Generation was removed in JDK 8, you must monitor your native memory usage for class metadata using &lt;code&gt;-XX:MaxMetaspaceSize&lt;/code&gt;. Avoid the “bad practice” of simply renaming old &lt;code&gt;MaxPermSize&lt;/code&gt; flags to Metaspace without conducting a fresh analysis of your application’s class-loading needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address the CMS Maintenance Gap:&lt;/strong&gt; If you are using the Concurrent Mark Sweep (CMS) collector on free builds, be aware that it is no longer maintained and lacks critical backported patches. If performance is degrading, transition to the Parallel GC for throughput or G1 GC for a balance of latency, though be wary that G1 in the Java 8 era utilized significantly more native memory than modern versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tune for Premature Promotion:&lt;/strong&gt; If you see high Stop-The-World (STW) durations in the Old generation, increase your &lt;code&gt;SurvivorRatio&lt;/code&gt; from the default 8:1 to 6:1. This provides more breathing room for medium-lived objects and can reduce premature promotions by up to 30%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage Performance Editions:&lt;/strong&gt; If an upgrade is impossible, consider utilizing specialized runtimes like Liberica JDK Performance Edition, which can provide a ~10% performance boost for legacy workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-16--f-you-are-on-ava-11-&quot;&gt;If you are on Java 11…&lt;/h3&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Re-evaluate Inherited Flags:&lt;/strong&gt; Do not carry over your Java 8 tuning scripts blindly; flags that benefited the Parallel collector often conflict with the G1 GC heuristics now active by default. For example, manually setting the young generation size can prevent G1 from accurately meeting its &lt;code&gt;MaxGCPauseMillis&lt;/code&gt; targets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be Cautious with Experimental ZGC:&lt;/strong&gt; While ZGC was introduced in JDK 11, it was experimental and limited to Linux. It lacks generational capabilities in this version, making it highly susceptible to allocation stalls if your application’s allocation rate is high.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor G1 Native Footprint:&lt;/strong&gt; G1 was significantly improved in JDK 11 to reduce its native memory overhead, which was a major complaint in earlier versions. Use Native Memory Tracking (NMT) with &lt;code&gt;-XX:NativeMemoryTracking=summary&lt;/code&gt; to ensure your container limits are not being breached by the collector’s internal data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-17--f-you-are-on-ava-17-&quot;&gt;If you are on Java 17…&lt;/h3&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Commit to ZGC for Large Heaps:&lt;/strong&gt; Since JDK 15, ZGC has been production-ready and is the primary choice for heaps ranging from 8 GB to 16 TB where sub-millisecond latency is required. However, ensure you have 15-25% memory headroom beyond your peak working set to accommodate ZGC’s concurrent relocation work and metadata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Huge Pages:&lt;/strong&gt; On Linux, enable Transparent Huge Pages (THP) or explicit large pages to achieve a “free lunch” performance boost of approximately 10%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transition from CMS:&lt;/strong&gt; If you are migrating from Java 8/11 to 17, remember that CMS was removed in JDK 14. You must move to G1 or ZGC; G1 is typically the most stable choice for memory-constrained environments where the heap-to-container ratio exceeds 80%.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Modern Diagnostics:&lt;/strong&gt; Utilize JDK Flight Recorder (JFR) for profiling with less than 2% overhead to identify fine-grained allocation patterns and object creation rates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;wp-block-heading&quot; id=&quot;h3-18--f-you-are-on-ava-21-&quot;&gt;If you are on Java 21…&lt;/h3&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Activate Generational ZGC:&lt;/strong&gt; This is the most significant change in modern JVM performance. Use the flags &lt;code&gt;-XX:+UseZGC -XX:+ZGenerational&lt;/code&gt; to handle high allocation rates that would have caused stalls in earlier versions. In benchmarks like Apache Cassandra, this version remains stable with up to 275 concurrent clients, whereas the non-generational version often failed at 75.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploit the Weak Generational Hypothesis:&lt;/strong&gt; Generational ZGC improves throughput by 10% compared to legacy ZGC by focusing its collection efforts on the young generation where most objects “die young”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage G1 Efficiency:&lt;/strong&gt; If your environment is extremely memory-constrained, the G1 collector in JDK 21 is more efficient than ever, as it now requires only one marking bitmap instead of two, significantly reducing its Resident Set Size (RSS).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adopt Compact Object Headers:&lt;/strong&gt; Consider enabling the compact object headers feature (experimental in 24, but maturing in late 21 updates) to reduce the memory footprint of every object on the heap, improving overall throughput.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; Navigating Java versions is like maintaining a building’s HVAC system. &lt;strong&gt;Java 8&lt;/strong&gt; is an old boiler where you must manually watch the pressure gauges (Metaspace and PermGen). &lt;strong&gt;Java 11 and 17&lt;/strong&gt; are modern units that work well but require you to clear out the old filters (inherited flags) to be effective. &lt;strong&gt;Java 21&lt;/strong&gt; is a smart climate control system: by enabling Generational ZGC, the system finally becomes intelligent enough to focus its energy only on the rooms currently in use (the young generation), saving you massive amounts of manual labor and resource cost.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;h2-19--onclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;There is no single “best” collector. There is only the right collector for your specific constraints.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Parallel GC is a massive double-decker bus. It carries the most passengers (throughput) but blocks all traffic when it stops. G1 is a fleet of mid-sized shuttles. They cause frequent but short delays. Generational ZGC is a network of drones. They deliver instantly, but they consume more energy and space to operate.&lt;/p&gt;
&lt;p&gt;Align your JVM configuration with your business goals. Monitor your allocation rates using the equations provided. And most importantly, stop treating memory management as an afterthought.&lt;/p&gt;
&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ol class=&quot;wp-block-list&quot; start=&quot;1&quot;&gt;
&lt;li&gt;Gullapalli, V. (2025). &lt;em&gt;Adaptive JVM Optimization: Charting the Path from ParallelOld to ZGC Excellence&lt;/em&gt;. Al-Kindi Publisher. Journal of Computer Science and Technology Studies, 7(8).&lt;/li&gt;
&lt;li&gt;Edelveis, C. (2024). &lt;em&gt;An Overview of Java Garbage Collectors&lt;/em&gt;. BellSoft Corporation.&lt;/li&gt;
&lt;li&gt;Cai, Z., Blackburn, S. M., Bond, M. D., &amp;amp; Maas, M. (2022). &lt;em&gt;Distilling the Real Cost of Production Garbage Collectors&lt;/em&gt;. arXiv:2204.06782.&lt;/li&gt;
&lt;li&gt;Johansson, S. (2023). &lt;em&gt;Garbage Collection in Java: Choosing the Correct Collector&lt;/em&gt;. Oracle Corporation (Java YouTube Channel).&lt;/li&gt;
&lt;li&gt;Oracle Corporation. (2023-2025). &lt;em&gt;Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide, Release 21&lt;/em&gt;. Oracle Help Center.&lt;/li&gt;
&lt;li&gt;Reddit Community. (2021-2025). &lt;em&gt;How to choose the best Java garbage collector&lt;/em&gt;. r/java.&lt;/li&gt;
&lt;li&gt;Korando, B. (2023). &lt;em&gt;Introducing Generational ZGC&lt;/em&gt;. Inside Java.&lt;/li&gt;
&lt;li&gt;Johansson, S. (2023). &lt;em&gt;JDK 21: The GCs keep getting better&lt;/em&gt;. OpenJDK Performance Blog.&lt;/li&gt;
&lt;li&gt;Ericson, A. (2021). &lt;em&gt;Mitigating garbage collection in Java microservices&lt;/em&gt;. Mid Sweden University. DiVA portal.&lt;/li&gt;
&lt;li&gt;Canales, F., Hecht, G., &amp;amp; Bergel, A. (2021). &lt;em&gt;Optimization of Java Virtual Machine Flags using Feature Model and Genetic Algorithm&lt;/em&gt;. ACM ICPE ’21 Companion.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jee.gr/the-generational-z-garbage-collector-zgc/&quot;&gt;Diakogiannis, A. D. (2024). &lt;em&gt;The Generational Z Garbage Collector (ZGC)&lt;/em&gt;. JEE.gr.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jee.gr/%CE%A4%CE%B1-java-vm-options-%CF%80%CE%BF%CF%85-%CF%80%CF%81%CE%AD%CF%80%CE%B5%CE%B9-%CE%BD%CE%B1-%CE%BE%CE%AD%CF%81%CE%B5%CE%B9%CF%82-%CF%84%CE%B9-%CE%BA%CE%AC%CE%BD%CE%BF%CF%85%CE%BD/&quot;&gt;Diakogiannis, A. D. (2017). &lt;em&gt;Ta Java VM Options pou prepei na ksereis ti kanoun!&lt;/em&gt;. JEE.gr.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a class=&quot;a2a_button_printfriendly&quot; href=&quot;https://www.addtoany.com/add_to/printfriendly?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;PrintFriendly&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_facebook&quot; href=&quot;https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_twitter&quot; href=&quot;https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_email&quot; href=&quot;https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Email&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_linkedin&quot; href=&quot;https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;LinkedIn&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_hacker_news&quot; href=&quot;https://www.addtoany.com/add_to/hacker_news?linkurl=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;linkname=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Hacker News&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_dd addtoany_share_save addtoany_share&quot; href=&quot;https://www.addtoany.com/share#url=https%3A%2F%2Fjee.gr%2Fthe-ultimate-10-years-java-garbage-collection-guide-2016-2026-choosing-the-right-gc-for-every-workload%2F&amp;amp;title=The%20Ultimate%2010%20Years%20Java%20Garbage%20Collection%20Guide%20%282016%E2%80%932026%29%20%E2%80%93%20Choosing%20the%20Right%20GC%20for%20Every%20Workload&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 16 Jan 2026 16:19:56 +0000</pubDate>
</item>
<item>
	<title>Tanja Obradovic: Jakarta EE 2025: a year of growth, innovation, and global engagement</title>
	<guid isPermaLink="false">8678 at https://blogs.eclipse.org</guid>
	<link>https://blogs.eclipse.org/post/tatjana-obradovic/jakarta-ee-2025-year-growth-innovation-and-global-engagement</link>
	<description>&lt;span&gt;Jakarta EE 2025: a year of growth, innovation, and global engagement&lt;/span&gt;

            &lt;div class=&quot;field field--name-body field--type-text-with-summary field--label-hidden field--item&quot;&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;As 2025 comes to a close, it's a great moment to reflect on what we’ve achieved together as the &lt;/span&gt;&lt;a href=&quot;http://jakarta.ee&quot;&gt;&lt;span&gt;Jakarta EE&lt;/span&gt;&lt;/a&gt;&lt;span&gt; community. From major platform updates to refreshing the website and growing developer engagement, this year has been full of meaningful progress.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Celebrating Jakarta EE 11&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;One of our biggest milestones this year was &lt;/span&gt;&lt;a href=&quot;https://jakarta.ee/release/11/&quot;&gt;&lt;strong&gt;Jakarta EE 11&lt;/strong&gt;&lt;/a&gt;&lt;span&gt;. This time we did the release in a different way: we released as soon as the profile or platforms were ready! The Core Profile was available in December 2024 and Web Profile in March 2025, and Jakarta EE Platform finalised in June 2025, reflecting the steady progress of the Jakarta EE community. &lt;/span&gt;&lt;a href=&quot;https://jakarta.ee/compatibility/certification/11/&quot;&gt;&lt;span&gt;Compatible products&lt;/span&gt;&lt;/a&gt;&lt;span&gt; followed right away!&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Jakarta EE 11 introduces the new &lt;/span&gt;&lt;strong&gt;Jakarta Data&lt;/strong&gt;&lt;span&gt; specification, delivers a modernised testing experience with updated TCK infrastructure based on &lt;/span&gt;&lt;strong&gt;JUnit 5&lt;/strong&gt;&lt;span&gt; and &lt;/span&gt;&lt;strong&gt;Maven&lt;/strong&gt;&lt;span&gt;, and expands support for &lt;/span&gt;&lt;strong&gt;Java 21&lt;/strong&gt;&lt;span&gt;, including virtual threads. It also streamlines the platform by retiring older specifications such as Managed Beans, reinforcing &lt;/span&gt;&lt;strong&gt;Contexts and Dependency Injection (CDI)&lt;/strong&gt;&lt;span&gt; as the preferred programming model and continues to provide &lt;/span&gt;&lt;strong&gt;Java Records&lt;/strong&gt;&lt;span&gt; support.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;This release marks a significant step forward in simplifying enterprise Java development, improving developer productivity, and supporting modern, cloud native applications. It's a true reflection of the community’s collaborative efforts and ongoing commitment to innovation.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://newsroom.eclipse.org/news/announcements/eclipse-foundation%E2%80%99s-jakarta-ee-working-group-announces-jakarta-ee-11-release?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;Read the Jakarta EE 11 announcement&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Introducing Jakarta Agentic AI: A New Standard for Running AI Agents on Jakarta EE&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;This year marked the introduction of the &lt;/span&gt;&lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.agentic-ai&quot;&gt;&lt;span&gt;Jakarta Agentic AI&lt;/span&gt;&lt;/a&gt;&lt;span&gt; specification project. Aimed at standardising how AI agents run within Jakarta EE runtimes, this new specification will be included in a future release. Much like Jakarta Servlet unified HTTP processing and Jakarta Batch defined batch workflows, Jakarta Agentic AI will provide a &lt;/span&gt;&lt;strong&gt;clear, annotation-driven API&lt;/strong&gt;&lt;span&gt; that defines how agents are created, managed, and executed.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Built on &lt;/span&gt;&lt;strong&gt;CDI as the core component model&lt;/strong&gt;&lt;span&gt;, the specification will establish consistent lifecycle patterns and usage semantics, making it easier for developers to implement and integrate a wide range of agent types. The project also anticipates deep integration with key Jakarta EE APIs, ensuring seamless interoperability across the platform.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Jakarta Agentic AI is being developed with broad industry collaboration in mind. The project is seeking input from subject-matter experts, vendors, and API consumers both inside and outside the Java ecosystem to build the most open, portable, and future-ready agent execution model possible. Visit the &lt;/span&gt;&lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.agentic-ai&quot;&gt;&lt;span&gt;project page&lt;/span&gt;&lt;/a&gt;&lt;span&gt; to learn more about the specification.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Listening and learning through the Jakarta EE Developer Survey&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Our annual &lt;/span&gt;&lt;a href=&quot;https://outreach.eclipse.foundation/2025-jakarta-ee-developer-survey-report&quot;&gt;&lt;strong&gt;Jakarta EE Developer Survey&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; remains one of the best ways to track how developers and organisations are using enterprise Java and shaping their cloud strategies. In 2025, we saw a 20% increase in participation, with over &lt;/span&gt;&lt;strong&gt;1,700 participants&lt;/strong&gt;&lt;span&gt; sharing how they use Jakarta EE in practice.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The results show continued growth and confidence in Jakarta EE across the ecosystem. Notably, even before the full platform release was finalised, &lt;/span&gt;&lt;strong&gt;18 percent of respondents were already using Jakarta EE 11&lt;/strong&gt;&lt;span&gt;, a strong signal of interest and early adoption. &lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;These insights help us better understand where the community is focusing its energy, from modernising applications and adopting newer Java versions to evaluating cloud strategies and driving specification innovation. We're grateful to everyone who participated and shared their views.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://outreach.eclipse.foundation/2025-jakarta-ee-developer-survey-report&quot;&gt;&lt;span&gt;Explore the 2025 developer survey findings&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Learning and contributing: A growing developer ecosystem&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The &lt;/span&gt;&lt;strong&gt;Jakarta EE &lt;/strong&gt;&lt;a href=&quot;https://jakarta.ee/learn/&quot;&gt;&lt;strong&gt;Learn&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; page expanded its resources to better support developers at all levels. As part of our broader effort to support community growth, we also introduced a new&lt;/span&gt;&lt;a href=&quot;https://jakarta.ee/contribute/&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;Contribute&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; page, a dedicated space that outlines how individuals and organisations can get involved with Jakarta EE.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The Contribute page highlights the many ways to participate, from writing code and improving documentation to joining specification discussions or helping with community outreach. It also explains why contributing matters, what contributors gain, and how to get started.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;To further support newcomers, we launched the&lt;/span&gt;&lt;a href=&quot;https://jakarta.ee/mentorship/&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;Jakarta EE Mentorship Program&lt;/strong&gt;&lt;/a&gt;&lt;span&gt;, which pairs new contributors with experienced community mentors who can provide guidance, answer questions, and help them navigate the contribution process. Whether you're new to open source or simply new to Jakarta EE, the mentorship experience helps build skills, confidence, and deeper community connections.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Looking ahead: A refreshed web presence&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Throughout 2025, our marketing team in collaboration with the Jakarta EE Marketing Committee worked on a major &lt;/span&gt;&lt;strong&gt;Jakarta EE website refresh&lt;/strong&gt;&lt;span&gt; to better reflect the clarity, maturity, and momentum of the community. While the full launch is now scheduled for early January, the homepage and navigation redesign is already complete and ready for rollout. The updated site features a bold new homepage, improved navigation through streamlined mega menus, and a new “Why Jakarta EE” section that helps visitors quickly understand the platform’s value.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;This is just the beginning. Additional updates and structural improvements will continue rolling out through 2026, with a focus on enhancing messaging, navigation, and the overall user experience. &lt;/span&gt;&lt;strong&gt;Stay tuned for the official launch and more updates in the months ahead.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Global presence: virtual events, conferences, and community connections&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Jakarta EE had a visible and impactful presence at &lt;/span&gt;&lt;strong&gt;face-to-face (F2F) conferences&lt;/strong&gt;&lt;span&gt; around the world, especially in the first half of the year. From Devnexus to JCON and beyond, Jakarta EE working group and community members presented talks, engaged with attendees at our sponsored booths, and built valuable relationships.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;In 2025, &lt;/span&gt;&lt;strong&gt;JakartaOne Livestreams&lt;/strong&gt;&lt;span&gt; continued to grow with successful regional events in &lt;/span&gt;&lt;a href=&quot;https://jakartaone.jakarta.ee/2025/chinese/&quot;&gt;&lt;strong&gt;China&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; and the &lt;/span&gt;&lt;a href=&quot;https://jakartaone.jakarta.ee/2025/&quot;&gt;&lt;strong&gt;annual JakartaOne Livestream&lt;/strong&gt;&lt;/a&gt;&lt;span&gt;, which attracted &lt;/span&gt;&lt;strong&gt;more than 6,000&lt;/strong&gt;&lt;span&gt; viewers globally, with over &lt;/span&gt;&lt;strong&gt;3,200 participants&lt;/strong&gt;&lt;span&gt;. With 20+ sessions, 15+ speakers, and 14+ hours of multilingual content, the JakartaOne Livestream series continued to drive strong community engagement across regions. &lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=i_ySMofF7-Q&amp;amp;list=PLutlXcN4EAwBPzlX9TjPriUbgkTOUQhKk&quot;&gt;&lt;span&gt;Chinese JakartaOne Livestream recordings&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, as well as the annual JakartaOne Livestream&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/live/KoUFAk3zMtI&quot;&gt;&lt;span&gt; recording&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, are available on our YouTube channel for anyone interested. &lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;JakartaOne F2F Meetups further expanded the program’s regional footprint, with events in &lt;/span&gt;&lt;a href=&quot;https://jakartaone.jakarta.ee/2025/china/&quot;&gt;&lt;strong&gt;China&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; and &lt;/strong&gt;&lt;a href=&quot;https://jakartaone.jakarta.ee/2025/japan/&quot;&gt;&lt;strong&gt;Japan&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; drawing &lt;/span&gt;&lt;strong&gt;170+ registered participants&lt;/strong&gt;&lt;span&gt; and &lt;/span&gt;&lt;strong&gt;100+ in-person attendees&lt;/strong&gt;&lt;span&gt;, supported by high community approval and strong local participation.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;With &lt;/span&gt;&lt;strong&gt;17 Jakarta EE Tech Talks&lt;/strong&gt;&lt;span&gt; delivered in 2025, the program remains a vital channel for community learning, collaboration, and inspiration. Topics ranged from microservices and containers to security and observability. Recordings of these sessions are available on our &lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mifXDwk1IRA&amp;amp;list=PLutlXcN4EAwC64sgFLJSWAgQJvVo6T4Dh&quot;&gt;&lt;span&gt;YouTube channel&lt;/span&gt;&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Looking forward to 2026 and beyond&lt;/strong&gt;&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;As we conclude an impactful 2025, it’s clear that Jakarta EE continues to strengthen its role as the open, vendor-neutral foundation for modern enterprise Java. The progress we’ve made this year, from delivering Jakarta EE 11 and introducing new specifications like Jakarta Agentic AI, to expanding our global events and deepening community engagement, reflects the dedication, collaboration, and passion of everyone involved.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;2026 promises to be another exciting year of innovation and growth.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Thank you to all members, contributors, committers, and the wider community for your continued support. Together, we’re driving the platform forward and building a vibrant, open, and innovative ecosystem.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Here’s to another year of progress, collaboration, and innovation with Jakarta EE.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
      
&lt;span&gt;&lt;span&gt;Tatjana Obradovic&lt;/span&gt;&lt;/span&gt;

&lt;span&gt;&lt;time datetime=&quot;2025-12-18T09:07:09-05:00&quot; title=&quot;Thursday, December 18, 2025 - 09:07&quot;&gt;Thu, 2025-12-18 09:07&lt;/time&gt;
&lt;/span&gt;</description>
	<pubDate>Thu, 18 Dec 2025 14:07:09 +0000</pubDate>
</item>
<item>
	<title>Víctor Orozco: Book Review: Kotlin for Java Developers</title>
	<guid isPermaLink="false">blog/2025/2025-12-11-Book-review-Kotlin-Java-Developers.html</guid>
	<link>https://www.vorozco.com/blog/2025/2025-12-11-Book-review-Kotlin-Java-Developers.html</link>
	<description>&lt;p&gt;&lt;img alt=&quot;Kotlin for Java Developers&quot; src=&quot;https://feeds.feedburner.com/images/posts/kotlin-book/kotlin-book-cover.png&quot; title=&quot;Kotlin for Java Developers&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;General information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pages: 414&lt;/li&gt;
&lt;li&gt;Published by: Packt&lt;/li&gt;
&lt;li&gt;Release date: October 2025&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Disclaimer: I received this book as part of a collaboration with Packt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Essentially, this is a book that uses a &quot;problem-reasoning-solution&quot; approach to present the building blocks that make Kotlin interesting and different from Java. Hence, it isn't:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kotlin reference book (i.e., it does not provide deep technical documentation)&lt;/li&gt;
&lt;li&gt;A book for learning how to program from scratch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In my opinion, it delivers what it promises.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;About the book and how I read it&lt;/h2&gt;
&lt;p&gt;I work with both Java and Kotlin professionally. However, as a technical trainer I'm always looking for educational resources that can boost students' knowledge, either as a main reference or as a complementary resource. I think this book fits the latter category.&lt;/p&gt;
&lt;p&gt;Right from the cover, the book states its value proposition:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Confidently transition from Java to Kotlin through hands-on examples and idiomatic Kotlin practices&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I believe it achieves that, although at least in the first two chapters the writing style can make the book somewhat hard to read.&lt;/p&gt;
&lt;h2&gt;A rocket that takes time to launch but can reach Mars&lt;/h2&gt;
&lt;p&gt;The book is divided into four sections:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Getting started with Kotlin&lt;/li&gt;
&lt;li&gt;Object-Oriented Programming&lt;/li&gt;
&lt;li&gt;Functional Programming&lt;/li&gt;
&lt;li&gt;Coroutines, Testing and DSLs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My least favorite section was the first, especially the first two chapters. The first chapter tries to give an overview of Kotlin versus Java, but it is too superficial and perhaps even unnecessary. I imagine the goal of this chapter is to spark interest in Kotlin, but it also anticipates that everything will be covered in more detail later. Personally, I almost skipped this chapter because I knew I would see the topics in more depth later. I suppose that's a matter of taste.&lt;/p&gt;
&lt;p&gt;Then, the second chapter sketches out Maven and Gradle without going in depth, which felt redundant since the book is targeted at Java developers. I expected more detail in this section about which plugins are used in the build process, how they interact with Maven lifecycles, and other specific topics. But the book delegates this responsibility to the IDE wizard and that's it.&lt;/p&gt;
&lt;p&gt;From chapter three onward something magical happens. The book finally launches and its value proposition starts to materialize. Starting in chapter three the writing style changes and consistently presents concept by concept. Almost every chapter is structured like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A common problem is discussed, often respectfully from a Java perspective&lt;/li&gt;
&lt;li&gt;The Kotlin design decision is presented and how it aims to improve the problem&lt;/li&gt;
&lt;li&gt;A concise, self-contained Kotlin snippet explains the programming concept&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last part is what gives the book its value. Studying a programming language — especially when you already know how to program — is a different process than learning to program for the first time. This book recognizes that and discusses Kotlin's value propositions in technical terms, presenting self-contained snippets that readers can try in their IDE or download from the book's official repository.&lt;/p&gt;
&lt;p&gt;If I were to use a rocket analogy, imagine that the following chapters are like Apollo 11 in full ascent from Cape Canaveral.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part I&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Null and non-nullable types&lt;/li&gt;
&lt;li&gt;Extension Functions and the apply function&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part II&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object-Oriented programming basics&lt;/li&gt;
&lt;li&gt;Generics and variance&lt;/li&gt;
&lt;li&gt;Data and sealed classes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because this is not a reference book or official documentation, up to this point the book presents each concept well without diving into corner cases — which is fine. With practice, the book can be completed in about a week and provides a solid foundation for moving to the next level, whether that's Android development or Kotlin backend programming.&lt;/p&gt;
&lt;p&gt;From Part III there is a noticeable shift: we leave the Java-centric atmosphere and enter idiomatic Kotlin territory. Java-only developers will likely notice this change, as we move into structures that are often too abstract to have direct equivalents in Java, including:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part III&lt;/strong&gt; - All this in the &quot;Kotlin way&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basics of functional programming&lt;/li&gt;
&lt;li&gt;Lambdas&lt;/li&gt;
&lt;li&gt;Collections and sequences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Part IV&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coroutines&lt;/li&gt;
&lt;li&gt;Synchronous and asynchronous programming&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, once we're in orbit the book presents two topics that are useful for day-to-day development but are not strictly part of the language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kotlin testing&lt;/li&gt;
&lt;li&gt;Domain-specific languages (DSLs)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Things that could be improved&lt;/h2&gt;
&lt;p&gt;As with any review, this is the most difficult section to write. Besides the first two chapters, I noticed a few things that could cause confusion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The null safety chapter omits any mention of Java's &lt;code&gt;Optional&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The coroutines section briefly mentions Virtual Threads but then presents Loom as a separate effort and likens it to Quasar (a library ecosystem). In reality, Virtual Threads are part of Project Loom&lt;/li&gt;
&lt;li&gt;The book inconsistently presents different JDK recommendations across chapters; sometimes it suggests Corretto while other times it simply suggests OpenJDK&lt;/li&gt;
&lt;li&gt;Also on the JVM side, most of the time it suggests Java 17. I imagine this was related to the time of writing. I can say that all samples worked just fine on Java 25 (the latest LTS at the time of this review), so you should be fine using that or Java 21 (officially supported by Kotlin compiler).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Most of these are not deal-breakers, this is still an enyojable book.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Who should read this book?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Java developers exploring the Kotlin ecosystem, those interested in Android development, or developers considering switching to Kotlin as their primary language&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Alexius Diakogiannis: The Darkside of AI: Risks and Realities – Talk at Voxxed Days Luxembourg 2025</title>
	<guid isPermaLink="false">https://jee.gr/?p=995</guid>
	<link>https://jee.gr/the-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025</link>
	<description>&lt;p&gt;&lt;a class=&quot;a2a_button_printfriendly&quot; href=&quot;https://www.addtoany.com/add_to/printfriendly?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;PrintFriendly&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_facebook&quot; href=&quot;https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_twitter&quot; href=&quot;https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_email&quot; href=&quot;https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Email&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_linkedin&quot; href=&quot;https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;LinkedIn&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_hacker_news&quot; href=&quot;https://www.addtoany.com/add_to/hacker_news?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Hacker News&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_dd addtoany_share_save addtoany_share&quot; href=&quot;https://www.addtoany.com/share#url=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;title=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’m excited to share the video recording of my talk, &lt;b&gt;“The Darkside of AI: Risks and Realities,”&lt;/b&gt; presented at &lt;b&gt;Voxxed Days Luxembourg 2025!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The rapid acceleration of Artificial Intelligence is transforming every aspect of our lives, from how we work and communicate to how we make critical decisions. While the headlines are often filled with the amazing potential and groundbreaking advancements, itâ€™s crucial to pause and critically examine the inherent risks and complexities that come with such powerful technology.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Speaker:&lt;/b&gt; Alexius Dionysius Diakogiannis &lt;b&gt;Event:&lt;/b&gt; Voxxed Days Luxembourg 2025 &lt;b&gt;Room:&lt;/b&gt; AmigaOS&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;What the Talk Covers&lt;/h2&gt;
&lt;p&gt;This session went beyond the hype to explore the challenging realities that AI introduces. During the talk, we dove deep into several critical areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Bias and Fairness:&lt;/b&gt; How inherited biases in training data can lead to discriminatory and unfair outcomes, perpetuating societal inequalities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;The Ethics of Autonomy:&lt;/b&gt; The difficult questions surrounding liability and control as AI systems become more autonomous, especially in high-stakes fields like medicine and transportation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Security Vulnerabilities:&lt;/b&gt; Exploring new attack vectors, such as &lt;b&gt;adversarial examples&lt;/b&gt;, that can subtly trick AI models, and the risk of AI-driven misinformation campaigns (deepfakes).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;b&gt;Socio-economic Disruption:&lt;/b&gt; Analyzing the impact of mass automation on the job market and the imperative for proactive reskilling and policy-making.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class=&quot;a2a_button_printfriendly&quot; href=&quot;https://www.addtoany.com/add_to/printfriendly?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;PrintFriendly&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_facebook&quot; href=&quot;https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Facebook&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_twitter&quot; href=&quot;https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Twitter&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_email&quot; href=&quot;https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Email&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_linkedin&quot; href=&quot;https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;LinkedIn&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_button_hacker_news&quot; href=&quot;https://www.addtoany.com/add_to/hacker_news?linkurl=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;linkname=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot; rel=&quot;nofollow noopener&quot; target=&quot;_blank&quot; title=&quot;Hacker News&quot;&gt;&lt;/a&gt;&lt;a class=&quot;a2a_dd addtoany_share_save addtoany_share&quot; href=&quot;https://www.addtoany.com/share#url=https%3A%2F%2Fjee.gr%2Fthe-darkside-of-ai-risks-and-realities-talk-at-voxxed-days-luxembourg-2025%2F&amp;amp;title=The%20Darkside%20of%20AI%3A%20Risks%20and%20Realities%20%E2%80%93%20Talk%20at%20Voxxed%20Days%20Luxembourg%202025&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 01 Dec 2025 13:11:49 +0000</pubDate>
</item>
<item>
	<title>Thorben Janssen: AI Glossary for Java Developers</title>
	<guid isPermaLink="false">https://thorben-janssen.com/?p=43357</guid>
	<link>https://thorben-janssen.com/ai-glossary-for-java-developers/</link>
	<description>&lt;p&gt;The post &lt;a href=&quot;https://thorben-janssen.com/ai-glossary-for-java-developers/&quot; rel=&quot;nofollow&quot;&gt;AI Glossary for Java Developers&lt;/a&gt; appeared first on &lt;a href=&quot;https://thorben-janssen.com&quot; rel=&quot;nofollow&quot;&gt;Thorben Janssen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;AI introduces many new terms, acronyms, and techniques you must understand to build a good AI-based system. That makes it hard for many Java developers to learn how to integrate AI into their applications using SpringAI, Langchain4J, or some other library. I ran into the same issue when I started learning about AI. In this...&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://thorben-janssen.com/ai-glossary-for-java-developers/&quot; rel=&quot;nofollow&quot;&gt;AI Glossary for Java Developers&lt;/a&gt; appeared first on &lt;a href=&quot;https://thorben-janssen.com&quot; rel=&quot;nofollow&quot;&gt;Thorben Janssen&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 27 Nov 2025 13:36:58 +0000</pubDate>
</item>
<item>
	<title>Thorben Janssen: Offset and Keyset Pagination with Spring Data JPA</title>
	<guid isPermaLink="false">https://thorben-janssen.com/?p=45224</guid>
	<link>https://thorben-janssen.com/offset-and-keyset-pagination-with-spring-data-jpa/</link>
	<description>&lt;p&gt;The post &lt;a href=&quot;https://thorben-janssen.com/offset-and-keyset-pagination-with-spring-data-jpa/&quot; rel=&quot;nofollow&quot;&gt;Offset and Keyset Pagination with Spring Data JPA&lt;/a&gt; appeared first on &lt;a href=&quot;https://thorben-janssen.com&quot; rel=&quot;nofollow&quot;&gt;Thorben Janssen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pagination is a common and easy approach to ensure that huge result sets don’t slow down your application. The idea is simple. Instead of fetching the entire result set, you only fetch the subset you want to show in the UI or process in your business code. When doing that, you can choose between 2...&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://thorben-janssen.com/offset-and-keyset-pagination-with-spring-data-jpa/&quot; rel=&quot;nofollow&quot;&gt;Offset and Keyset Pagination with Spring Data JPA&lt;/a&gt; appeared first on &lt;a href=&quot;https://thorben-janssen.com&quot; rel=&quot;nofollow&quot;&gt;Thorben Janssen&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 26 Nov 2025 13:20:14 +0000</pubDate>
</item>
<item>
	<title>Webtide Blog: End of Life: Changes to Eclipse Jetty and CometD</title>
	<guid isPermaLink="false">https://webtide.com/?p=5633</guid>
	<link>https://webtide.com/end-of-life-changes-to-eclipse-jetty-and-cometd/</link>
	<description>&lt;p&gt;Webtide (https://webtide.com) is the company behind the open-source Jetty and CometD projects. Since 2006, Webtide has fully funded the Jetty and CometD projects through services and support, including migration assistance, production support, developer assistance, and CVE resolution. &lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;First, the change.&lt;/h2&gt;



&lt;p&gt;Starting January 1, 2026, Webtide will no longer publish releases for Jetty 9, Jetty 10, and Jetty 11, as well as CometD 5, 6, and 7 to Maven Central or other public repositories. &lt;/p&gt;



&lt;p&gt;Take a look at the &lt;a href=&quot;https://github.com/jetty/jetty.project/issues/13918&quot;&gt;primary announcement&lt;/a&gt; if you’re interested. &lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;So, the motivation.&lt;/h2&gt;



&lt;p&gt;Why we are in this situation now harks back to the beginnings of Webtide. Briefly, Greg Wilkins founded the Jetty project in 1995 as part of a contest created by Sun Microsystems for a new language called Java. For a decade, he and Jan Bartel carefully stewarded the project as part of their consulting company Mort Bay Consulting. Around the Jetty 6 timeframe, in 2006, Webtide was founded as an LLC to evolve the project further commercially. Still, at its core, the goal was to support the incredible community that had developed over the years. When I joined in 2007, we began working to join the Eclipse Foundation. We took steps to formalize our development processes, aiming to add more commercial predictability to the open-source project. Joining the Eclipse Foundation also meant adhering to their rigorous IP policy for both the Jetty codebase and its dependencies, an essential step in improving corporate uptake.&lt;/p&gt;



&lt;p&gt;This was also the time for the project to handle the end-of-life process for Jetty 6, while establishing Jetty 7 and Jetty 8. This was the opportunity that Webtide needed to support the project’s development by offering commercial services and support for EOL Jetty 6, while focusing on supporting and funding the future of Jetty 7 and Jetty 8. &lt;/p&gt;



&lt;p&gt;It was the crux; after careful consideration, we decided that all commercial support releases would be open-source for the benefit of all. While not a traditional business decision, it aligned with our values and dedication to the community, which was rewarded as the community continued to grow its usage of Jetty.&lt;/p&gt;



&lt;p&gt;This worked wonderfully for almost 20 years. &lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Something shifted…&lt;/h2&gt;



&lt;p&gt;We started to notice a shift in the community a few years ago. For almost 20 years, the companies we spoke with valued how our support could help them become more successful, with many ultimately becoming customers who truly understood the benefits of supporting open-source. Every single one of them saw the value in releasing EOL releases freely. When I became CEO a decade ago and Webtide became 100% developer-owned and operated, we were able to continue operating in this commercial environment with ease, to such an extent that the future of Webtide and the Jetty project is assured for many years to come. &lt;/p&gt;



&lt;p&gt;So what changed? The tone of many companies we spoke to. Increasingly, while explaining the model that served Webtide well for so many years, where I used to hear ‘That makes so much sense, this works great!’, I now hear “So it’s just free? Great, I need to check a box.” Followed up with the galling question “Could you put this policy of yours in writing on your company letterhead?”.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;And today?&lt;/h2&gt;



&lt;p&gt;Twenty years ago, things were different; Maven 2 dominance was emerging, and Maven Central was gaining ubiquity. Managing transitive dependencies was novel in many circles. Managing CVEs in a corporate setting was in its infancy, particularly with Java developer software stacks. &lt;/p&gt;



&lt;p&gt;Now, build tooling is diverse, Maven Central is a global central repository system, and corporations should have their own caching repository servers, &lt;a href=&quot;https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/&quot;&gt;or they really should&lt;/a&gt;! Even JavaEE was rebranded as Jakarta at the Eclipse Foundation. So much change, but the one I’ll highlight is the emergence of business units focused on corporate software policies, complete with BOM files containing ever more metadata and checkboxes to click, managing CVE risks associated with software developed internally. Developers, the primary people Webtide has interacted with over the years, are increasingly far removed from software maintenance activities. &lt;/p&gt;



&lt;p&gt;Now our approach to endlessly updating EOL releases seems remarkably outdated. Look at Jetty 9, which we have been releasing since 2013. It turns out our approach of making things as easy as possible for the community, for software that should have officially gone EOL years ago, was a benefit to many, but also enabled far more to grow complacent. Instead of scheduling migrations and updating to more recent versions, we inadvertently provided an environment that allowed companies to deploy onto software well over a decade old, when newer, more performant options were readily available. Then, when security postures started changing and businesses began looking deeper into their dependencies, they realized they were using outdated software, three or more major versions behind. Then, to our shock, many are perfectly fine with that so long as it is free and someone tells them it is ok. &lt;/p&gt;



&lt;p&gt;If we have learned one thing within this time, it is that the EOL policy needs to be so much clearer, using established industry terminology. Looking back, we have been guilty of inventing terminology and inadvertently exacerbating the situation.&lt;/p&gt;



&lt;p&gt;What is heartening is seeing other organizations work to address EOL as well; notably, MITRE has been developing changes to the CVE system to support EOL concepts fully. If you have ever seen the text “&lt;a href=&quot;https://github.com/advisories?query=Unsupported+When+Assigned&quot;&gt;Unsupported When Assigned&lt;/a&gt;” in a CVE, then you have encountered the early efforts for EOL in a CVE.&lt;/p&gt;



&lt;p&gt;You have to applaud the efforts of businesses to prioritize security and sane open-source policies.&lt;/p&gt;



&lt;p&gt;However, this is also a call to open-source projects like Jetty, as we are operating in a different world. Everyone understands that ‘End-of-Life’ does not mean ‘End-of-Use’. Clearly, the system for many companies has changed from a Developer Support perspective to a Security Support perspective. EOL Software support is purchased differently now. There are companies, like Sonar (formerly Tidelift), that exist to manage security metadata about open-source software, enabling companies to manage their software risk more effectively. &lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;EOL Jetty and CometD by Webtide&lt;/h2&gt;



&lt;p&gt;To address this industry evolution, Webtide has launched a partnership program that enables businesses relying on EOL Jetty and CometD versions to obtain CVE resolutions officially and predictably. &lt;/p&gt;



&lt;p&gt;Webtide continues to resolve CVEs and issues for EOL Jetty and CometD in support of our commercial customers. However, the resulting binaries are now distributed directly to our commercial support customers and through our partnership network. No longer are we calling software EOL but deploying to Maven Central with a nod and a wink.&lt;/p&gt;



&lt;p&gt;Our partners are established leaders in the open-source EOL landscape, creating products that directly address the problems the security and business industries are facing. &lt;/p&gt;



&lt;p&gt;This synergy works perfectly with Webtide, as we are the company that offers services and support on Jetty and CometD. Migrations, developer assistance, production support, and performance are the things that directly influence the ongoing development of the open-source projects we steward. We can continue to focus on our strengths, and our partners can focus on theirs.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;At last, the partners!&lt;/h2&gt;



&lt;p&gt;We are pleased to announce two partnerships. With these partners, you will be able to build a secure EOL solution for your software stack, not just for your usage of Jetty or CometD. Best yet, if you are interested in Webtide’s Lifecycle Support, you can use these partner versions in conjunction with our support!&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-5634&quot; height=&quot;69&quot; src=&quot;https://webtide.com/wp-content/uploads/2025/11/image.png&quot; width=&quot;300&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;TuxCare secures the open-source software the world builds on. Today, we protect over 1.2 million workloads – keeping them secure, compliant, and unstoppable at scale. From operating systems to development libraries and production applications, we power your open-source stack with enterprise-grade security and support, including endless lifecycle extensions for out-of-support software versions, rebootless patching for every major Linux distribution, enterprise-optimized support for community Linux, and our Linux-first vulnerability scanner that cuts through the noise.&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://tuxcare.com/endless-lifecycle-support/jetty-eol-support/&quot;&gt;ELS for Jetty&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://tuxcare.com/endless-lifecycle-support/cometd-eol-support/&quot;&gt;ELS for CometD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-5635&quot; height=&quot;71&quot; src=&quot;https://webtide.com/wp-content/uploads/2025/11/image-1.png&quot; width=&quot;300&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;HeroDevs provides secure, long-term maintenance for open-source frameworks that have reached End-of-Life. Through our Never-Ending Support (NES) initiative, we deliver continuous CVE remediation and compliance-grade updates, allowing your team to migrate at your own pace. Our engineers monitor upstream changes, backport verified fixes, and publish fully tested binaries for seamless drop-in replacement. With NES for Jetty and NES for CometD, you can stay secure, stable, and compliant—without refactoring or rushing a migration.&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.herodevs.com/support/nes-for-jetty&quot;&gt;NES for Jetty&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://www.herodevs.com/support/nes-for-cometd&quot;&gt;NES for CometD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;If your business is interested in our partner program, please direct inquiries to &lt;a href=&quot;mailto:partnership@webtide.com&quot;&gt;partnership@webtide.com&lt;/a&gt;.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Wrapping it up.&lt;/h2&gt;



&lt;p&gt;One important thing to note is that Webtide will continue to support the Jetty Project with a standard open-source release process, ensuring that older versions are released to provide the community with ample time to update to newer versions through a transition period. When Jetty 13 is released, Jetty 12.1 will continue to receive updates for a period, just as Jetty 12.0 does currently. If that is six months or a year, it remains to be seen. Once we finalize this release strategy with timelines, we will make sure the community is well-informed.&lt;/p&gt;



&lt;p&gt;Fundamentally, the change coming is that the End of Life versions for Jetty and CometD will no longer be an empty EOL notice and quiet deployments to Maven Central. It will mean EOL and provide established industry solutions to address those who need additional support.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 06 Nov 2025 15:36:17 +0000</pubDate>
</item>
<item>
	<title>Tanja Obradovic: Key Highlights from the 2025 Jakarta EE Developer Survey Report</title>
	<guid isPermaLink="false">8517 at https://blogs.eclipse.org</guid>
	<link>https://blogs.eclipse.org/post/tatjana-obradovic/key-highlights-2025-jakarta-ee-developer-survey-report</link>
	<description>&lt;span&gt;Key Highlights from the 2025 Jakarta EE Developer Survey Report&lt;/span&gt;

            &lt;div class=&quot;field field--name-body field--type-text-with-summary field--label-hidden field--item&quot;&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The results are in! &lt;/span&gt;&lt;a href=&quot;https://outreach.eclipse.foundation/2025-jakarta-ee-developer-survey-report&quot;&gt;&lt;strong&gt;The State of Enterprise Java:&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;2025 Jakarta EE Developer Survey Report&lt;/strong&gt;&lt;/a&gt;&lt;span&gt; has just been released, offering the industry’s most comprehensive look at the state of enterprise Java. Now in its eighth year, the report captures the perspectives of more than 1700 developers, architects, and decision-makers, a 20% increase in participation compared to 2024.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The survey results give us insight into Jakarta EE’s role as the leading framework for building modern, cloud native Java applications. With the release of &lt;/span&gt;&lt;strong&gt;Jakarta EE 11&lt;/strong&gt;&lt;span&gt;, the community’s commitment to modernisation is clear, and adoption trends confirm its central role in shaping the future of enterprise Java. Here are a few of the major findings from this year’s report: &lt;/span&gt;&lt;/p&gt;&lt;h3 dir=&quot;ltr&quot;&gt;Jakarta EE Adoption Surpasses Spring&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;For the first time, more developers reported using &lt;/span&gt;&lt;strong&gt;Jakarta EE (58%) than Spring (56%)&lt;/strong&gt;&lt;span&gt;. This clearly indicates growing awareness that &lt;/span&gt;&lt;strong&gt;Jakarta EE provides the foundation for popular frameworks like Spring&lt;/strong&gt;&lt;span&gt;. This milestone underscores Jakarta EE’s momentum and the community’s confidence in its role as the foundation for enterprise Java in the cloud era. &lt;/span&gt;&lt;/p&gt;&lt;h3&gt;Rapid Uptake of Jakarta EE 11&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Released earlier this year, &lt;/span&gt;&lt;strong&gt;Jakarta EE 11 has already been adopted by 18% of respondents&lt;/strong&gt;&lt;span&gt;. Thanks to its staged release model, with Core and Web Profiles first, followed by the full platform release, developers are migrating faster than ever from older versions.&lt;/span&gt;&lt;/p&gt;&lt;h3 dir=&quot;ltr&quot;&gt;Shifts in Java SE Versions&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The community continues to embrace newer Java versions. &lt;/span&gt;&lt;strong&gt;Java 21 adoption leapt to 43%&lt;/strong&gt;&lt;span&gt;, up from 30% in 2024, while older versions like Java 8 and 17 declined. Interestingly, &lt;/span&gt;&lt;strong&gt;Java 11 showed a rebound at 37%&lt;/strong&gt;&lt;span&gt;, signaling that organisations continue to balance modernisation with stability.&lt;/span&gt;&lt;/p&gt;&lt;h3 dir=&quot;ltr&quot;&gt;Cloud Migration Strategies Evolve&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;While &lt;/span&gt;&lt;strong&gt;lift-and-shift (22%)&lt;/strong&gt;&lt;span&gt; remains the dominant approach, developers are increasingly exploring modernisation paths. Strategies include gradual migration with microservices (14%), modernising apps to leverage cloud-native features (14%), and full cloud-native builds (14%). At the same time, &lt;/span&gt;&lt;strong&gt;20% remain uncertain&lt;/strong&gt;&lt;span&gt;, highlighting a need for clear guidance in this complex journey.&lt;/span&gt;&lt;/p&gt;&lt;h3 dir=&quot;ltr&quot;&gt;Community Priorities&lt;/h3&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;Survey respondents reaffirmed priorities around &lt;/span&gt;&lt;strong&gt;cloud native readiness and faster specification adoption&lt;/strong&gt;&lt;span&gt;, while also emphasising innovation and strong alignment with Java SE.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;Why This Matters&lt;/h2&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;These findings highlight not only Jakarta EE’s accelerating momentum but also the vibrant role the community plays in steering its evolution. With enterprise Java powering mission-critical systems across industries, the insights from this survey provide a roadmap for organisations modernising their applications in an increasingly cloud native world.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;A Call to the Community&lt;/h2&gt;&lt;p dir=&quot;ltr&quot;&gt;&lt;span&gt;The Jakarta EE Developer Survey continues to serve as a vital barometer of the ecosystem. With the Jakarta EE Working Group hard at work on the &lt;/span&gt;&lt;a href=&quot;https://jakarta.ee/specifications/platform/12/&quot;&gt;&lt;span&gt;next release&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, including innovative features, there’s never been a better time to get involved. Whether you’re a developer, architect, or enterprise decision-maker, now is the perfect time to get involved:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://outreach.eclipse.foundation/2025-jakarta-ee-developer-survey-report&quot;&gt;&lt;strong&gt;Explore the full report&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt; &lt;/li&gt;&lt;li dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://jakarta.ee/membership/&quot;&gt;&lt;strong&gt;Join the Jakarta EE Working Group&lt;/strong&gt;&lt;/a&gt;&lt;span&gt;: Shape the platform’s future while engaging directly with the community.&lt;/span&gt;&lt;br /&gt; &lt;/li&gt;&lt;li dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://jakarta.ee/community/get-involved/&quot;&gt;&lt;strong&gt;Contribute&lt;/strong&gt;&lt;/a&gt;&lt;span&gt;: Your feedback, participation, and innovations help Jakarta EE evolve faster.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span&gt;With the Jakarta EE Working Group already preparing for the next release, including new cloud native capabilities, the momentum is undeniable. Together, we are building the future of enterprise Java.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
      
&lt;span&gt;&lt;span&gt;Tatjana Obradovic&lt;/span&gt;&lt;/span&gt;

&lt;span&gt;&lt;time datetime=&quot;2025-10-01T10:09:59-04:00&quot; title=&quot;Wednesday, October 1, 2025 - 10:09&quot;&gt;Wed, 2025-10-01 10:09&lt;/time&gt;
&lt;/span&gt;</description>
	<pubDate>Wed, 01 Oct 2025 14:09:59 +0000</pubDate>
</item>
<item>
	<title>Mads Opheim: Switching blog engine</title>
	<guid isPermaLink="true">https://madsopheim.com/blog/2025-06-03-rewriting-the-blog</guid>
	<link>https://madsopheim.com/blog/2025-06-03-rewriting-the-blog</link>
	<description>I recently realized that the engine that used to run this blog wasn't updated since 2020</description>
	<pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Markus Karg: Foundation Laid for Faster Text I/O</title>
	<guid isPermaLink="false">http://headcrashing.wordpress.com/?p=1381</guid>
	<link>https://headcrashing.wordpress.com/2025/05/17/foundation-laid-for-faster-text-i-o/</link>
	<description>&lt;p&gt;&lt;strong&gt;Hey guys! How’s it going?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Another six months are over and you might wonder what the old shaggy prepared this time? &lt;img alt=&quot;ðŸ¤”&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f914.png&quot; style=&quot;height: 1em;&quot; /&gt; No wonder, it certainly is another OpenJDK contribution! &lt;img alt=&quot;ðŸ¤©&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f929.png&quot; style=&quot;height: 1em;&quot; /&gt; This time, it speeds up reading from &lt;code&gt;CharSequence&lt;/code&gt;, and it will allow faster &lt;code&gt;Write::append&lt;/code&gt;. &lt;img alt=&quot;ðŸ‘�&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f44d.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;Never heard of &lt;code&gt;CharSequence&lt;/code&gt;? Well, it’s &lt;em&gt;the common interface&lt;/em&gt; of &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;StringBuilder&lt;/code&gt;, &lt;code&gt;CharBuffer&lt;/code&gt;, and quite some custom classes out there. But wait! There are other text classes than &lt;code&gt;String&lt;/code&gt;? &lt;img alt=&quot;ðŸ˜¯&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f62f.png&quot; style=&quot;height: 1em;&quot; /&gt; Maybe you never thought abot thatâ€¦ &lt;img alt=&quot;ðŸ¤¨&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f928.png&quot; style=&quot;height: 1em;&quot; /&gt; And why would you want to speed that up? Because a program &lt;strong&gt;never is fast enough&lt;/strong&gt;, but more urgently, because &lt;strong&gt;it reduces power consumption&lt;/strong&gt;! So, once more, we gain fun from faster apps, plus saving the climate. &lt;img alt=&quot;ðŸŒ´&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f334.png&quot; style=&quot;height: 1em;&quot; /&gt; Ain’t that great? So read on!&lt;/p&gt;



&lt;p&gt;So for long time, you did not think about what happens “under the hood” when you concatenated &lt;code&gt;String&lt;/code&gt;s, like &lt;code&gt;&quot;abc&quot; + &quot;def&quot;&lt;/code&gt;. But then someone came and told you &lt;strong&gt;not&lt;/strong&gt; to do “&lt;code&gt;+&lt;/code&gt;” but use &lt;code&gt;StringBuild::append&lt;/code&gt;, as that would be &lt;strong&gt;way faster&lt;/strong&gt; (which it was). And then someone else came and told you, that this is an urban legend, as &lt;code&gt;javac&lt;/code&gt; meanwhile does &lt;em&gt;exactly that&lt;/em&gt; for you (which it does). But in fact, what happens still is that (directly or indirectly) &lt;strong&gt;memory is allocated&lt;/strong&gt; which is the size of &lt;code&gt;&quot;abc&quot;&lt;/code&gt; plus the size of &lt;code&gt;&quot;def&quot;&lt;/code&gt; (even worse, it is not even stack memory but heap memory, but let’s put that aside for today). Actually, there is &lt;em&gt;even more&lt;/em&gt; work done: As &lt;code&gt;String&lt;/code&gt;s are &lt;em&gt;compressed &lt;/em&gt;internally, an &lt;strong&gt;compression algorithm&lt;/strong&gt; chimes in. And yes, &lt;em&gt;that&lt;/em&gt; needs time and memory, and energy, too. &lt;img alt=&quot;ðŸ˜“&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f613.png&quot; style=&quot;height: 1em;&quot; /&gt; Indeed there is even more going on internally, but more or less we could say: Concatinating &lt;code&gt;String&lt;/code&gt;s is effectively making a compressed copy, then throwing away both original values, even in the Java 25 age. And “throwing away” means, leaving behind holes in the linear memory space. So besides &lt;em&gt;pure&lt;/em&gt; Garbage Collection (“vacuuming”), we need memory defragmentation (“waste grinding”), which is another nice word for: moving &lt;em&gt;even more bytes&lt;/em&gt; around in memory. And that costs &lt;em&gt;even more&lt;/em&gt; time and power. And guess what: Your app concatenates &lt;code&gt;String&lt;/code&gt;s a lot, right? &lt;em&gt;And&lt;/em&gt; guess what: The Java Runtime (JRE) itself internally concatenates even more &lt;code&gt;String&lt;/code&gt;s! So copy, reallocate, compress, deallocate, GC, defrag all the time. But for what? For nothing! &lt;img alt=&quot;ðŸ˜”&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f614.png&quot; style=&quot;height: 1em;&quot; /&gt; Sigh.&lt;/p&gt;



&lt;p&gt;For nothing? Yes, for nothing. Because you could spare &lt;em&gt;a lot&lt;/em&gt; of that – when &lt;em&gt;further&lt;/em&gt; using &lt;code&gt;StringBuilder&lt;/code&gt; instead of &lt;code&gt;String&lt;/code&gt;. Ok, you know that since long time, so you do that, and so is &lt;code&gt;javac&lt;/code&gt; (it replaces &lt;code&gt;String+String&lt;/code&gt; by a &lt;code&gt;StringBuilder &lt;/code&gt;“under good conditions”), and so is the JRE itself. But here comes the bad news: In the end, you, just like &lt;code&gt;javac&lt;/code&gt;, just like the JRE itself, are calling &lt;code&gt;toString()&lt;/code&gt; eventually. Don’t you? You do! And that meansâ€¦ right: &lt;strong&gt;Pointless power consumption&lt;/strong&gt;, as &lt;code&gt;toString()&lt;/code&gt; produces &lt;em&gt;another &lt;/em&gt;temporary copy on the heap!&lt;/p&gt;



&lt;p&gt;So why not &lt;em&gt;omitting&lt;/em&gt; &lt;code&gt;toString()&lt;/code&gt;? Just directly pass around your &lt;code&gt;StringBuilder&lt;/code&gt; everywhere, instead of &lt;code&gt;toString&lt;/code&gt;()’ing it! This spares &lt;em&gt;lots &lt;/em&gt;of &lt;code&gt;toString()&lt;/code&gt;. (cheer) So all is fine now? Nope. (cheer stops). Once you want to &lt;strong&gt;output &lt;/strong&gt;your &lt;code&gt;StringBuilder&lt;/code&gt;, or once you want to input text &lt;em&gt;into&lt;/em&gt; a &lt;code&gt;StringBuilder&lt;/code&gt;, you’re facing a problem: Your surrounding frameworks &lt;em&gt;do not accept&lt;/em&gt; &lt;code&gt;StringBuilder&lt;/code&gt;! Typically these all work with &lt;code&gt;String&lt;/code&gt;, or, &lt;em&gt;like in the case we’re talking about today&lt;/em&gt; (to finally come to the copic of today’s posting), they do &lt;em&gt;accept &lt;/em&gt;&lt;code&gt;CharSequence &lt;/code&gt;– but they internally &lt;code&gt;toString()&lt;/code&gt; it. &lt;img alt=&quot;ðŸ˜’&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f612.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;/p&gt;



&lt;p&gt;For example: Java’s &lt;code&gt;Writer &lt;/code&gt;classes (you know, like good old &lt;code&gt;BufferedWriter&lt;/code&gt;, &lt;code&gt;PrintWriter&lt;/code&gt;, and all those) just &lt;em&gt;pretend &lt;/em&gt;to accept not only &lt;code&gt;Strings &lt;/code&gt;(like in &lt;code&gt;write(String)&lt;/code&gt;), but also &lt;em&gt;any other&lt;/em&gt; kind of &lt;code&gt;CharSequence&lt;/code&gt; (like in &lt;code&gt;append(myStringBuilder)&lt;/code&gt;). That looks &lt;em&gt;just as&lt;/em&gt; what we want to spare that &lt;code&gt;toString()&lt;/code&gt; &lt;strong&gt;heap clutter&lt;/strong&gt;. But wait! &lt;img alt=&quot;ðŸ«·&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1faf7.png&quot; style=&quot;height: 1em;&quot; /&gt; Take a look at the implementation firstâ€¦ it does… tada… &lt;code&gt;toString()&lt;/code&gt;! &lt;img alt=&quot;ðŸ¥³&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f973.png&quot; style=&quot;height: 1em;&quot; /&gt; So that nice trick that &lt;code&gt;javac&lt;/code&gt; internally uses a &lt;code&gt;StringBuilder&lt;/code&gt; to implement “&lt;code&gt;+&lt;/code&gt;” is good &lt;em&gt;for nothing&lt;/em&gt;, as &lt;em&gt;finally &lt;/em&gt;you end up with another time-squandering copy &lt;strong&gt;as soon as you output&lt;/strong&gt; the result. &lt;img alt=&quot;ðŸ˜­&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f62d.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;But stopy crying! I am here to help! &lt;img alt=&quot;ðŸ¦¸&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f9b8.png&quot; style=&quot;height: 1em;&quot; /&gt; The other day Oracle kindly adopted my latest OpenJDK contribution, and this finally &lt;em&gt;paves the way&lt;/em&gt; to fix these troubles. To understand my solution, let’s dive deeper into &lt;code&gt;Writer&lt;/code&gt;, and &lt;strong&gt;why &lt;/strong&gt;it does &lt;code&gt;toString()&lt;/code&gt; on any &lt;code&gt;CharSequence&lt;/code&gt; (even on &lt;code&gt;String&lt;/code&gt;s themselves). The cause is: Performance. Shocking! &lt;img alt=&quot;ðŸ«¢&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1fae2.png&quot; style=&quot;height: 1em;&quot; /&gt; If you copy text “char-by-char” this would be &lt;em&gt;totally slow&lt;/em&gt;, as computers can pass around &lt;em&gt;much larger&lt;/em&gt; clusters of information &lt;em&gt;with a single command&lt;/em&gt;. So what &lt;code&gt;Writer::write&lt;/code&gt; internally does is, it asks the &lt;code&gt;String&lt;/code&gt; to put all its characters &lt;strong&gt;into a char array&lt;/strong&gt; with &lt;em&gt;a single&lt;/em&gt; command (which ontop is lightning-fast &lt;em&gt;machine code&lt;/em&gt; &lt;img alt=&quot;âš¡&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/26a1.png&quot; style=&quot;height: 1em;&quot; /&gt;). That command is &lt;code&gt;String::getChars(int, int, char[], int)&lt;/code&gt;. So why doing that &lt;em&gt;only&lt;/em&gt; with Strings, but not with other &lt;code&gt;CharSequence&lt;/code&gt;s? Because &lt;code&gt;CharSequence&lt;/code&gt; &lt;em&gt;does not have&lt;/em&gt; that command. It’s as embarrasing as that! &lt;code&gt;CharSequence&lt;/code&gt; &lt;em&gt;only &lt;/em&gt;can be asked for &lt;strong&gt;one character at a time&lt;/strong&gt;, so you need &lt;em&gt;a loop in Java&lt;/em&gt; – which means, in 99% of you cases, an &lt;em&gt;interpreted&lt;/em&gt; loop (unless you do it 10.000 times to get it hot spotted eventually). And that is not just slow, it is even &lt;em&gt;super-slow&lt;/em&gt;! &lt;img alt=&quot;ðŸ�Œ&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f40c.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;So what I did is that I added that exact &lt;code&gt;getChars(int, int, char[], int)&lt;/code&gt; method signature that &lt;code&gt;String&lt;/code&gt; always had to the &lt;code&gt;CharSequence&lt;/code&gt; interface. Sounds easy, but took &lt;strong&gt;six months&lt;/strong&gt; of discussions and &lt;em&gt;a lot&lt;/em&gt; of convincing (for example, I had to proof that “not many” code exists on earth that already has such a method but that method does &lt;em&gt;something else&lt;/em&gt; – as that code would silently do &lt;em&gt;the wrong thing&lt;/em&gt; once executed on Java 25). This &lt;em&gt;foundational&lt;/em&gt; change &lt;strong&gt;is now found in Java 25&lt;/strong&gt;, and if you download a pre-release build, you can play with it right now – or already &lt;em&gt;prepare your application&lt;/em&gt; if it does a “char-by-char” loop or &lt;em&gt;temporary&lt;/em&gt; &lt;code&gt;toString()&lt;/code&gt; currently.&lt;/p&gt;



&lt;p&gt;So what about &lt;code&gt;Writer&lt;/code&gt;? I’m working on it. &lt;em&gt;Just today&lt;/em&gt; I filed the first of a set of pull requests towards getting this new method used in all &lt;code&gt;Writer&lt;/code&gt;s in OpenJDK. So while nothing will get faster “magically” in JDK 25, &lt;strong&gt;the foundation is laid&lt;/strong&gt;, and by the time, &lt;em&gt;eventually&lt;/em&gt; your code runs &lt;strong&gt;more efficient, without recompiling&lt;/strong&gt; it. So… stay tunedâ€¦! &lt;img alt=&quot;ðŸ˜…&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f605.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 17 May 2025 18:06:09 +0000</pubDate>
</item>
<item>
	<title>Dmitry Kornilov: Building AI Assistant Application in Java</title>
	<guid isPermaLink="false">http://dmitrykornilov.net/?p=3856</guid>
	<link>https://dmitrykornilov.net/2025/05/16/building-ai-assistant-application-in-java/</link>
	<description>&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3864&quot; height=&quot;682&quot; src=&quot;https://dmitrykornilov.net/wp-content/uploads/2025/05/chatgpt-image-may-16-2025-01_31_59-pm.png?w=1024&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;In my &lt;a href=&quot;https://dmitrykornilov.net/2025/03/13/developing-ai-powered-applications-with-helidon-and-langchain4j/&quot;&gt;previous article&lt;/a&gt;, I discussed how Helidon integrates with LangChain4J. While the article provided a solid foundation, some readers pointed out the lack of a complete, hands-on example. This time, we’ll fix that by building a fully functional, practical AI-powered Java application.&lt;/p&gt;



&lt;p&gt;We’ll create the Helidon Assistant — a chatbot with a web UI trained to answer questions about the Helidon framework. By “trained,” I mean it will be capable of answering questions based on the full Helidon documentation.&lt;/p&gt;



&lt;span id=&quot;more-3856&quot;&gt;&lt;/span&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3857&quot; height=&quot;485&quot; src=&quot;https://dmitrykornilov.net/wp-content/uploads/2025/05/helidon_assistant_web.png?w=1024&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;In this article, we’ll explore how to preprocess AsciiDoc files for ingestion into an embedding store and how to make the application stateless using an AI-powered summarization mechanism. Let’s dive in!&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Project Overview&lt;/h2&gt;



&lt;p&gt;The Helidon Assistant is built with the following technologies:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Java 21&lt;/li&gt;



&lt;li&gt;Helidon SE 4 as the runtime&lt;/li&gt;



&lt;li&gt;LangChain4J for AI integration&lt;/li&gt;



&lt;li&gt;In-memory Embedding Store for storing and retrieving document embeddings&lt;/li&gt;



&lt;li&gt;OpenAI GPT-4o as the default chat model&lt;/li&gt;



&lt;li&gt;Helidon SE static content feature for serving the web UI&lt;/li&gt;



&lt;li&gt;Bulma CSS framework for clean and minimalistic UI styling&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The application is organized into three main layers:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;RESTful Service Layer&lt;/strong&gt; – defines the public REST API and serves the web UI.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;AI Services Layer&lt;/strong&gt; – defines LangChain4J AI services: one for answering user questions, and another for summarizing the conversation.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;RAG Layer&lt;/strong&gt; – handles ingestion: reading AsciiDoc files, preprocessing content, creating embeddings, and storing them in the embedding store.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The architecture diagram is shown below:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3859&quot; height=&quot;411&quot; src=&quot;https://dmitrykornilov.net/wp-content/uploads/2025/05/helidon-assistant-architecture.drawio.png?w=754&quot; width=&quot;754&quot; /&gt;&lt;/figure&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Building and Running the Project&lt;/h2&gt;



&lt;p&gt;The project is available on GitHub &lt;a href=&quot;https://github.com/m0mus/helidon-assistant&quot;&gt;here&lt;/a&gt;. You can either clone the repository or browse the sources directly on GitHub. I’ll refer to it throughout the article.&lt;/p&gt;



&lt;p&gt;Before building and running the project, you need to configure the path to the AsciiDoc documentation the assistant will work with. If you already have the documentation locally—great! If not, you can clone the Helidon repository from GitHub:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; gutter: false; title: ; notranslate&quot;&gt;git clone https://github.com/helidon-io/helidon.git
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The documentation files are located in &lt;code&gt;docs/src/main/asciidoc/mp&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Next, update the application configuration file located at &lt;code&gt;src/main/resources/application.yaml&lt;/code&gt; with the path to your AsciiDoc files:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: yaml; gutter: false; title: ; notranslate&quot;&gt;app:
  root: &quot;//home/dmitry/github/helidon/docs/src/main/asciidoc/mp&quot;
  inclusions: &quot;*.adoc&quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Make sure to adjust the root path to match your local environment. You can also use the &lt;strong&gt;inclusions&lt;/strong&gt; and &lt;strong&gt;exclusions&lt;/strong&gt; properties to filter which files under the root directory should be included during ingestion.&lt;/p&gt;



&lt;p&gt;Now you’re ready to build the application:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; gutter: false; title: ; notranslate&quot;&gt;mvn clean package
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And launch it:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; gutter: false; title: ; notranslate&quot;&gt;java -jar target/helidon-assistant.jar
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Once running, open your browser and go to &lt;code&gt;http://localhost:8080&lt;/code&gt;. You’ll be greeted with the assistant’s web interface, where you can start asking questions.&lt;/p&gt;



&lt;p&gt;Here are a few example questions to get you started:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;How to use metrics with Helidon?&lt;/li&gt;



&lt;li&gt;What does the &lt;code&gt;@Retry&lt;/code&gt; annotation do?&lt;/li&gt;



&lt;li&gt;How can I configure a web server?&lt;/li&gt;



&lt;li&gt;How can I connect to a database?&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;In the next section, we’ll take a closer look at the build script and project dependencies.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Dependencies&lt;/h2&gt;



&lt;p&gt;The project uses a standard Maven &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/pom.xml&quot;&gt;pom.xml&lt;/a&gt; configuration recommended for Helidon SE applications, with several additional dependencies specific to this use case. Below is a commented snippet explaining the purpose of each dependency:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: xml; gutter: false; title: ; notranslate&quot;&gt;&amp;lt;dependencies&amp;gt;
  &amp;lt;!-- Helidon integration with LangChain4J --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.integrations.langchain4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-integrations-langchain4j&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;!-- OpenAI provider: required for using the GPT-4o chat model.
       Replace this with another provider if using a different LLM. --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.integrations.langchain4j.providers&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-integrations-langchain4j-providers-open-ai&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;!-- LangChain4J embeddings model used for RAG functionality --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;dev.langchain4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;langchain4j-embeddings-all-minilm-l6-v2&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;!-- AsciidoctorJ: used to parse and process AsciiDoc documentation files --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.asciidoctor&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;asciidoctorj&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${version.lib.asciidoctorj}&amp;lt;/version&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;!-- Various Helidon dependencies needed for the application proper
       functionality --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.webserver&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-webserver&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.webserver&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-webserver-static-content&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.http.media&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-http-media-jsonp&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.config&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-config-yaml&amp;lt;/artifactId&amp;gt;
  &amp;lt;/dependency&amp;gt;

  &amp;lt;!-- Logging --&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.logging&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-logging-jul&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
  &amp;lt;/dependency&amp;gt;
  &amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;slf4j-jdk14&amp;lt;/artifactId&amp;gt;
    &amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;
  &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can use these dependencies for other AI-powered projects with minimal changes.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Application main class&lt;/h2&gt;



&lt;p&gt;The &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/ApplicationMain.java&quot;&gt;&lt;code&gt;ApplicationMain&lt;/code&gt;&lt;/a&gt; class serves as the application’s entry point. It contains the &lt;code&gt;main&lt;/code&gt; method, which performs the following steps:&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Enables runtime logging.&lt;/li&gt;



&lt;li&gt;Loads the application configuration.&lt;/li&gt;



&lt;li&gt;Ingests documentation into the embedding store.&lt;/li&gt;



&lt;li&gt;Sets up web server routing to serve static web pages and handle user requests.&lt;/li&gt;



&lt;li&gt;Starts the web server.&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;Below is a snippet of the &lt;code&gt;main&lt;/code&gt; method:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;public static void main(String[] args) {
    // Make sure logging is enabled as the first thing
    LogConfig.configureRuntime();

    var config = Services.get(Config.class);

    // Initialize embedding store
    Services.get(DocsIngestor.class)
            .ingest();

    // Static content setup
    var staticContentFeature = StaticContentFeature.builder()
            .addClasspath(cl -&amp;gt; cl.location(&quot;WEB&quot;)
                    .context(&quot;/ui&quot;)
                    .welcome(&quot;index.html&quot;))
            .build();

    // Initialize and start web server
    WebServerConfig.builder()
            .addFeature(staticContentFeature)
            .config(config.get(&quot;server&quot;))
            .routing(ApplicationMain::routing)
            .build()
            .start();
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the next section, I’ll explain how the embedding store is created and initialized.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Preparing AsciiDoc Files for Embeddings&lt;/h2&gt;



&lt;p&gt;Although AsciiDoc is lightweight and human-readable, the source content isn’t immediately ready for use in AI-powered retrieval. AsciiDoc files often contain structural directives like include statements, developer comments, attribute substitutions, and variables intended for conditional rendering or reuse. These elements are meaningful for human readers or documentation generators but can confuse or mislead a language model if left unprocessed. Additionally, formatting artifacts and metadata can introduce noise. Without proper preprocessing, the resulting embeddings might be irrelevant or misleading, which degrades the quality and accuracy of the assistant’s responses.&lt;/p&gt;



&lt;p&gt;To address this, we apply a structured preprocessing pipeline.&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;AsciiDocJ Integration: We use the official AsciiDocJ parser to fully parse AsciiDoc documents. This library resolves include directives automatically and gives us a structured representation of the content.&lt;/li&gt;



&lt;li&gt;Section-Based Chunking: We group content elements by their surrounding section and generate one embedding per section. This preserves logical and thematic boundaries and helps ensure responses remain relevant.&lt;/li&gt;



&lt;li&gt;Preserve Atomic Elements: We make sure that tables and code snippets are not split across chunks. This is critical to retain the contextual meaning of examples and structured content.&lt;/li&gt;



&lt;li&gt;Attach Metadata: Each chunk is enriched with metadata such as document title, relative file path, and section index. This helps reconstruct the document context when presenting answers.&lt;/li&gt;



&lt;li&gt;Repeat for Each File: This process is repeated for each .adoc file identified by the inclusion pattern in the configuration.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;This preprocessing ensures that the AI retrieves precise, coherent documentation segments in response to user queries, resulting in more accurate and helpful answers.&lt;/p&gt;



&lt;p&gt;Here’s how the implementation is structured:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rag/AsciiDocPreprocessor.java&quot;&gt;AsciiDocPreprocessor.java&lt;/a&gt; parses the file and produces a list of document chunks.&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rag/ChunkGrouper.java&quot;&gt;ChunkGrouper.java&lt;/a&gt; groups chunks into section-based logical units.&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rag/FileLister.java&quot;&gt;FileLister.java&lt;/a&gt; reads the directory path and applies inclusion/exclusion patterns.&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rag/DocsIngestor.java&quot;&gt;DocsIngestor.java&lt;/a&gt; orchestrates the overall process: listing files, extracting and grouping chunks, converting them to TextSegment objects, and storing the resulting embeddings.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;A simplified snippet from &lt;code&gt;DocsIngestor.java&lt;/code&gt; demonstrates the ingestion logic:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;public void ingest() {
    var files = FileLister.listFiles(root, exclusions, inclusions);
    var processor = new AsciiDocPreprocessor();
    var grouper = new ChunkGrouper(1000);

    for (Path path : files) {
        var chunks = processor.extractChunks(path.toFile());
        var groupedChunks = grouper.groupChunks(chunks);

        List&amp;lt;TextSegment&amp;gt; segments = new ArrayList&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; groupedChunks.size(); i++) {
            var chunk = groupedChunks.get(i);
            var metadata = new Metadata()
                    .put(&quot;source&quot;, path.toFile().getAbsolutePath())
                    .put(&quot;chunk&quot;, String.valueOf(i + 1))
                    .put(&quot;type&quot;, chunk.type().name())
                    .put(&quot;section&quot;, chunk.sectionPath());

            segments.add(TextSegment.from(chunk.text(), metadata));
        }

        var embeddings = embeddingModel.embedAll(segments);
        embeddingStore.addAll(embeddings.content(), segments);
    }
}
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 class=&quot;wp-block-heading&quot;&gt;Serving static web pages&lt;/h2&gt;



&lt;p&gt;The UI consists of a single &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/resources/WEB/index.html&quot;&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/a&gt; file located in the &lt;code&gt;resources/WEB&lt;/code&gt; directory. It’s styled using the &lt;a href=&quot;https://bulma.io&quot;&gt;Bulma&lt;/a&gt; CSS framework, which is designed to be JavaScript free.&lt;/p&gt;



&lt;p&gt;But there is a small piece of the JavaScript code anyway. It sends user messages to the backend when the Send button is clicked, updates the chat window with the response, and manages conversation summary state.&lt;/p&gt;



&lt;p&gt;To serve this page, we register a &lt;code&gt;StaticContentFeature&lt;/code&gt; during the web server startup. The code below demonstrated how it’s done in the &lt;code&gt;main&lt;/code&gt; method.&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;// Static content setup
var staticContentFeature = StaticContentFeature.builder()
        .addClasspath(cl -&amp;gt; cl.location(&quot;WEB&quot;)
                .context(&quot;/ui&quot;)
                .welcome(&quot;index.html&quot;))
        .build();

// Initialize and start web server
WebServerConfig.builder()
        .addFeature(staticContentFeature)
        ...
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;/ui&lt;/code&gt; path is registered to serve the static content. It user tries to open another path, he will be redirected to &lt;code&gt;/ui&lt;/code&gt;. It’s done in the &lt;code&gt;routing&lt;/code&gt; method.&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;static void routing(HttpRouting.Builder routing) {
    routing.any(&quot;/&quot;, (req, res) -&amp;gt; {
                // showing the capability to run on any path, and redirecting from root
                res.status(Status.MOVED_PERMANENTLY_301);
                res.headers().set(UI_REDIRECT);
                res.send();
            })
            .register(&quot;/chat&quot;, Services.get(ChatBotService.class));
}
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 class=&quot;wp-block-heading&quot;&gt;Processing user requests&lt;/h2&gt;



&lt;p&gt;When the user clicks the Send button in the UI, a server call to the &lt;code&gt;/chat&lt;/code&gt; endpoint is initiated. This request sends the user’s message along with a conversation summary to the server. We’ll discuss conversation summaries in a later section—let’s first focus on how the request is processed on the server side.&lt;/p&gt;



&lt;p&gt;User requests to &lt;code&gt;/chat&lt;/code&gt; are handled by the &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rest/ChatBotService.java&quot;&gt;&lt;code&gt;ChatBotService.java&lt;/code&gt;&lt;/a&gt; class. This class is registered during web server initialization, as shown in &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/ApplicationMain.java&quot;&gt;&lt;code&gt;ApplicationMain.java&lt;/code&gt;&lt;/a&gt;. Below is a simplified snippet that demonstrates how it’s done:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;static void routing(HttpRouting.Builder routing) {
    routing.register(&quot;/chat&quot;, Services.get(ChatBotService.class));
    ...
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/rest/ChatBotService.java&quot;&gt;&lt;code&gt;ChatBotService&lt;/code&gt;&lt;/a&gt; class contains the &lt;code&gt;chatWithAssistant&lt;/code&gt; method, which handles incoming requests. It performs the following steps:&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Extracts the user’s message and conversation summary from the request.&lt;/li&gt;



&lt;li&gt;Invokes &lt;code&gt;ChatAiService&lt;/code&gt;, passing the message and summary to generate a response.&lt;/li&gt;



&lt;li&gt;Uses &lt;code&gt;SummaryAiService&lt;/code&gt; to create an updated conversation summary.&lt;/li&gt;



&lt;li&gt;Builds a JSON object containing the response and the updated summary, and sends it back to the client.&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;Here’s the simplified code for the &lt;code&gt;chatWithAssistant&lt;/code&gt; method:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;private void chatWithAssistant(ServerRequest req, ServerResponse res) {
    var json = req.content().as(JsonObject.class);
    var message = json.getString(&quot;message&quot;);
    var summary = json.getString(&quot;summary&quot;);

    var answer = chatAiService.chat(message, summary);
    var updatedSummary = summaryAiService.chat(summary, message, answer);

    var returnObject = JSON.createObjectBuilder()
                .add(&quot;message&quot;, answer)
                .add(&quot;summary&quot;, updatedSummary)
                .build();
    res.send(returnObject);
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;a href=&quot;https://github.com/m0mus/helidon-assistant/blob/main/src/main/java/net/dmitrykornilov/helidon/assistant/ai/ChatAiService.java&quot;&gt;&lt;code&gt;ChatAiService.java&lt;/code&gt;&lt;/a&gt; class is implemented as a Helidon AI service. You can learn more about AI services and how to implement them in my &lt;a href=&quot;https://dmitrykornilov.net/2025/03/13/developing-ai-powered-applications-with-helidon-and-langchain4j/&quot;&gt;previous article&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Here’s the relevant code:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;@Ai.Service
public interface ChatAiService {

    @SystemMessage(&quot;&quot;&quot;
            You are Frank, a helpful Helidon expert.

            Only answer questions related to Helidon and its components. If a question is not relevant to Helidon, 
            politely decline.

            Use the following conversation summary to keep context and maintain continuity:
            {(summary})
            &quot;&quot;&quot;)
    String chat(@UserMessage String question, @V(&quot;summary&quot;) String previousConversationSummary);
}
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 class=&quot;wp-block-heading&quot;&gt;Making the Application Stateless&lt;/h2&gt;



&lt;p&gt;In a typical chat application, the backend must maintain the full history of the conversation in order to understand the user’s intent. This is because language models like OpenAI’s GPT rely heavily on context — they need to see the dialogue leading up to the current question to provide an accurate and helpful answer. The longer and more complex the conversation, the more memory is required to hold that context.&lt;/p&gt;



&lt;p&gt;However, storing chat history introduces challenges. If you’re running a single backend instance, you might store this state in memory. But in a production environment, especially in cloud-native deployments, applications often scale horizontally — meaning multiple instances of the backend may be running behind a load balancer. In such setups, traditional in-memory storage for chat history doesn’t work: the next request from the same user might be routed to a different backend instance that has no access to prior state.&lt;/p&gt;



&lt;p&gt;This is where statelessness becomes critical. Stateless services are inherently scalable, easier to maintain, and more resilient. But to make a chatbot stateless without sacrificing conversation quality, we need a way to preserve and compress context — and that’s where AI-powered summarization comes in.&lt;/p&gt;



&lt;p&gt;By summarizing the chat history into a compact form after every message, we replace a long list of messages with a lightweight, synthetic memory that still captures the user’s intent and context. This summary is sent along with the next message, enabling consistent, relevant responses while allowing each request to be handled independently.&lt;/p&gt;



&lt;p&gt;The Helidon Assistant uses this technique to remain stateless and cloud-native, ensuring it can scale easily while maintaining meaningful conversations with users.&lt;/p&gt;



&lt;p&gt;Summarizer implemented as an AI service. You can read more about AI services and how to implement them in my &lt;a href=&quot;https://dmitrykornilov.net/2025/03/13/developing-ai-powered-applications-with-helidon-and-langchain4j/&quot;&gt;previous article&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;@Ai.Service
public interface SummaryAiService {

    @SystemMessage(&quot;&quot;&quot;
        You are a conversation summarizer for an AI assistant. Your job is to keep a concise summary of the
        ongoing conversation to preserve context.
        Given the previous summary, the latest user message, and the AI's response, update the summary so it
        reflects the current state of the conversation.
        Keep it short, factual, and focused on what the user is doing or trying to achieve. Avoid rephrasing the
        entire response or repeating long parts verbatim.
        &quot;&quot;&quot;)
    @UserMessage(&quot;&quot;&quot;
        Previous Summary: 
        {{summary}}

        Last User Message:
        {{lastUserMessage}}

        Last AI Response:
        {{aiResponse}}
        &quot;&quot;&quot;
    )
    String chat(@V(&quot;summary&quot;) String previousSummary,
                @V(&quot;lastUserMessage&quot;) String latestUserMessage,
                @V(&quot;aiResponse&quot;) String aiResponse);
}
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 class=&quot;wp-block-heading&quot;&gt;Wrapping Up&lt;/h2&gt;



&lt;p&gt;That’s it — we’ve built a fully working, stateless AI assistant powered by Helidon and LangChain4J. Hopefully, everything is clear and nothing important was left out. But if something feels confusing or needs more explanation, I’d love to hear your thoughts. Feedback is always welcome — whether it’s a bug, a missing step, or just a better way to do things.&lt;/p&gt;



&lt;p&gt;Want to dive into the code or try it yourself? You’ll find everything here:&lt;/p&gt;



&lt;p&gt;&lt;a href=&quot;https://github.com/m0mus/helidon-assistant&quot;&gt;GitHub: Helidon Assistant&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Thanks for reading — and happy coding!&lt;/p&gt;</description>
	<pubDate>Fri, 16 May 2025 12:57:52 +0000</pubDate>
</item>
<item>
	<title>Mads Opheim: Replace simple sub-GitHub Actions with plain run</title>
	<guid isPermaLink="true">https://madsopheim.com/blog/2025-04-23-github-actions</guid>
	<link>https://madsopheim.com/blog/2025-04-23-github-actions</link>
	<description>Use the GH CLI directly instead of wrappers you don't need</description>
	<pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Francesco Marchioni: How to run WildFly applications with JBang</title>
	<guid isPermaLink="false">https://www.mastertheboss.com/?p=13237</guid>
	<link>https://www.mastertheboss.com/java-ee/jakarta-ee/how-to-run-wildfly-applications-with-jbang/</link>
	<description>&lt;p&gt;In this article we will learn how to provision a WildFly Server using the JBang scripting tool. Starting from a basic example using a REST endpoint, we will show how to enable additional features on the application server with the WildFly Glow tooling. Why Run WildFly in your Java scripts? WildFly is an application server ... &lt;a class=&quot;read-more&quot; href=&quot;https://www.mastertheboss.com/java-ee/jakarta-ee/how-to-run-wildfly-applications-with-jbang/&quot; title=&quot;How to run WildFly applications with JBang&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://www.mastertheboss.com/java-ee/jakarta-ee/how-to-run-wildfly-applications-with-jbang/&quot; rel=&quot;nofollow&quot;&gt;How to run WildFly applications with JBang&lt;/a&gt; appeared first on &lt;a href=&quot;https://www.mastertheboss.com&quot; rel=&quot;nofollow&quot;&gt;Mastertheboss&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 13 Apr 2025 14:39:25 +0000</pubDate>
</item>
<item>
	<title>Víctor Orozco: Install VirtualBox over Fedora with SecureBoot enabled</title>
	<guid isPermaLink="false">blog/2025/2025-03-23-Fedora-Secure-Boot-VirtualBox.html</guid>
	<link>https://www.vorozco.com/blog/2025/2025-03-23-Fedora-Secure-Boot-VirtualBox.html</link>
	<description>&lt;p&gt;Not too long ago, I upgraded my computer and got a new &lt;strong&gt;Lenovo ThinkPad X1 Carbon&lt;/strong&gt; (a great machine so far!).&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Lenovo&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/00-lenovo.jpg&quot; title=&quot;Lenovo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Since I was accustomed to working on a gaming rig (Ryzen 7, 64GB RAM, 4TB) that I had set up about five years ago, &lt;strong&gt;I completely missed the Secure Boot and TPM trends&lt;/strong&gt;—these weren’t relevant for my fixed workstation.&lt;/p&gt;
&lt;p&gt;However, my goal with this new laptop is to work with both &lt;strong&gt;Linux and Windows on the go&lt;/strong&gt;, making encryption mandatory. As a non-expert Windows user, &lt;strong&gt;I enabled encryption via BitLocker on Windows 11&lt;/strong&gt;, which worked perfectly... until it didn’t.&lt;/p&gt;
&lt;h2&gt;The Issue with Secure Boot and VirtualBox/VMware&lt;/h2&gt;
&lt;p&gt;This week, I discovered that &lt;strong&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/countermeasures&quot;&gt;BitLocker leverages&lt;/a&gt; TPM (the encryption chip) and Secure Boot&lt;/strong&gt; if they’re enabled during encryption. While this is beneficial for Windows users, it created an unexpected problem for me: &lt;strong&gt;virtualization on Linux&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let me explain. &lt;a href=&quot;https://wiki.gentoo.org/wiki/Secure_Boot&quot;&gt;Secure Boot&lt;/a&gt; is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;...an enhancement of the security of the pre-boot process of a UEFI system. When enabled, the UEFI firmware verifies the signature of every component used in the boot process. This results in boot files that are easily readable but tamper-evident.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means components like the &lt;strong&gt;kernel, kernel modules, and firmware&lt;/strong&gt; must be signed with a recognized signature, which must be installed on the computer.&lt;/p&gt;
&lt;p&gt;This creates a tricky situation for Linux because &lt;strong&gt;virtualization software like VMware or VirtualBox typically compiles kernel modules on the user’s machine&lt;/strong&gt;. These modules are unsigned by default, leading to errors when loading them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;# modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Key was rejected by service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A good way to diagnose this is to check &lt;code&gt;dmesg&lt;/code&gt; for messages like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[47921.605346] Loading of unsigned module is rejected
[47921.664572] Loading of unsigned module is rejected
[47932.035014] Loading of unsigned module is rejected
[47932.056838] Loading of unsigned module is rejected
[47947.224484] Loading of unsigned module is rejected
[47947.257641] Loading of unsigned module is rejected
[48291.102147] Loading of unsigned module is rejected
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How to Fix the Issue with VirtualBox Using RPMFusion and Akmods&lt;/h2&gt;
&lt;p&gt;Oracle is aware of this issue, but their &lt;a href=&quot;https://www.virtualbox.org/manual/topics/installation.html#kernel-modules-efi-secure-boot&quot;&gt;documentation&lt;/a&gt; is lacking. To quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are running on a system using UEFI (Unified Extensible Firmware Interface) Secure Boot, you may need to sign the following kernel modules before you can load them: &lt;code&gt;vboxdrv&lt;/code&gt;, &lt;code&gt;vboxnetadp&lt;/code&gt;, &lt;code&gt;vboxnetflt&lt;/code&gt;, &lt;code&gt;vboxpci&lt;/code&gt;. &lt;strong&gt;See your system documentation for details of the kernel module signing process&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fedora’s documentation is sparse, so I spent a lot of time researching &lt;strong&gt;manual kernel module signing&lt;/strong&gt; (&lt;a href=&quot;https://docs.fedoraproject.org/en-US/quick-docs/kernel-build-custom/#_secure_boot&quot;&gt;Fedora docs&lt;/a&gt;) and following &lt;a href=&quot;https://gist.github.com/reillysiemens/ac6bea1e6c7684d62f544bd79b2182a4&quot;&gt;user guides&lt;/a&gt; until I discovered that &lt;strong&gt;VirtualBox is available in &lt;a href=&quot;https://rpmfusion.org/&quot;&gt;RPMFusion&lt;/a&gt; with &lt;a href=&quot;https://packages.fedoraproject.org/pkgs/akmods/akmods/index.html&quot;&gt;akmods&lt;/a&gt; support&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Some definitions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RPM Fusion&lt;/strong&gt; is a community repository for Enterprise Linux (Fedora, RHEL, etc.) that provides packages not included in official distributions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Akmds&lt;/strong&gt; automates the process of building and signing kernel modules.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s the step-by-step solution:&lt;/p&gt;
&lt;h3&gt;1. Enable RPM Fusion (Free Repo)&lt;/h3&gt;
&lt;p&gt;Install the RPM Fusion free repository:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;RPM Fusion Install&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/01-install.png&quot; title=&quot;RPM Fusion Install&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. Install VirtualBox (with Akmods)&lt;/h3&gt;
&lt;p&gt;Ensure VirtualBox is installed from RPMFusion (akmods will be a dependency):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;sudo dnf install virtualbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;VirtualBox Install&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/02-virtualbox.png&quot; title=&quot;VirtualBox Install&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;VirtualBox Akmods&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/03-akmods.png&quot; title=&quot;VirtualBox Akmods&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. Start Akmods to Generate Keys&lt;/h3&gt;
&lt;p&gt;Akmods will automatically sign the modules with a key stored in &lt;code&gt;/etc/pki/akmods/certs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;sudo systemctl start akmods.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;Akmods Start&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/04-akmods-start.png&quot; title=&quot;Akmods Start&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4. Enroll the Key with Mokutil&lt;/h3&gt;
&lt;p&gt;Use &lt;code&gt;mokutil&lt;/code&gt; to register the key in Secure Boot:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;sudo mokutil --import /etc/pki/akmods/certs/public_key.der
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&quot;Mokutil Key Import&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/05-mokutil.png&quot; title=&quot;Mokutil Key Import&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You’ll be prompted for a &lt;strong&gt;case-sensitive password&lt;/strong&gt;—remember it for the next step.&lt;/p&gt;
&lt;h3&gt;5. Reboot and Enroll the Key&lt;/h3&gt;
&lt;p&gt;After rebooting, the UEFI firmware will prompt you to &lt;strong&gt;enroll the new key&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;MOK Enrollment&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/06-mokenroll.png&quot; title=&quot;MOK Enrollment&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;MOK Enrollment 3&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/08-mokenroll-3.png&quot; title=&quot;MOK Enrollmen 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If needed, you could also check for the key contents in that screen.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;MOK Enrollment 2&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/07-mokenroll-2.png&quot; title=&quot;MOK Enrollment 2&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;6. Start VirtualBox Kernel Modules&lt;/h3&gt;
&lt;p&gt;The modules are now signed and can be loaded. Enable these at boot:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;sudo systemctl start vboxdrv
sudo systemctl enable vboxdrv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify they’re loaded:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-prettyprint&quot;&gt;lsmod | grep vbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vboxnetadp             32768  0
vboxnetflt             40960  0
vboxdrv               708608  2 vboxnetadp,vboxnetflt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, &lt;strong&gt;VirtualBox runs on Fedora with Secure Boot and TPM enabled&lt;/strong&gt;, without disabling BitLocker on Windows.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;VirtualBox Running&quot; src=&quot;https://feeds.feedburner.com/images/posts/virtualboxsecureboot/09-finalresult.png&quot; title=&quot;VirtualBox Running&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 24 Mar 2025 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Dmitry Kornilov: Developing AI-Powered Applications with Helidon and LangChain4J</title>
	<guid isPermaLink="false">http://dmitrykornilov.net/?p=3547</guid>
	<link>https://dmitrykornilov.net/2025/03/13/developing-ai-powered-applications-with-helidon-and-langchain4j/</link>
	<description>&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3549&quot; height=&quot;585&quot; src=&quot;https://dmitrykornilov.net/wp-content/uploads/2025/03/d0b8d0b7d0bed0b1d180d0b0d0b6d0b5d0bdd0b8d0b5.png?w=1024&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Introduction&lt;/h2&gt;



&lt;p&gt;The rise of Large Language Models (LLMs) has opened new doors for AI-powered applications, enabling dynamic interactions, natural language processing, and retrieval-augmented generation (RAG). However, integrating these powerful models into Java applications can be challenging. This is where &lt;a href=&quot;https://github.com/langchain4j/langchain4j&quot;&gt;LangChain4J&lt;/a&gt; comes in – a framework designed to simplify AI development in Java.&lt;/p&gt;



&lt;p&gt;To take things a step further, in version 4.2, Helidon introduced seamless LangChain4J integration, making it easier to build AI-driven applications while leveraging Helidon’s programming model and style. In this blog post, we’ll explore how this integration simplifies AI application development and how you can use it in your projects.&lt;/p&gt;



&lt;span id=&quot;more-3547&quot;&gt;&lt;/span&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What is LangChain4J?&lt;/h2&gt;



&lt;p&gt;LangChain4J is a Java framework that facilitates building AI-powered applications using LLMs from providers like OpenAI, Cohere, Hugging Face, and others. It provides:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;AI Services&lt;/strong&gt;: A declarative and type-safe API to interact with models.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: Enhancing responses with external knowledge sources.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Embeddings and Knowledge Retrieval&lt;/strong&gt;: Working with vector-based search systems.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Memory and Context&lt;/strong&gt;: Managing conversational memory for intelligent interactions.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;However, integrating LangChain4J manually into an application requires configuring components, managing dependencies, and handling injections manually. This is where Helidon’s integration module provides significant advantages.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;How Helidon Simplifies LangChain4J Integration&lt;/h2&gt;



&lt;p&gt;Before we proceed, note that Helidon’s LangChain4J integration is a &lt;strong&gt;preview feature&lt;/strong&gt; in Helidon 4.2. This means that while it’s production-ready, the Helidon team reserves the right to modify APIs in minor versions.&lt;/p&gt;



&lt;p&gt;Helidon’s LangChain4J integration introduces:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Helidon Inject Support&lt;/strong&gt;: LangChain4J components are automatically created and registered in the Helidon service registry based on configuration.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Convention Over Configuration&lt;/strong&gt;: Reduces boilerplate by using sensible defaults.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Declarative AI Services&lt;/strong&gt;: Uses annotations to define AI services in a clean, structured manner.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;CDI Integration&lt;/strong&gt;: Components work seamlessly in Helidon MP.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;These features significantly reduce the complexity of incorporating AI into Helidon applications.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Setting Up LangChain4J in Helidon&lt;/h2&gt;



&lt;p&gt;To use LangChain4J with Helidon, add the following dependency to your Maven project:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: xml; gutter: false; title: ; notranslate&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.helidon.integrations.langchain4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;helidon-integrations-langchain4j&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Include the necessary annotation processors in the &lt;code&gt;&amp;lt;build&amp;gt;&amp;lt;plugins&amp;gt;&lt;/code&gt; section of your &lt;code&gt;pom.xml&lt;/code&gt;:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: xml; gutter: false; title: ; notranslate&quot;&gt;&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;annotationProcessorPaths&amp;gt;
            &amp;lt;path&amp;gt;
                &amp;lt;groupId&amp;gt;io.helidon.codegen&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;helidon-codegen-apt&amp;lt;/artifactId&amp;gt;
            &amp;lt;/path&amp;gt;
            &amp;lt;path&amp;gt;
                &amp;lt;groupId&amp;gt;io.helidon.integrations.langchain4j&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;helidon-integrations-langchain4j-codegen&amp;lt;/artifactId&amp;gt;
            &amp;lt;/path&amp;gt;
        &amp;lt;/annotationProcessorPaths&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Using different LLM providers may require additional dependencies. For example, using OpenAI models requires adding a dependency to the OpenAI provider, while using Ollama requires adding the Ollama provider. This modular approach helps keep applications lightweight. For more information about providers and dependencies, refer to the &lt;a href=&quot;https://helidon.io/docs/v4/se/integrations/langchain4j/langchain4j&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Creating AI Components in Helidon&lt;/h2&gt;



&lt;p&gt;When I refer to AI components, I mean the public API classes provided by LangChain4J. Examples include various models such as &lt;code&gt;OpenAiChatModel&lt;/code&gt; and &lt;code&gt;OllamaChatModel&lt;/code&gt;, embedding stores like &lt;code&gt;InMemoryEmbeddingStore&lt;/code&gt;, content retrievers such as &lt;code&gt;EmbeddingStoreContentRetriever&lt;/code&gt;, and ingestors like &lt;code&gt;EmbeddingStoreIngestor&lt;/code&gt;, among others.&lt;/p&gt;



&lt;p&gt;Some components are natively supported by the Helidon LangChain4J integration and can be automatically created when the corresponding configuration is present. The currently supported components include:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;LangChain4J Core
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;EmbeddingStoreContentRetriever&lt;/li&gt;



&lt;li&gt;MessageWindowChatMemory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Open AI
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;OpenAiChatModel&lt;/li&gt;



&lt;li&gt;OpenAiStreamingChatModel&lt;/li&gt;



&lt;li&gt;OpenAiEmbeddingModel&lt;/li&gt;



&lt;li&gt;OpenAiImageModel&lt;/li&gt;



&lt;li&gt;OpenAiLanguageModel&lt;/li&gt;



&lt;li&gt;OpenAiModerationModel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Ollama
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;OllamaChatModel&lt;/li&gt;



&lt;li&gt;OllamaStreamingChatModel&lt;/li&gt;



&lt;li&gt;OllamaEmbeddingModel&lt;/li&gt;



&lt;li&gt;OllamaLanguageModel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Cohere
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;CohereEmbeddingModel&lt;/li&gt;



&lt;li&gt;CohereScoringModel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Oracle
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;OracleEmbeddingStore&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;For example, the OpenAI chat model can be automatically created by defining the following configuration in &lt;code&gt;application.yaml&lt;/code&gt;:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: yaml; gutter: false; title: ; notranslate&quot;&gt;langchain4j:
  open-ai:
    chat-model:
      enabled: true
      api-key: &quot;demo&quot;
      model-name: &quot;gpt-4o-mini&quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With this configuration, an instance of &lt;code&gt;OpenAiChatModel&lt;/code&gt; is automatically created and can be injected into other application components.&lt;/p&gt;



&lt;p&gt;A key element in this setup is the &lt;code&gt;enabled&lt;/code&gt; property. The component is only created if this property is set to &lt;code&gt;true&lt;/code&gt;. This provides an easy way to disable component creation while retaining its configuration in the file for future use.&lt;/p&gt;



&lt;p&gt;If you need to create a component that is not in the list above and register it in the Helidon service registry, you can use a &lt;strong&gt;Supplier Factory&lt;/strong&gt;:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;@Service.Singleton
@Service.Named(&quot;MyChatModel&quot;)
class ChatModelFactory implements Supplier&amp;lt;ChatLanguageModel&amp;gt; {
    @Override
    public ChatLanguageModel get() {
        return OpenAiChatModel.builder()
                .apiKey(&quot;demo&quot;)
                .build();
    }
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This method allows you to register custom embedding models and other AI components dynamically. &lt;code&gt;Service.Named(&quot;MyChatModel&quot;)&lt;/code&gt; annotation is optional. You can add it to define a name for your component for future reference.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Using AI Components&lt;/h2&gt;



&lt;p&gt;Helidon Inject makes it easy to use AI components within your application:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; gutter: false; title: ; notranslate&quot;&gt;@Service.Singleton
public class MyService {
    private final ChatLanguageModel chatModel;

    @Service.Inject
    public MyService(ChatLanguageModel chatModel) {
        this.chatModel = chatModel;
    }
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;For named components, use:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; gutter: false; title: ; notranslate&quot;&gt;@Service.Inject
public MyService(@Service.Named(&quot;MyChatModel&quot;) ChatLanguageModel chatModel) {
    this.chatModel = chatModel;
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Alternatively, you can manually retrieve a component from the service registry as follows:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;var chatModel = Services.get(OpenAiChatModel.class);
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 class=&quot;wp-block-heading&quot;&gt;AI Services&lt;/h2&gt;



&lt;p&gt;Most often AI-powered components require a combination of different components working together. For example, a simple chat assistant requires a chat model to communicate with users, embedding store to store data, embedding model to retrieve and query the data, chat memory for keeping conversation context, etc. LangChain4J AI Services provide a way of combining different kinds of AI functionality behind a simple API which significantly reduces the boilerplate code.&lt;/p&gt;



&lt;p&gt;Helidon’s LangChain4J integration introduces a declarative Helidon Inject-based approach for creating AI Services. It supports the following components:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Chat Model:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;dev.langchain4j.model.chat.ChatLanguageModel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Streaming Chat Model:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;dev.langchain4j.model.chat.StreamingChatLanguageModel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Chat Memory:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;dev.langchain4j.memory.ChatMemory&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Chat Memory Provider:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;dev.langchain4j.memory.chat.ChatMemoryProvider&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Moderation Model:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;code&gt;dev.langchain4j.model.moderation.ModerationModel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;RAG:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Content Retriever: &lt;code&gt;dev.langchain4j.rag.content.retriever.ContentRetriever&lt;/code&gt;&lt;/li&gt;



&lt;li&gt;Retrieval Augmentor: &lt;code&gt;dev.langchain4j.rag.RetrievalAugmentor&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Callback Functions:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Methods annotated with &lt;code&gt;dev.langchain4j.agent.tool.Tool&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Helidon makes it simple to define AI services using annotations:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; gutter: false; title: ; notranslate&quot;&gt;@Ai.Service
public interface ChatAiService {
    String chat(String question);
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In this scenario all LangChain4J components from the list above are taken from the service registry. User still has an ability to manually control the process by putting any of the following annotations which specify a service name which must be used for this particular function instead of discovering it automatically.&lt;/p&gt;



&lt;figure class=&quot;wp-block-table&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Annotation&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Ai.ChatModel&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements ChatModel to be used in the annotated AI Service. Mutually exclusive with Ai.StreamingChatModel.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.StreamingChatModel&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements StreamingChatModel to use in the annotated Ai Service. Mutually exclusive with Ai.ChatModel.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.ChatMemory&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements ChatMemory to use in the annotated Ai Service. Mutually exclusive with Ai.ChatMemoryWindow and Ai.ChatMemoryProvider.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.ChatMemoryWindow&lt;/td&gt;&lt;td&gt;Adds a MessageWindowChatModel with the specified window size to the annotated AI Service. Mutually exclusive with Ai.ChatMemory and Ai.ChatMemoryProvider.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.ChatMemoryProvider&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements ChatMemoryProvider to use in the annotated Ai Service. Mutually exclusive with Ai.ChatMemory and Ai.ChatMemoryWindow.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.ModerationModel &lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements ModerationModel to use in the annotated Ai Service.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.ContentRetriever&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements ContentRetriever to use in the annotated Ai Service. Mutually exclusive with Ai.RetrievalAugmentor.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ai.RetrievalAugmentor&lt;/td&gt;&lt;td&gt;Specifies the name of a service in the service registry that implements RetrievalAugmentor to use in the annotated Ai Service. Mutually exclusive with Ai.ContentRetriever.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;



&lt;p&gt;For example, in the snippet below a service with name “MyChatModel” will be used as chat model and all other components are discovered automatically.&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: java; gutter: false; title: ; notranslate&quot;&gt;@Ai.Service
@Ai.ChatModel(&quot;MyChatModel&quot;)
public interface ChatAiService {
    String chat(String question);
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There is a possibility to switch off automatic discovery by using @Ai.Service(autodicovery=false). In this case the service components are not discovered automatically and users must add components manually using annotations specified above. @ChatModel or @StreamingChatModel annotations are required.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Tools: Enhancing AI with Custom Logic&lt;/h3&gt;



&lt;p&gt;LangChain4J tools enable AI models to invoke external functions during execution. This is useful when an LLM needs to perform an action during its conversation with a user, such as retrieving data, calling an external service, or executing code.&lt;/p&gt;



&lt;p&gt;LangChain4J provides the &lt;code&gt;@Tool&lt;/code&gt; annotation, which, when applied to a method, makes that method accessible for the LLM to call. The integration code scans the project for classes containing &lt;code&gt;@Tool&lt;/code&gt;-annotated methods and automatically adds them to AI Services. The only requirement is that these classes must be Helidon Inject services.&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; gutter: false; title: ; notranslate&quot;&gt;@Service.Singleton
public class OrderService {
    @Tool(&quot;Get order details for specified order number&quot;)
    public Order getOrderDetails(String orderNumber) {
        // Business logic here
    }
}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you are using Helidon MP, an additional step is required. You must annotate the service containing tools with the &lt;code&gt;@Ai.Tool&lt;/code&gt; annotation. Additionally, the integration supports tools within CDI beans.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Samples&lt;/h2&gt;



&lt;p&gt;We have created several sample applications for you to explore. These samples demonstrate all aspects of using LangChain4J in Helidon applications.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Coffee Shop Assistant&lt;/h3&gt;



&lt;p&gt;The Coffee Shop Assistant is a demo application that showcases how to build an AI-powered assistant for a coffee shop. This assistant can answer questions about the menu, provide recommendations, and create orders. It utilizes an embedding store initialized from a JSON file.&lt;/p&gt;



&lt;p&gt;Key features:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Integration with OpenAI chat models&lt;/li&gt;



&lt;li&gt;Utilization of embedding models, an embedding store, an ingestor, and a content retriever&lt;/li&gt;



&lt;li&gt;Helidon Inject for dependency injection&lt;/li&gt;



&lt;li&gt;Embedding store initialization from a JSON file&lt;/li&gt;



&lt;li&gt;Support for callback functions to enhance interactions&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Check it out:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/helidon-io/helidon-examples/tree/helidon-4.x/examples/integrations/langchain4j/coffee-shop-assistant-se&quot;&gt;Coffee Shop Assistant for Helidon SE&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://github.com/helidon-io/helidon-examples/tree/helidon-4.x/examples/integrations/langchain4j/coffee-shop-assistant-mp&quot;&gt;Coffee Shop Assistant for Helidon MP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Hands-on Lab&lt;/h3&gt;



&lt;p&gt;We also offer a Hands-on Lab with step-by-step instructions on how to build the Coffee Shop Assistant:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/helidon-io/helidon-labs/tree/main/hols/langchain4j&quot;&gt;HOL: Building AI-Powered Applications with Helidon and LangChain4J&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Useful Resources&lt;/h2&gt;



&lt;p&gt;Ready to get started? Here are some useful resources:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://helidon.io/docs/v4/se/integrations/langchain4j/langchain4j&quot;&gt;Helidon LangChain4J documentation&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://docs.langchain4j.dev/&quot;&gt;LangChain4J documentation&lt;/a&gt;&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://helidon.io/docs/v4/se/injection&quot;&gt;Helidon Inject documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 13 Mar 2025 13:33:23 +0000</pubDate>
</item>
<item>
	<title>Jakarta EE Ambassadors: Jakarta EE Ambassadors Gather at Devnexus 2025 to Deliver Sessions on Jakarta EE</title>
	<guid isPermaLink="false">http://jakartaee-ambassadors.io/?p=1496</guid>
	<link>https://jakartaee-ambassadors.io/2025/03/03/jakarta-ee-ambassadors-gather-at-devnexus-2025-to-deliver-sessions-on-jakarta-ee/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/&quot;&gt;Devnexus 2025&lt;/a&gt; will be held Tuesday-Thursday, March 4-6, 2025 at the &lt;a href=&quot;https://www.gwcca.org/georgia-world-congress-center&quot;&gt;Georgia World Congress Center&lt;/a&gt; in Atlanta, Georgia. Members of the Jakarta EE Ambassadors will be in attendance to deliver presentations on Jakarta EE.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;On March 4, developers will be able to choose from five &lt;a href=&quot;https://devnexus.com/workshops&quot;&gt;workshops&lt;/a&gt;:&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/ai-driven-development-enhancing-java-with-the-latest-ai-innovations&quot;&gt;AI-Driven Development: Enhancing Java with the latest AI Innovations&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/brian-benz&quot;&gt;Brian Benz&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/developer-to-architect&quot;&gt;Developer to Architect&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/nathaniel-schutta&quot;&gt;Nate Schutta&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/migration-engineering-with-openrewrite-the-recipe-for-success&quot;&gt;Migration Engineering with OpenRewrite: The Recipe for Success&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/jonathan-schneider&quot;&gt;Jonathan Schneider&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/practical-ai-lab-for-enterprise-java-developers-from-zero-to-hero&quot;&gt;Practical AI Lab for Enterprise Java Developers: From Zero to Hero&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/daniel-oh&quot;&gt;Daniel Oh&lt;/a&gt;, &lt;a href=&quot;https://devnexus.com/speakers/eric-deandrea&quot;&gt;Eric Deandrea&lt;/a&gt; and &lt;a href=&quot;https://devnexus.com/speakers/james-falkner&quot;&gt;James Falkner&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://devnexus.com/presentations/stream-processing-as-you-ve-never-seen-before-seriously-apache-flink-for-java-developers&quot;&gt;Stream Processing As You’ve Never Seen Before (Seriously): Apache Flink for Java Developers&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/viktor-gamov&quot;&gt;Viktor Gamov&lt;/a&gt; and &lt;a href=&quot;https://devnexus.com/speakers/sandon-jacobs&quot;&gt;Sandon Jacobs&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Concurrent with the workshops are two summits for Java User Group leaders and Java Champions as they discuss issues that affect their respective Java User Groups and the roles of a Java Champion within the Java community.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;On March 5-6, developers can expect many &lt;a href=&quot;https://devnexus.com/schedule&quot;&gt;sessions&lt;/a&gt; on topics such as, AI, Architecture, Jakarta EE and Core Java (among many others).&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The Jakarta EE track, in particular,  includes 10 sessions, namely:&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/a-developer-s-guide-to-jakarta-ee-11&quot;&gt;A Developer’s Guide to Jakarta EE 11&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/michael-redlich&quot;&gt;Michael Redlich&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/ai-tools-for-jakarta-ee&quot;&gt;AI Tools for Jakarta EE&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/gaurav-gupta&quot;&gt;Gaurav Gupta&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/foundations-of-modern-java-server-apps&quot;&gt;Foundations of Modern Java Server Apps&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/kito-mann&quot;&gt;Kito Mann&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/java-llms-a-hands-on-guide-to-building-llm-apps-in-java-with-jakartaee&quot;&gt;Java + LLMs: A hands-on guide to building LLM Apps in Java with JakartaEE&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/bazlur-rahman&quot;&gt;Bazlur Rahman&lt;/a&gt; and &lt;a href=&quot;https://devnexus.com/speakers/syed-m-shaaf&quot;&gt;Shaaf Syed&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/migrating-from-java-ee-to-spring-boot-or-something-else&quot;&gt;Migrating from Java EE – to Spring Boot or something else?&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/ondro-mih%C3%A1lyi&quot;&gt;Ondro Mihályi&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/jakarta-ee-meets-ai-beyond-the-chatbot-with-langchain4j&quot;&gt;Jakarta EE meets AI: Beyond the chatbot with LangChain4j&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/jorge-cajas&quot;&gt;Jorge Cajas&lt;/a&gt;&lt;a href=&quot;https://devnexus.com/presentations/duke-on-crac-with-jakarta-ee&quot;&gt;Duke on CRaC with Jakarta EE&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/ivar-grimstad&quot;&gt;Ivar Grimstad&lt;/a&gt; and &lt;a href=&quot;https://devnexus.com/speakers/rustam-mehmandarov&quot;&gt;Rustam Mehmandarov&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/concurrency-redefined-what-s-new-in-jakarta-concurrency-3-1&quot;&gt;Concurrency redefined: what’s new in Jakarta Concurrency 3.1&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/chuck-bridgham&quot;&gt;Chuck Bridgham&lt;/a&gt; and &lt;a href=&quot;https://devnexus.com/speakers/harry-hoots-iii&quot;&gt;Harry Hoots III&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/jakarta-ee-connected-industries-with-an-edge&quot;&gt;Jakarta EE: Connected Industries with an Edge&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/petr-aubrecht&quot;&gt;Petr Aubrecht&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://devnexus.com/presentations/case-study-journey-to-cloud-with-jakarta-ee-and-microprofile&quot;&gt;Case Study: Journey to Cloud with Jakarta EE and MicroProfile&lt;/a&gt; by &lt;a href=&quot;https://devnexus.com/speakers/julian-ortiz&quot;&gt;Julian Ortiz&lt;/a&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Developers can also expect keynote addresses throughout the conference and peruse the vendors that will display their wares. The Eclipse Foundation will also have a booth where folks from the Java community involved in Jakarta EE and MicroProfile will be on hand for conversation and for example applications that demonstrate new features offered in Jakarta EE 11.&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 03 Mar 2025 16:54:34 +0000</pubDate>
</item>
<item>
	<title>Francesco Marchioni: What is new in Jakarta Persistence 3.2</title>
	<guid isPermaLink="false">https://www.mastertheboss.com/?p=13167</guid>
	<link>https://www.mastertheboss.com/java-ee/jakarta-ee/what-is-new-in-jakarta-persistence-3-2/</link>
	<description>&lt;p&gt;This tutorial provides an overview of some of the new features that are available in the upcoming Jakarta Persistence API 3.2, which is part of Jakarta EE 11 bundle. Jakarta Persistence defines a standard for management of persistence and ORM Java(R) Enterprise environments. If you are new to Jakarta Persistence API we recommend checking this ... &lt;a class=&quot;read-more&quot; href=&quot;https://www.mastertheboss.com/java-ee/jakarta-ee/what-is-new-in-jakarta-persistence-3-2/&quot; title=&quot;What is new in Jakarta Persistence 3.2&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://www.mastertheboss.com/java-ee/jakarta-ee/what-is-new-in-jakarta-persistence-3-2/&quot; rel=&quot;nofollow&quot;&gt;What is new in Jakarta Persistence 3.2&lt;/a&gt; appeared first on &lt;a href=&quot;https://www.mastertheboss.com&quot; rel=&quot;nofollow&quot;&gt;Mastertheboss&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 24 Nov 2024 17:08:04 +0000</pubDate>
</item>
<item>
	<title>Markus Karg: Reader.of(CharSequence)</title>
	<guid isPermaLink="false">http://headcrashing.wordpress.com/?p=1363</guid>
	<link>https://headcrashing.wordpress.com/2024/11/02/reader-ofcharsequence/</link>
	<description>&lt;p&gt;&lt;strong&gt;Hi guys, how’s it going? Long time no see!&lt;/strong&gt; &lt;img alt=&quot;ðŸ˜…&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f605.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;In fact, I had been very silent in the past months, and as you could imagine, it has a reason: I just had &lt;em&gt;no time&lt;/em&gt; to share &lt;strong&gt;all the great stuff&lt;/strong&gt; with you that I was involved with recently. In particular, creating video content for Youtube is such time-consuming that I decided to stop with that by end of 2023, at least “for some time”, until my personal stress level is “normalized” again. Unfortunately, now by end of 2024, it still is at 250%… Anyways!&lt;/p&gt;



&lt;p&gt;Having said that, I decided to &lt;strong&gt;restart my blog&lt;/strong&gt;. While many people told me that blogging is &lt;code&gt;@depreceated&lt;/code&gt; since the invention of VLogs, I need to say, it is just so much easier for me to write a blog article, that I decided to &lt;em&gt;ignore them&lt;/em&gt; and write some lines about my latest Open Source contribution. So here it is: &lt;strong&gt;My first blog entry in years!&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;But enough about me. What I &lt;em&gt;actually &lt;/em&gt;wanted to tell you today is that I am totally happy these days. The reason is that since this week, &lt;a href=&quot;https://jdk.java.net/24/&quot;&gt;JDK 24 EA b22&lt;/a&gt; is &lt;strong&gt;available for download&lt;/strong&gt;, and as you can see in the &lt;a href=&quot;https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/io/Reader.html#of(java.lang.CharSequence)&quot;&gt;&lt;em&gt;preliminary &lt;/em&gt;JavaDocs&lt;/a&gt;, &lt;strong&gt;my &lt;em&gt;very first&lt;/em&gt; addition to the official Java API&lt;/strong&gt; is contained: &lt;code&gt;&lt;strong&gt;Reader.of(CharSequence)&lt;/strong&gt;&lt;/code&gt; &lt;img alt=&quot;ðŸš€&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f680.png&quot; style=&quot;height: 1em;&quot; /&gt;!&lt;/p&gt;



&lt;p&gt;You might wonder &lt;strong&gt;what’s so crazy&lt;/strong&gt; about that, because (as you certainly know) I am a contributor to OpenJDK &lt;em&gt;since many years&lt;/em&gt;. Well, yes, I did contribute to OpenJDK (alias “to Java”) for long time, but all my contributions where &lt;em&gt;just “under the hood”&lt;/em&gt;. I have optimized execution performance, I improved JavaDocs, I added unit tests, and I refactored code. But this time, I added a complete new feature&lt;strong&gt; to the &lt;em&gt;public &lt;/em&gt;API&lt;/strong&gt;. It really feels so amazing to see that my work of the past few weeks now will help Java developers in their future projects to spare &lt;em&gt;some microseconds and some kilobytes&lt;/em&gt; &lt;strong&gt;per call&lt;/strong&gt;, and in sum, those approx. ten million developers (according to Oracle marketing) will sum up to &lt;strong&gt;considerable amounts of CO2 that my invention will spare&lt;/strong&gt;! &lt;img alt=&quot;ðŸŒž&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f31e.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;img alt=&quot;ðŸŒ�&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f30d.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;img alt=&quot;ðŸŒ´&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f334.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;Okay, so what actually is &lt;code&gt;&lt;strong&gt;Reader.of(CharSequence)&lt;/strong&gt;&lt;/code&gt; all about, how can you use it, and how does it spare resources?&lt;/p&gt;



&lt;p&gt;I think you all know what the class &lt;code&gt;StringReader&lt;/code&gt; is, and what to use it for: You need (for whatever reason) an implementation of the &lt;code&gt;Reader&lt;/code&gt; interface, and the source is a &lt;code&gt;String&lt;/code&gt;. At least that what it was &lt;em&gt;made&lt;/em&gt; for decades ago. In fact, looking at the actual uses in 2024, more often than not the source &lt;em&gt;isn’t&lt;/em&gt; a &lt;code&gt;String&lt;/code&gt; actually, but is (mostly for performance reasons) a &lt;code&gt;StringBuilder&lt;/code&gt; or &lt;code&gt;StringBuffer&lt;/code&gt;, and sometimes (mostly for technical reasons) a &lt;code&gt;CharBuffer&lt;/code&gt;. These classes all share one common interface, &lt;code&gt;&lt;strong&gt;CharSequence&lt;/strong&gt;&lt;/code&gt;, which is “the” interface of the class &lt;code&gt;String&lt;/code&gt;, too. Unfortunately, &lt;code&gt;StringReader&lt;/code&gt; is unable to accept &lt;code&gt;CharSequence&lt;/code&gt;; it only accepts &lt;code&gt;String&lt;/code&gt;. That’s too bad, because it means, most uses of &lt;code&gt;StringReader&lt;/code&gt; actually perform an intermediate &lt;code&gt;toString()&lt;/code&gt; operation, which creates a temporary copy &lt;em&gt;of the full content&lt;/em&gt; on the heap – just to throw it away later! &lt;img alt=&quot;ðŸ¤¦&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f926.png&quot; style=&quot;height: 1em;&quot; /&gt;Creating this copy is &lt;em&gt;anything but free&lt;/em&gt;! It imposes time to search a free place on the heap, to copy the content onto the heap, and to lateron GC (dispose and defragment) the &lt;em&gt;otherwise unused&lt;/em&gt; copy in turn. Time is not just money – &lt;strong&gt;This operation costs power, and power costs (even these days) CO2&lt;/strong&gt;! &lt;img alt=&quot;ðŸ™�&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f641.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;Ontop of that, most (possibly all) uses of &lt;code&gt;StringReader&lt;/code&gt; are &lt;strong&gt;single-threaded&lt;/strong&gt;. I investigated for some time but could find &lt;strong&gt;not a single&lt;/strong&gt; reason for accessing a &lt;code&gt;StringReader&lt;/code&gt; in a multi-threaded fashion. Unfortunately, &lt;code&gt;StringReader&lt;/code&gt; is &lt;em&gt;thread-safe&lt;/em&gt;: It internally uses the &lt;code&gt;synchronized&lt;/code&gt; keyword &lt;strong&gt;in every single method&lt;/strong&gt;. Each time. &lt;em&gt;For each single read&lt;/em&gt; in possibly a loop of &lt;em&gt;thousand&lt;/em&gt; iterations! And yes, you guess right: &lt;code&gt;synchronized&lt;/code&gt; a everything by fast. It slows down code considerably, for &lt;em&gt;zero&lt;/em&gt; benefit! And: &lt;strong&gt;No&lt;/strong&gt;, the JVM has &lt;strong&gt;no&lt;/strong&gt; a trick to speed this up in the single-threaded use cases – &lt;strong&gt;&lt;a href=&quot;https://openjdk.org/jeps/374&quot;&gt;that trick (“Biased Locking”) went away years ago&lt;/a&gt;&lt;/strong&gt; and the result is that &lt;a href=&quot;https://bugs.openjdk.org/browse/JDK-8254078&quot;&gt;&lt;strong&gt;synchronized is slow again&lt;/strong&gt;&lt;/a&gt;! &lt;img alt=&quot;ðŸ™�&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f641.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;Imagine you are writing a RESTful web server which returns JSON on &lt;code&gt;GET&lt;/code&gt;. JSON is nothing else but a character sequence. You build it from a non-trivial algorithm using a &lt;code&gt;StringBuilder&lt;/code&gt;. That particular JSON unfortunately is &lt;em&gt;non-cachable&lt;/em&gt;, as it contains information sent with the request or changing over time or provided by the real physical world. So the server possibly produces &lt;code&gt;tens of thousands&lt;/code&gt; of &lt;code&gt;StringBuilder&lt;/code&gt;s &lt;strong&gt;per second&lt;/strong&gt; and reads it using a &lt;code&gt;StringReader&lt;/code&gt;. Could you imagine what happens to your performance? Thanks to &lt;strong&gt;the combination of both effects&lt;/strong&gt; described earlier, &lt;strong&gt;you’re losing money&lt;/strong&gt; with every other customer contacting your server. YOUR money, BTW.&lt;/p&gt;



&lt;p&gt;This is exactly what happend in my latest commercial project, so I tried &lt;em&gt;to get rid of&lt;/em&gt; &lt;code&gt;StringReader&lt;/code&gt;. My first idea was to use &lt;strong&gt;&lt;a href=&quot;https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CharSequenceReader.html&quot;&gt;Apache IO’s &lt;code&gt;CharSequenceReader&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;, which looks &lt;em&gt;a bit old-school&lt;/em&gt;, but &lt;em&gt;immediately &lt;/em&gt;got me rid of both effects instantly! &lt;img alt=&quot;ðŸ‘�&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f44d.png&quot; style=&quot;height: 1em;&quot; /&gt; The problem with Apache IO is that it is &lt;strong&gt;rather huge&lt;/strong&gt;. Using lots of KBs of &lt;strong&gt;transitive dependencies&lt;/strong&gt; just for one single use case didn’t sound like a &lt;em&gt;smart &lt;/em&gt;option (but yes, this is the code &lt;em&gt;actually in production&lt;/em&gt; still – at least unless JDK 24 is published in Q1/25). Also, the customer was &lt;em&gt;not very pleased&lt;/em&gt; to adopt another third-party library into the game. And finally, the code of Apache IO is &lt;em&gt;not really eagerly&lt;/em&gt; maintained; they do bug fixes, but they abstain from using &lt;strong&gt;modern Java API&lt;/strong&gt;s (not even using multi-release JARs). Some will hate me for writing this, but the actual change rate didn’t look like “stable”, it looked to “dead” – agreed, this is subject to my personal interpretation. &lt;img alt=&quot;ðŸ¥´&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f974.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;Being an enthusiastic Open Source committer since decades, and being an OpenJDK contributor since years, I had the idea to tackle the problem at its root: &lt;code&gt;StringReader&lt;/code&gt;. So I proposed to provide a PR for a new public API, which was very much appreciated by the OpenJDK team. It was &lt;strong&gt;Alan Bateman&lt;/strong&gt; himself (Group Lead of JDK Core Libraries) who came up with the proposal to have a static factory, which culminated in me posting a &lt;a href=&quot;https://github.com/openjdk/jdk/pull/21371&quot;&gt;PR on Github&lt;/a&gt; about adding &lt;code&gt;&lt;strong&gt;Reader.of(CharSequence)&lt;/strong&gt;&lt;/code&gt;. After accepting the mandatory &lt;a href=&quot;https://bugs.openjdk.org/browse/JDK-8341596&quot;&gt;CSR&lt;/a&gt; &lt;strong&gt;it recently got merged&lt;/strong&gt;, and since JDK 24’s Eary Access Build 22 it &lt;strong&gt;is publicly available&lt;/strong&gt;. &lt;img alt=&quot;ðŸš€&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f680.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;BTW, look at &lt;a href=&quot;https://github.com/openjdk/jdk/blob/29882bfe7b7e76446a96862cd0a5e81c7e054415/src/java.base/share/classes/java/io/Reader.java#L197-L206&quot;&gt;the implementation&lt;/a&gt; of that Reader’s &lt;strong&gt;bulk-read&lt;/strong&gt; method. There is an ugly sequence of tricks to speed up performance. I will address this in &lt;a href=&quot;https://github.com/openjdk/jdk/pull/21730&quot;&gt;a subsequent upcoming PR&lt;/a&gt;. Stay tuned!&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;So if you want to gain the performance benefit, here is what you need to do:&lt;/strong&gt;&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Run your app on &lt;strong&gt;Java 24 EA b22+&lt;/strong&gt;.&lt;/li&gt;



&lt;li&gt;Replace &lt;strong&gt;all&lt;/strong&gt; occurances of &lt;code&gt;new StringReader(x)&lt;/code&gt; and &lt;code&gt;new CharSequenceReader(x)&lt;/code&gt; by &lt;code&gt;Reader.of(x)&lt;/code&gt;.&lt;/li&gt;



&lt;li&gt;If &lt;code&gt;x&lt;/code&gt; ends with &lt;code&gt;.toString()&lt;/code&gt; then remove that trailing &lt;code&gt;.toString()&lt;/code&gt; – unless the left side of &lt;code&gt;x&lt;/code&gt; is effectively &lt;strong&gt;not&lt;/strong&gt; a &lt;code&gt;CharSequence&lt;/code&gt;.&lt;/li&gt;



&lt;li&gt;&lt;em&gt;Note: If you actually use multiple threads to access the &lt;code&gt;Reader&lt;/code&gt;, &lt;strong&gt;don’t stick with&lt;/strong&gt; &lt;code&gt;StringReader&lt;/code&gt;, but simply surround your calls by a &lt;strong&gt;modern&lt;/strong&gt; means of synchronization, &lt;strong&gt;like a &lt;a href=&quot;https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/concurrent/locks/Lock.html&quot;&gt;Lock&lt;/a&gt;&lt;/strong&gt; – locks are faster than &lt;code&gt;synchronized&lt;/code&gt;.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Please exterminate &lt;code&gt;StringReader&lt;/code&gt; but adopt &lt;code&gt;Reader.of()&lt;/code&gt; ASAP!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;I would be happy if you could report the results. Just leave a comment!&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;So far for today! PARTY ON! &lt;img alt=&quot;ðŸ¤˜&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f918.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 02 Nov 2024 13:21:36 +0000</pubDate>
</item>
<item>
	<title>Webtide Blog: Back to the Future with Cross-Context Dispatch</title>
	<guid isPermaLink="false">https://webtide.com/?p=5190</guid>
	<link>https://webtide.com/back-to-the-future-with-cross-context-dispatch/</link>
	<description>&lt;h1 class=&quot;wp-block-heading&quot;&gt;Cross-Context Dispatch reintroduced to Jetty-12&lt;/h1&gt;



&lt;p&gt;With the release of Jetty 12.0.8, we’re excited to announce the (re)implementation of a somewhat maligned and deprecated feature: Cross-Context Dispatch. This feature, while having been part of the Servlet specification for many years, has seen varied levels of use and support. Its re-introduction in Jetty 12.0.8, however, marks a significant step forward in our commitment to supporting the diverse needs of our users, especially those with complex legacy and modern web applications.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Understanding Cross-Context Dispatch&lt;/h2&gt;



&lt;p&gt;Cross-Context Dispatch allows a web application to forward requests to or include responses from another web application within the same Jetty server. Although it has been available as part of the Servlet specification for an extended period, it was deemed optional with Servlet 6.0 of EE10, reflecting its status as a somewhat niche feature.&lt;/p&gt;



&lt;p&gt;Initially, Jetty 12 moved away from supporting Cross-Context Dispatch, driven by a desire to simplify the server architecture amidst substantial changes, including support for multiple environments (EE8, EE9, and EE10). These updates mean Jetty can now deploy web applications using either the &lt;code&gt;javax&lt;/code&gt; namespace (EE8) or the &lt;code&gt;jakarta&lt;/code&gt; namespace (EE9 and EE10), all using the latest optimized jetty core implementations of HTTP: v1, v2 or v3.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Reintroducing Cross-Context Dispatch&lt;/h2&gt;



&lt;p&gt;The decision to reintegrate Cross-Context Dispatch in Jetty 12.0.8 was influenced significantly by the needs of our commercial clients, some who still leveraging this feature in their legacy applications. Our commitment to supporting our clients’ requirements, including the need to maintain and extend legacy systems, remains a top priority. &lt;/p&gt;



&lt;p&gt;One of the standout features of the newly implemented Cross-Context Dispatch is its ability to bridge applications across different environments. This means a web application based on the &lt;code&gt;javax&lt;/code&gt; namespace (EE8) can now dispatch requests to, or include responses from, a web application based on the &lt;code&gt;jakarta&lt;/code&gt; namespace (EE9 or EE10). This functionality opens up new pathways for integrating legacy applications with newer, modern systems.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Looking Ahead&lt;/h2&gt;



&lt;p&gt;The reintroduction of Cross-Context Dispatch in Jetty 12.0.8 is more than just a nod to legacy systems; it can be used as a bridge to the future of Java web development. By allowing for seamless interactions between applications across different Servlet environments, Jetty-12 opens the possibility of incremental migration away from legacy web applications. &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 16 May 2024 01:31:21 +0000</pubDate>
</item>
<item>
	<title>Jan Supol: HTTP Patch with Jersey Client on JDK 16+</title>
	<guid isPermaLink="true">http://blog.supol.cz/?p=320</guid>
	<link>http://blog.supol.cz/?p=320</link>
	<description>Jakarta REST provides a Client API, implemented by Jersey Client. The default implementation is based on the Java HttpUrlConnection. Unfortunately, the HttpUrlConnection supports only HTTP methods defined in the original HTTP/1.1 RFC 2616. It will never support for instance HTTP … &lt;a href=&quot;http://blog.supol.cz/?p=320&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;→&lt;/span&gt;&lt;/a&gt;</description>
	<pubDate>Fri, 26 Apr 2024 11:26:35 +0000</pubDate>
</item>
<item>
	<title>Jean-François James: Monitoring Java Virtual Threads</title>
	<guid isPermaLink="false">http://jefrajames.fr/?p=789</guid>
	<link>https://jefrajames.wordpress.com/2024/01/10/monitoring-java-virtual-threads/</link>
	<description>Introduction In my previous article, we’ve seen what Virtual Threads (VTs) are, how they differ from Platform Threads (PTs), and how to use them with Helidon 4. In simple terms, VTs bring in a new concurrency model. Instead of using many PTs that can get blocked, we use a few of them that hardly ever […]</description>
	<pubDate>Wed, 10 Jan 2024 17:14:14 +0000</pubDate>
</item>
<item>
	<title>Tomitribe: Moving from javax to jakarta namespace</title>
	<guid isPermaLink="false">https://tomitribe4dev.wpengine.com/?p=10164</guid>
	<link>https://tomitribe.com/blog/moving-from-javax-to-jakarta-namespace/</link>
	<description>&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This blog aims at giving some pointers in order to address the challenge related to the switch from &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This is one of the biggest changes in Java of the latest 20 years. No doubt. The entire ecosystem is impacted. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Not only Java EE or Jakarta EE Application servers, but also libraries of any kind (Jackson, CXF, Hibernate, Spring to name a few). For instance, it took Apache TomEE about a year to convert all the source code and dependencies to the new &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This blog is written from the user perspective, because the shift from &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;is as impacting for application &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;providers than it is for libraries or application servers. There have been a couple of attempts to study the impact &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;and investigate possible paths to make the change as smooth as possible. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The problem is harder than it appears to be. The `javax` package is of course in the import section of a class, but it can be in Strings as well if you use the Java Reflection API for instance. Using Byte Code tools like ASM also makes the problem more complex, but also service loader mechanisms and many more. We will see that there are many ways to approach the problem, using byte code, converting the sources directly, but none are perfect.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Bytecode enhancement approach&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The first legitimate approach that comes to our mind is the byte code approach. The goal is to keep the &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;as much as possible and use bytecode enhancement to convert binaries.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Compile time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;It is possible to do a post treatment on the libraries and packages to transform archives such as then are converted to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace. &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://maven.apache.org/plugins/maven-shade-plugin/[Maven Shade plugin]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The Maven shade plugin has the ability to relocate packages. While the primary purpose isn’t to move from &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;package, it is possible to use it to relocate small libraries when they aren’t ready yet. We used this approach &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;in TomEE itself or in third party libraries such as Apache Johnzon (JSONB/P implementation).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Here is an example in TomEE where we use Maven Shade Plugin to transform the Apache ActiveMQ Client library https://github.com/apache/tomee/blob/main/deps/activemq-client-shade/pom.xml&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This approach is not perfect, especially when you have a multi module library. For Instance, if you have a project with 2 &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;modules, A depends on B. You can use the shade plugin to convert the 2 modules and publish them using a classifier. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The issue then is when you need A, you have to exclude B so that you can include it manually with the right classifier.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;We’d say it works fine but for simple cases because it breaks the dependency management in Maven, especially with &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;transitive dependencies. It also break IDE integration because sources and javadoc won’t match.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://projects.eclipse.org/projects/technology.transformer[Eclipse Transformer]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The Eclipse Transformer is also a generic tool, but it’s been heavily developed for the &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;change. It operates on resources such as&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;Simple resources:&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Java class files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;OSGi feature manifest files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Properties files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Service loader configuration files&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Text files (of several types: java source, XML, TLD, HTML, and JSP)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;b&gt;Container resources:&lt;/b&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Directories&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Java archives (JAR, WAR, RAR, and EAR files)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;ZIP archives&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;It can be configured using Java Properties files to properly convert Java Modules, classes, test resources. This is the a&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;pproach we used for Apache TomEE 9.0.0-M7 when we first tried to convert to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;. It had limitation, so we had &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to then find tricks to solve issues. As it was converting the final distribution and not the individual artifacts, it &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;was impossible for users to use Arquillian or the Maven plugin. They were not converted.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://github.com/apache/tomcat-jakartaee-migration[Apache Tomcat Migration tool]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This tool can operate on a directory or an archive (zip, ear, jar, war). It can migrate quite easily an application based on the set of &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;specifications supported in Tomcat and a few more. It has the notion of profile so that you can ask it to convert more. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;You can run it using the ANT task (within Maven or not), and there is also a command line interface to run it easily.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Deploy time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;When using application server, it is sometimes possible to step in the deployment process and do the conversion of the &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;binaries prior to their deployment.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://github.com/apache/tomcat-jakartaee-migration[Apache Tomcat/TomEE migration tool]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Mind that by default, the tool converts only what’s being supported by Apache Tomcat and a couple of other APIs. It &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;does not convert all specifications supported in TomEE, like JAX RS for example. And Tomcat does not provide yet any &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;way to configure it.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;We haven’t seen any working solution in this area. Of course, we could imagine a JavaAgent approach that converts the &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;bytecode right when it gets loaded by the JVM. The startup time is seriously impacted, and it has to be done every time &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;the JVM restarts or loads a class in a classloader. Remember that a class can be loaded multiple times in different classloaders.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Source code enhancement approach&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This may sound like the most impacting but this is probably also the most secured one. We also strongly believe that embracing the change sooner is preferable rather than later. As mentioned, this is one of the biggest breaking change in &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Java of the last 20 years. Since Java EE moved to Eclipse to become Jakarta, we have noticed a change in the release cadence. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Releases are not more frequent and more changes are going to happen. Killing the technical depth as soon as possible is &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;probably the best when it’s so impacting.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;There are a couple of tools we tried. There are probably more in the ecosystem, and also some in-house developments.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;[&lt;/b&gt;&lt;b&gt;IMPORTANT&lt;/b&gt;&lt;b&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This is usually a one shoot operation. It won’t be perfect and no doubt it will require adjustment because there is &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;no perfect tool that can handle all cases.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;IntelliJ IDEA&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;IntelliJ IDEA added a refactoring capability to its IDE in order to convert sources to the new `jakarta` namespace. I haven’t tested it myself, but it may help to do the first big step when you don’t really master the scripting approach below.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Scripting approach&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;For simple case, and we used that approach to do most of the conversion in TomEE, you can create your own simple tool to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;convert sources. For instance, SmallRye does that with their MicroProfile implementations. Here is an example &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://github.com/smallrye/smallrye-config/blob/main/to-jakarta.sh&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Using basic Linux commands, it converts from &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace and then the result is pushed to a dedicated &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;branch. The benefit is that they have 2 source trees with different artifacts, the dependency management isn’t broken.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;One source tree is the reference and they add to the script the necessary commands to convert additional things on demand.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://projects.eclipse.org/projects/technology.transformer[Eclipse Transformer]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Because the Eclipse Transformer can operate on text files, it can be easily used to migrate the sources from &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Producing converted artifacts for applications for consumption&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Weather you are working on Open Source or not, someone will consume your artifacts. If you are using Maven for example, &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;you may ask yourself what option is the best especially if you maintain the 2 branches &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;and &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;NOTE&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;It does not matter if you use the bytecode or the source code approach.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;Updating version or artifactId&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This is probably the more practical solution. Some project like Arquillian for example decided to go using a different &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;artifact name (-jakarta suffix) because the artifact is the same and solves the same problem, so why bringing a technical &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;concerned into the name? I’m more in favor of using the version to mark the namespace change. It is somehow an major API &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;change that I’d rather emphasize using a major version update.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;IMPORTANT&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Mind that this only works if both &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;and &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;APIs are backward compatible. Otherwise, it won’t work&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;Using Maven classifiers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This is not an option we would recommend. Unfortunately some of our dependencies use this approach and it has many &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;drawbacks. It’s fine for a quick test, but as I mentioned previously, it badly impacts how Maven works. If you pull a &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;transformed artifact, you may get a transitive and not transformed dependency. This is the case for multi module project &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;as well.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Another painful side effect is that javadoc and sources are still linked to the original artifact, so you will have a hard &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;time to debug in the IDE.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Conclusion&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;We tried the bytecode approach ourselves in TomEE with the hope we could avoid maintaining 2 source trees, one for &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;javax&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;and the other one for &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;jakarta&lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;` &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;namespace. Unfortunately, as we have seen before the risk is too important and there are &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;too many edge cases not covered. Apache TomEE runs about 60k tests (including TCK) and our confidence wasn’t good enough. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Even though the approach has some benefits and can work for simple use cases, like converting a small utility tool, it does &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;not fit in our opinion for real applications.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://tomitribe.com/blog/moving-from-javax-to-jakarta-namespace/&quot; rel=&quot;nofollow&quot;&gt;Moving from javax to jakarta namespace&lt;/a&gt; appeared first on &lt;a href=&quot;https://tomitribe.com&quot; rel=&quot;nofollow&quot;&gt;Tomitribe&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 12 Oct 2023 14:32:06 +0000</pubDate>
</item>
<item>
	<title>Jean-François James: Running  MicroProfile reactive with Helidon Nima and Virtual Threads</title>
	<guid isPermaLink="false">http://jefrajames.fr/?p=653</guid>
	<link>https://jefrajames.wordpress.com/2023/09/20/reactive-microprofile-with-helidon-nima/</link>
	<description>I recently became interested in Helidon as part of my investigations into Java Loom. Indeed, version 4 is natively based on Virtual Threads. Before going any further, let’s introduce quickly Helidon. Helidon is an Open Source (source on GitHub, Apache V2 licence) managed by Oracle that enables to develop lightweight cloud-native Java application with fast […]</description>
	<pubDate>Wed, 20 Sep 2023 17:29:53 +0000</pubDate>
</item>
<item>
	<title>Mike Milinkovich: New Survey: How Do Developers Feel About Enterprise Java in 2023?</title>
	<guid isPermaLink="false">http://eclipse-foundation.blog/?p=1740</guid>
	<link>https://eclipse-foundation.blog/2023/09/19/new-survey-how-do-developers-feel-about-enterprise-java-in-2023/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;The &lt;a href=&quot;https://outreach.eclipse.foundation/jakarta-ee-developer-survey-2023&quot;&gt;results of the 2023 Jakarta EE Developer Survey&lt;/a&gt; are now available! For the sixth year in a row, we’ve reached out to the enterprise Java community to ask about their preferences and priorities for cloud native Java architectures, technologies, and tools, their perceptions of the cloud native application industry, and more.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;From these results, it is clear that open source cloud native Java is on the rise following the release of Jakarta EE 10.The number of respondents who have migrated to Jakarta EE continues to grow, with 60% saying they have already migrated, or plan to do so within the next 6-24 months. These results indicate steady growth in the use of Jakarta EE and a growing interest in cloud native Java overall.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;When comparing the survey results to 2022, usage of Jakarta EE to build cloud native applications has remained steady at 53%. Spring/Spring Boot, which relies on some Jakarta EE specifications, continues to be the leading Java framework in this category, with usage growing from 57% to 66%. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Since the September 2022 release, Jakarta EE 10 usage has grown to 17% among survey respondents. This community-driven release is attracting a growing number of application developers to adopt Jakarta EE 10 by offering new features and updates to Jakarta EE. An equal number of developers are running Jakarta EE 9 or 9.1 in production, while 28% are running Jakarta EE 8. That means the increase we are seeing in the migration to Jakarta EE is mostly due to the adoption of Jakarta EE 10, as compared to Jakarta EE 9/9.1 or Jakarta EE 8.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The Jakarta EE Developer Survey also gives us a chance to get valuable feedback on features from the latest Jakarta EE release, as well as what direction the project should take in the future. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Respondents are most excited about Jakarta EE Core Profile, which was introduced in the Jakarta EE 10 release as a subset of Web Profile specifications designed for microservices and ahead-of-time compilation. When it comes to future releases, the community is prioritizing better support for Kubernetes and microservices, as well as adapting Java SE innovations to Jakarta EE — a priority that has grown in popularity since 2022. This is a good indicator that the Jakarta EE 11 release plan is on the right direction by adopting new Java SE 21 features.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;2,203 developers, architects, and other tech professionals participated in the survey, a 53% increase from last year. This year’s survey was also available in Chinese, Japanese, Spanish &amp;amp; Portuguese, making it easier for Java enthusiasts around the world to share their perspectives.  Participation from the Chinese Jakarta EE community was particularly strong, with over 27% of the responses coming from China. By hearing from more people in the enterprise Java space, we’re able to get a clearer picture of what challenges developers are facing, what they’re looking for, and what technologies they are using. Thank you to everyone who participated! &lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Learn More&lt;/h2&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;We encourage you to &lt;a href=&quot;https://outreach.eclipse.foundation/jakarta-ee-developer-survey-2023&quot;&gt;download the report&lt;/a&gt; for a complete look at the enterprise Java ecosystem. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;If you’d like to get more information about Jakarta EE specifications and our open source community, sign up for one of our &lt;a href=&quot;https://accounts.eclipse.org/mailing-list&quot;&gt;mailing lists&lt;/a&gt; or join the conversation on &lt;a href=&quot;https://eclipsefoundationhq.slack.com/?redir=%2Fssb%2Fredirect&quot;&gt;Slack&lt;/a&gt;. If you’d like to participate in the Jakarta EE community, learn how to get started on our &lt;a href=&quot;https://jakarta.ee/community/get-involved/&quot;&gt;website&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Tue, 19 Sep 2023 13:00:00 +0000</pubDate>
</item>
<item>
	<title>Reza Rahman: Jakarta EE and MicroProfile at EclipseCon Community Day 2022</title>
	<guid isPermaLink="false">https://reza-rahman.me/?p=2126</guid>
	<link>https://reza-rahman.me/2022/11/19/jakarta-ee-and-microprofile-at-eclipsecon-community-day-2022/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Community Day at EclipseCon 2022 was held in person on Monday, October 24 in Ludwigsburg, Germany. Community Day has always been a great event for Eclipse working groups and project teams, including Jakarta EE/MicroProfile. This year was no exception.  A number of great sessions were delivered from prominent folks in the community. The following are the details including session materials. The agenda can still be found &lt;a href=&quot;https://www.eclipsecon.org/2022/jakarta-ee-community-day&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. All the materials can be found &lt;a href=&quot;https://drive.google.com/drive/folders/1cIu7gMsG-FQpoVJ7O9fJNQUo7gGCwGQe?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-2137&quot; height=&quot;202&quot; src=&quot;https://i0.wp.com/reza-rahman.me/wp-content/uploads/2022/11/eclipsecon2022_banner.png?resize=750%2C202&amp;amp;ssl=1&quot; width=&quot;750&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Jakarta EE Community State of the Union&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The first session of the day was a Jakarta EE community state of the union delivered by Tanja Obradovic, Ivar Grimstad and Shabnam Mayel. The session included a quick overview of Jakarta EE releases, how to get involved in the work of producing the specifications, a recap of the important Jakarta EE 10 release and as well as a view of what’s to come in Jakarta EE 11. The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/1ZCYXEzPrp4Ml-OQydP4zpYzQfqFtwIPn/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Jakarta Concurrency – What’s Next&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Payara CEO Steve Millidge covered Jakarta Concurrency. He discussed the value proposition of Jakarta Concurrency, the innovations delivered in Jakarta EE 10 (including CDI based @Asynchronous, @ManagedExecutorDefinition, etc) and the possibilities for the future (including CDI based @Schedule, @Lock, @MaxConcurrency, etc). The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/1vh_ZLdj6cXGISaB7_lkNfTgplU06gdP5/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. There are some excellent code examples included.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Jakarta Security – What’s Next&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Werner Keil covered Jakarta Security. He discussed what’s already done in Jakarta EE 10 (including OpenID Connect support) and everything that’s in the works for Jakarta EE 11 (including CDI based @RolesAllowed). The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/19BQ7bgDhOud7NYPCgVEQFKBMEtbhDulR/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Jakarta Data – What’s Coming&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;IBM’s Emily Jiang kindly covered Jakarta Data. This is a brand new specification aimed towards Jakarta EE 11. It is a higher level data access abstraction similar to Spring Data and DeltaSpike Data. It encompasses both Jakarta Persistence (JPA) and Jakarta NoSQL. The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/1MiW3kNtBB2U42X57hVvcelpSIuc4xECv/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. There are some excellent code examples included.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;MicroProfile Community State of the Union&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Emily also graciously delivered a MicroProfile state of the union. She covered what was delivered in MicroProfile 5, including alignment with Jakarta EE 9.1. She also discussed what’s coming soon in MicroProfile 6 and beyond, including very clear alignment with the Jakarta EE 10 Core Profile. The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/1K_mTAvv-84A-BbcpLhOPrHKcKczjkqJ5/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. There are some excellent technical details included.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;MicroProfile Telemetry – What’s Coming&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Red Hat’s Martin Stefanko covered MicroProfile Telemetry. Telemetry is a brand new specification being included in MicroProfile 6. The specification essentially supersedes MicroProfile Tracing and possibly MicroProfile Metrics too in the near future. This is because the OpenTracing and OpenCensus projects merged into a single project called OpenTelemetry. OpenTelemetry is now the de facto standard defining how to collect, process, and export telemetry data in microservices. It makes sense that MicroProfile moves forward with supporting OpenTelemetry. The slides are embedded below and linked &lt;a href=&quot;https://drive.google.com/file/d/1RFBAmgt1p1GMrSWHTNWDd5CLtCgqoTQr/view?usp=sharing&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. There are some excellent technical details and code examples included.&lt;/p&gt;



&lt;p align=&quot;center&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;See You There Next Time?&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Overall, it was an honor to organize the Jakarta EE/MicroProfile agenda at EclipseCon Community Day one more time. All speakers and attendees should be thanked. Perhaps we will see you at Community Day next time? It is a great way to hear from some of the key people driving Jakarta EE and MicroProfile. You can attend just Community Day even if you don’t attend EclipseCon. The fee is modest and includes lunch as well as casual networking.&lt;/p&gt;</description>
	<pubDate>Sat, 19 Nov 2022 22:39:02 +0000</pubDate>
</item>
<item>
	<title>Ivo Woltring: JFall 2022</title>
	<guid isPermaLink="true">http://www.ivonet.nl/2022/11/03/jfall-2022/</guid>
	<link>http://www.ivonet.nl/2022/11/03/jfall-2022/</link>
	<description>&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_1.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;An impression of JFall by yours truly.&lt;/p&gt;
&lt;a id=&quot;more&quot;&gt;&lt;/a&gt;
&lt;h1 id=&quot;keynote&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#keynote&quot; title=&quot;keynote&quot;&gt;&lt;/a&gt;keynote&lt;/h1&gt;&lt;p&gt;Sold out!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_2.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Packet room!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_3.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Very nice first keynote speaker by Saby Sengupta about the path to transform.&lt;br /&gt;He is a really nice storyteller. He had us going. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dutch people, wooden shoes, wooden hat, would not listen&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Saby&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;lol&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_4.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Get the answer to three &lt;strong&gt;&lt;strong&gt;why&lt;/strong&gt;&lt;/strong&gt; questions. If the answers stop after the first why. It may not be a good idea. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_5.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This great first keynote is followed by the very well known Venkat Subramaniam about &lt;strong&gt;The Art of Simplicity&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_6.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_7.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The question is not &lt;strong&gt;what can we add?&lt;/strong&gt; But &lt;strong&gt;What can we remove?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Simple fails less&lt;/p&gt;
&lt;p&gt;Simple is elegant&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All in al a great keynote! Loved it. &lt;/p&gt;
&lt;h1 id=&quot;Design-Patterns-in-the-light-of-Lambdas&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#Design-Patterns-in-the-light-of-Lambdas&quot; title=&quot;Design Patterns in the light of Lambdas&quot;&gt;&lt;/a&gt;Design Patterns in the light of Lambdas&lt;/h1&gt;&lt;p&gt;By &lt;strong&gt;Venkat Subramaniam&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_8.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The GOF are kind of the grand parents of our industry. The worst thing they have done is write the damn book.&lt;br /&gt;â€” Venkat&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The quote is in the context of that writing down grandmas fantastic recipe  does not work as it is based on the skill of grandma and not the exact amount of the ingredients. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_9.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_19.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_10.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The cleanup is the responsibility of the Resource class. Much better than asking developers to take care of it. It will be forgotten!&lt;/p&gt;
&lt;p&gt;The more powerful a language becomes the less we need to talk about patterns. Patterns become practices we use.  We do not need to put in extra effort. &lt;/p&gt;
&lt;p&gt;I love his way of presenting, but this is the one of those times - I guess - that he is hampered by his own succes. The talk did not go deep into stuff. During his talk I just about covered 5 not too difficult subjects. I missed his speed and depth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Still a great talk though.&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;lunch&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#lunch&quot; title=&quot;lunch&quot;&gt;&lt;/a&gt;lunch&lt;/h1&gt;&lt;p&gt;Was actually very nice!&lt;/p&gt;
&lt;h1 id=&quot;NLJUG-update-keynote&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#NLJUG-update-keynote&quot; title=&quot;NLJUG update keynote&quot;&gt;&lt;/a&gt;NLJUG update keynote&lt;/h1&gt;&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_11.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Java Magazine was mentioned we (as Editors) had to shout for that! &lt;/p&gt;
&lt;p&gt;Please contact me (@ivonet) if you have ambitions to either be an author or maybe even as a fellow editor of the magazine. We are searching for a new Editor now. &lt;/p&gt;
&lt;p&gt;Then the voting for the Innovation Awards. &lt;/p&gt;
&lt;p&gt;I kinda missed the next keynote by ING because I was playing with a rubix cube and I did not really like his talk&lt;/p&gt;
&lt;h1 id=&quot;jakarta-EE-10-platform&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#jakarta-EE-10-platform&quot; title=&quot;jakarta EE 10 platform&quot;&gt;&lt;/a&gt;jakarta EE 10 platform&lt;/h1&gt;&lt;p&gt;by Ivar Grimstad&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_12.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ivar talks about the specification of Jakarta EE. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_13.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_14.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_15.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To create a &lt;strong&gt;lite&lt;/strong&gt; version of CDI it is possible to start doing things at build time and facilitate other tools like GraalVM and Quarkus. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_16.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;He gives nice demos on how to migrate code to work in de jakarta namespace. &lt;/p&gt;
&lt;p&gt;To start your own Jakarta EE application just go to &lt;a href=&quot;https://start.jakarta.ee&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;start.jakarta.ee&lt;/a&gt; en follow the very simple UI instructions   &lt;/p&gt;
&lt;p&gt;I am very proud to be the creator of that UI. Thanks, Ivar for giving me a shoutout for that during your talk. More cool stuff will follow soon. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_17.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_20.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_21.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Be prepared to do some namespace changes when moving from Java EE 8 to Jakarta EE. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2022/jfall-2022/jfall-2022_18.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All slides &lt;a href=&quot;https://www.slideshare.net/ivargrimstad/modern-and-lightweight-cloud-application-development-with-jakarta-ee-10&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#conclusion&quot; title=&quot;conclusion&quot;&gt;&lt;/a&gt;conclusion&lt;/h1&gt;&lt;p&gt;I had a fantastic day. For me, it is mainly about the community and seeing all the people I know in the community. I totally love the vibe of the conference and I think it is one of the best organized venues.&lt;/p&gt;
&lt;p&gt;See you at JSpring.&lt;/p&gt;
&lt;p&gt;Ivo.&lt;/p&gt;</description>
	<pubDate>Fri, 04 Nov 2022 09:56:09 +0000</pubDate>
</item>
<item>
	<title>Mike Milinkovich: Survey Says: Confidence Continues to Grow in the Jakarta EE Ecosystem</title>
	<guid isPermaLink="false">http://eclipse-foundation.blog/?p=1695</guid>
	<link>https://eclipse-foundation.blog/2022/09/26/survey-says-confidence-continues-to-grow-in-the-jakarta-ee-ecosystem/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;The results of the &lt;a href=&quot;https://outreach.eclipse.foundation/jakarta-ee-developer-survey-2022&quot;&gt;2022 Jakarta EE Developer Survey&lt;/a&gt; are very telling about the current state of the enterprise Java developer community. They point to increased confidence about Jakarta EE and highlight how far Jakarta EE has grown over the past few years.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Strong Turnout Helps Drive Future of Jakarta EE&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The fifth annual survey is one of the longest running and best-respected surveys of its kind in the industry. This year’s turnout was fantastic: From March 9 to May 6, a total of 1,439 developers responded. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;This is great for two reasons. First, obviously, these results help inform the Java ecosystem stakeholders about the requirements, priorities and perceptions of enterprise developer communities. The more people we hear from, the better picture we get of what the community wants and needs. That makes it much easier for us to make sure the work we’re doing is aligned with what our community is looking for. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The other reason is that it helps us better understand how the cloud native Java world is progressing. By looking at what community members are using and adopting, what their top goals are and what their plans are for adoption, we can better understand not only what we should be working on today, but tomorrow and for the future of Jakarta EE. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Findings Indicate Growing Adoption and Rising Expectations&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Some of the survey’s key findings include:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Jakarta EE is the basis for the top frameworks used for building cloud native applications.&lt;/li&gt;



&lt;li&gt;The top three frameworks for building cloud native applications, respectively, are Spring/Spring Boot, Jakarta EE and MicroProfile, though Spring/Spring Boot lost ground this past year. It’s important to note that Spring/SpringBoot relies on Jakarta EE developments for its operation and is not competitive with Jakarta EE. Both are critical ingredients to the healthy enterprise Java ecosystem. &lt;/li&gt;



&lt;li&gt;Jakarta EE 9/9.1 usage increased year-over-year by 5%.&lt;/li&gt;



&lt;li&gt;Java EE 8, Jakarta EE 8, and Jakarta EE 9/9.1 hit the mainstream with 81% adoption. &lt;/li&gt;



&lt;li&gt;While over a third of respondents planned to adopt, or already had adopted Jakarta EE 9/9.1, nearly a fifth of respondents plan to skip Jakarta EE 9/9.1 altogether and adopt Jakarta EE 10 once it becomes available. &lt;/li&gt;



&lt;li&gt;Most respondents said they have migrated to Jakarta EE already or planned to do so within the next 6-24 months.&lt;/li&gt;



&lt;li&gt;The top three community priorities for Jakarta EE are:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Native integration with Kubernetes (same as last year)&lt;/li&gt;



&lt;li&gt;Better support for microservices (same as last year)&lt;/li&gt;



&lt;li&gt;Faster support from existing Java EE/Jakarta EE or cloud vendors (new this year)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Two of the results, when combined, highlight something interesting:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;19% of respondents planned to skip Jakarta EE 9/9.1 and go straight to 10 once it’s available &lt;/li&gt;



&lt;li&gt;The new community priority — faster support from existing Java EE/Jakarta EE or cloud vendors — really shows the growing confidence the community has in the ecosystem&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;After all, you wouldn’t wait for a later version and skip the one that’s already available, unless you were confident that the newer version was not only going to be coming out on a relatively reliable timeline, but that it was going to be an improvement. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And this growing hunger from the community for faster support really speaks to how far the ecosystem has come. When we release a new version, like when we released Jakarta EE 9, it takes some time for the technology implementers to build the product based on those standards or specifications. The community is becoming more vocal in requesting those implementers to be more agile and quickly pick up the new versions. That’s definitely an indication that developer demand for Jakarta EE products is growing in a healthy way. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Learn More&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;If you’d like to learn more about the project, there are several Jakarta EE &lt;a href=&quot;https://accounts.eclipse.org/mailing-list&quot;&gt;mailing lists&lt;/a&gt; to sign up for. You can also join the conversation on &lt;a href=&quot;https://eclipsefoundationhq.slack.com/?redir=%2Fssb%2Fredirect&quot;&gt;Slack&lt;/a&gt;. And if you want to get involved, start by choosing a &lt;a href=&quot;https://github.com/eclipse-ee4j&quot;&gt;project&lt;/a&gt;, sign up for its mailing list and start communicating with the team.&lt;/p&gt;</description>
	<pubDate>Mon, 26 Sep 2022 13:00:00 +0000</pubDate>
</item>
<item>
	<title>Jakarta EE Ambassadors: Jakarta EE 10 has Landed!</title>
	<guid isPermaLink="false">http://jakartaee-ambassadors.io/?p=1361</guid>
	<link>https://jakartaee-ambassadors.io/2022/09/22/jakarta-ee-10-released/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;The Jakarta EE Ambassadors are thrilled to see &lt;a href=&quot;https://jakarta.ee/release/10/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE 10&lt;/a&gt; being released! This is a milestone release that bears great significance to the Java ecosystem. Jakarta EE 8 and Jakarta EE 9.x were important releases in their own right in the process of transitioning Java EE to a truly open environment in the Eclipse Foundation. However, these releases did not deliver new features. Jakarta EE 10 changes all that and begins the vital process of delivering long pending new features into the ecosystem at a regular cadence.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://lh3.googleusercontent.com/FmdT-OjgaxueMHphuCQ1krwa89iK8lk_a4URjCK5cXET11FCVgtPDy0svtHGq1bS_zQV9H3jO8BVUMOf7TxWOvQhHxDiIihEF51usvQSjB7Zq_xgyl5TNZxIjOhodYQrWzemcevyACENnTEl_gghT2oRVqh9cA24_kbpzDFUI0AOUgc8yvs0m1K0bA&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;There are quite a few changes that were delivered – here are some key themes and highlights:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;CDI Alignment&lt;/strong&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;@Asynchronous in Concurrency&lt;/li&gt;



&lt;li&gt;Better CDI support in Batch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Java SE Alignment&lt;/strong&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Support for Java SE 11, Java SE 17&lt;/li&gt;



&lt;li&gt;CompletionStage, ForkJoinPool, parallel streams in Concurrency&lt;/li&gt;



&lt;li&gt;Bootstrap APIs for REST&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Closing standardization gaps&lt;/strong&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;OpenID Connect support in Security, @ManagedExecutorDefinition, UUID as entity keys, more SQL support in Persistence queries, multipart/form-data support in REST, @ClientWindowScoped in Faces, pure Java Faces views&lt;/li&gt;



&lt;li&gt;CDI Lite/Core Profile to enable next generation cloud native runtimes – MicroProfile will likely align with CDI Lite/Jakarta EE Core&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Deprecation/removal&lt;/strong&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;@Context annotation in REST, EJB Entity Beans, embeddable EJB container, deprecated Servlet/Faces/CDI features&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;While there are many features that we identified in our &lt;a href=&quot;https://jakartaeeambassadors.wordpress.com/guide-to-contributing-to-jakarta-ee-10/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Jakarta EE 10 Contribution Guide&lt;/a&gt; that did not make it yet, this is still a very solid release that everyone in the Java ecosystem will benefit from, including Spring, MicroProfile and Quarkus. You can &lt;a href=&quot;https://speakerdeck.com/reza_rahman/jakarta-ee-present-and-future?slide=8&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;see here&lt;/a&gt; what was delivered, whatâ€™s on the way and what gaps still remain. You can try Jakarta EE 10 out now using &lt;a href=&quot;https://jakarta.ee/compatibility/certification/10/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;compatible implementations&lt;/a&gt; like GlassFish, Payara, WildFly and Open Liberty. Jakarta EE 10 is proof in the pudding that the community, including major stakeholders, has not only made it through the transition to the Eclipse Foundation but now is beginning to thrive once again.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Many Ambassadors helped make this release a reality such as Arjan Tijms, Werner Keil, Markus Karg, Otavio Santana, Ondro Mihalyi and many more. The Ambassadors will now focus on enabling the community to evangelize Jakarta EE 10 including speaking, blogging, trying out implementations, and advocating for real world adoption. We will also work to enable the community to continue to contribute to Jakarta EE by producing an EE 11 Contribution Guide in the coming months. Please stay tuned and &lt;a href=&quot;https://jakartaeeambassadors.wordpress.com/getting-involved/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;join us&lt;/a&gt;.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Jakarta EE is truly moving forward – the next phase of the platform’s evolution is here!&lt;/p&gt;</description>
	<pubDate>Thu, 22 Sep 2022 15:48:16 +0000</pubDate>
</item>
<item>
	<title>Vladimir V. Bychkov: Java Reflections unit-testing</title>
	<guid isPermaLink="true">https://blog.bychkov.name/reflections-junit-automatized.html</guid>
	<link>https://blog.bychkov.name/reflections-junit-automatized.html</link>
	<description>How make java code with reflections more stable? Unit tests can help with this problem. This article introduces annotations @CheckConstructor, @CheckField, @CheckMethod to create so unit tests automatically</description>
	<pubDate>Wed, 13 Jul 2022 21:06:18 +0000</pubDate>
</item>
<item>
	<title>Ivo Woltring: Java EE - Jakarta EE Initializr</title>
	<guid isPermaLink="true">http://www.ivonet.nl/2022/05/05/javaee---jakarta-ee-initializr/</guid>
	<link>http://www.ivonet.nl/2022/05/05/javaee---jakarta-ee-initializr/</link>
	<description>&lt;p&gt;&lt;img src=&quot;https://www.ivonet.nl/images/2019/javaee---jakarta-ee-initializr/javaee---jakarta-ee-initializr.jpg&quot; style=&quot;width: 50%; height: 50%; display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Getting started with Jakarta EE just became even easier!&lt;/p&gt;
&lt;h1 id=&quot;Get-started&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#Get-started&quot; title=&quot;Get started&quot;&gt;&lt;/a&gt;Get started&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ivo2u.nl/oq&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Java EE /Jakarta EE - Initializr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;Hot-new-Update&quot;&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://www.ivonet.nl/categories/jakarta-ee/atom.xml#Hot-new-Update&quot; title=&quot;Hot new Update!&quot;&gt;&lt;/a&gt;Hot new Update!&lt;/h1&gt;&lt;p&gt;Moved from the Apache 2 license to the Eclipse Public License v2 for the newest version of the archetype as described below.&lt;br /&gt;As a start for a possible collaboration with the Eclipse &lt;a href=&quot;https://start.jakarta.ee/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;start&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;New Archetype with JakartaEE 9&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JakartaEE 9 + Payara 5.2022.2 + MicroProfile 4.1 running on Java 17&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;And the docker image is also ready for x86_64 (amd64) AND aarch64 (arm64/v8) architectures!&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 05 May 2022 14:23:40 +0000</pubDate>
</item>
<item>
	<title>Reza Rahman: FOSDEM 2022 Conference Report</title>
	<guid isPermaLink="false">https://reza-rahman.me/?p=1805</guid>
	<link>https://reza-rahman.me/2022/02/20/fosdem-2022-conference-report/</link>
	<description>&lt;p class=&quot;wp-block-paragraph&quot;&gt;FOSDEM took place February 5-6. The European based event is one of the most significant gatherings worldwide focused on all things Open Source. Named the “Friends of OpenJDK”, in recent years the event has added a devroom/track dedicated to Java. The effort is lead by my friend and former colleague Geertjan Wielenga. Due to the pandemic, the 2022 event was virtual once again. I delivered a couple of talks on Jakarta EE as well as Diversity &amp;amp; Inclusion.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1808&quot; height=&quot;294&quot; src=&quot;https://i0.wp.com/reza-rahman.me/wp-content/uploads/2022/02/fosdem.jpg?resize=750%2C294&amp;amp;ssl=1&quot; width=&quot;750&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Fundamentals of Diversity &amp;amp; Inclusion for Technologists&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I opened the second day of the conference with my newest talk titled “Fundamentals of Diversity and Inclusion for Technologists”. I believe this is an overdue and critically important subject. I am very grateful to FOSDEM for accepting the talk. The reality for our industry remains that many people either have not yet started or are at the very beginning of their Diversity &amp;amp; Inclusion journey. This talk aims to start the conversation in earnest by explaining the basics. Concepts covered include unconscious bias, privilege, equity, allyship, covering and microaggressions. I punctuate the topic with experiences from my own life and examples relevant to technologists. The slides for the talk are available on &lt;a href=&quot;https://speakerdeck.com/reza_rahman/fundamentals-of-diversity-and-inclusion-for-technologists&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;SpeakerDeck&lt;/a&gt;. The video for the talk is now posted on &lt;a href=&quot;https://www.youtube.com/watch?v=kwoK2NxHR9E&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;



&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;

&lt;/div&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Jakarta EE â€“ Present and Future&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Later the same day, I delivered my fairly popular talk – “Jakarta EE – Present and Future”. The talk is essentially a state of the union for Jakarta EE. It covers a little bit of history, context, Jakarta EE 8, Jakarta EE 9/9.1 as well as what’s ahead for Jakarta EE 10. One key component of the talk is the importance and ways of direct developer contributions into Jakarta EE, if needed with help from the Jakarta EE Ambassadors. Jakarta EE 10 and the Jakarta Core Profile should bring an important set of changes including to CDI, Jakarta REST, Concurrency, Security, Faces, Batch and Configuration. The slides for the talk are available on &lt;a href=&quot;https://speakerdeck.com/reza_rahman/jakarta-ee-present-and-future&quot;&gt;SpeakerDeck&lt;/a&gt;. The video for the talk is now posted on &lt;a href=&quot;https://www.youtube.com/watch?v=-UjBoM9wFGI&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;



&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;

&lt;/div&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I am very happy to have had the opportunity to speak at FOSDEM. I hope to contribute again in the future.&lt;/p&gt;</description>
	<pubDate>Mon, 21 Feb 2022 00:24:38 +0000</pubDate>
</item>
<item>
	<title>Sergii Kostenko: Infinispan Apache Log4j 2 CVE-2021-44228 vulnerability</title>
	<guid isPermaLink="false">blog/2021/12/infinispan-log4j-2-CVE-2021-44228.html</guid>
	<link>https://kostenko.org/blog/2021/12/infinispan-log4j-2-CVE-2021-44228.html</link>
	<description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://infinispan.org/&quot;&gt;Infinispan&lt;/a&gt;&lt;/strong&gt; 10+ uses &lt;a href=&quot;https://logging.apache.org/log4j/2.x/index.html&quot;&gt;Log4j&lt;/a&gt; version &lt;strong&gt;2.0+&lt;/strong&gt; and can be affected by vulnerability &lt;strong&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2021-44228&quot;&gt;CVE-2021-44228&lt;/a&gt;&lt;/strong&gt;, which has a 10.0 CVSS score. The first fixed Log4j version is &lt;strong&gt;2.15.0.&lt;/strong&gt;&lt;br /&gt;
So, until official patch is coming, - you can update used logger version to the latest in few simple steps&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download Log4j version 2.15.0:  &lt;a href=&quot;https://www.apache.org/dyn/closer.lua/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.zip&quot;&gt;https://www.apache.org/dyn/closer.lua/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unpack distributive&lt;/li&gt;
&lt;li&gt;Replace affected libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;wget https://downloads.apache.org/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.zip
unzip apache-log4j-2.15.0-bin.zip

cd /opt/infinispan-server-10.1.8.Final/lib/

rm log4j-*.jar
cp ~/Downloads/apache-log4j-2.15.0-bin/log4j-api-2.15.0.jar ./
cp ~/Downloads/apache-log4j-2.15.0-bin/log4j-core-2.15.0.jar ./
cp ~/Downloads/apache-log4j-2.15.0-bin/log4j-jul-2.15.0.jar ./
cp ~/Downloads/apache-log4j-2.15.0-bin/log4j-slf4j-impl-2.15.0.jar ./
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please, note - patch above is not official, but according to initial tests it works with no issues&lt;/p&gt;</description>
	<pubDate>Sun, 12 Dec 2021 22:00:00 +0000</pubDate>
</item>
<item>
	<title>Vladimir V. Bychkov: JPA query methods: influence on performance</title>
	<guid isPermaLink="true">https://blog.bychkov.name/jpa-query-tests.html</guid>
	<link>https://blog.bychkov.name/jpa-query-tests.html</link>
	<description>Specification JPA 2.2/Jakarta JPA 3.0 provides for several methods to select data from database. In this article we research how these methods affect on performance</description>
	<pubDate>Thu, 18 Nov 2021 07:22:25 +0000</pubDate>
</item>
<item>
	<title>Tomitribe: Custom Identity Store with Jakarta Security in TomEE</title>
	<guid isPermaLink="false">https://tomitribe4dev.wpengine.com/?p=8838</guid>
	<link>https://tomitribe.com/blog/custom-identity-store-with-jakarta-security-in-tomee/</link>
	<description>&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;In the previous post, we saw &lt;a href=&quot;https://tomitribe.com/blog/using-tomcats-tomcat-users-xml-with-jakarta-security-in-tomee/&quot;&gt;how to use the built-in ‘tomcat-users.xml’ identity store with Apache TomEE&lt;/a&gt;. While this identity store is inherited from Tomcat and integrated into Jakarta Security implementation in TomEE, this is usually good for development or simple deployments, but may appear too simple or restrictive for production environments. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This blog will focus on how to implement your own identity store. TomEE can use LDAP or JDBC identity stores out of the box. We will try them out next time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Let’s say you have your own file store or your own data store like an in-memory data grid, then you will need to implement your own identity store.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;What is an identity store?&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;An identity store is a database or a directory (store) of identity information about a population of users that includes an application’s callers. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;In essence, an identity store contains all information such as caller name, groups or roles, and required information to validate a caller’s credentials.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;How to implement my own identity store?&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;This is actually fairly simple with Jakarta Security. The only thing you need to do is create an implementation of `jakarta.security.enterprise.identitystore.IdentityStore`. All methods in the interface have default implementations. So you only have to implement what you need.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public interface IdentityStore {
   Set DEFAULT_VALIDATION_TYPES = EnumSet.of(VALIDATE, PROVIDE_GROUPS);

   default CredentialValidationResult validate(Credential credential) {
   }

   default Set getCallerGroups(CredentialValidationResult validationResult) {
   }

   default int priority() {
   }

   default Set validationTypes() {
   }

   enum ValidationType {
       VALIDATE, PROVIDE_GROUPS
   }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;By default, an identity store is used for both validating user credentials and providing groups/roles for the authenticated user. &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Depending on what #validationTypes() will return, you will have to implement #validate(…) and/or #getCallerGroups(…) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;#getCallerGroups(…) will receive the result of #valide(…). &lt;/span&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Let’s look at a very simple example:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@ApplicationScoped
public class TestIdentityStore implements IdentityStore {

   public CredentialValidationResult validate(Credential credential) {

       if (!(credential instanceof UsernamePasswordCredential)) {
           return INVALID_RESULT;
       }

       final UsernamePasswordCredential usernamePasswordCredential = (UsernamePasswordCredential) credential;
       if (usernamePasswordCredential.compareTo(&quot;jon&quot;, &quot;doe&quot;)) {
           return new CredentialValidationResult(&quot;jon&quot;, new HashSet&amp;lt;&amp;gt;(asList(&quot;foo&quot;, &quot;bar&quot;)));
       }

       if (usernamePasswordCredential.compareTo(&quot;iron&quot;, &quot;man&quot;)) {
           return new CredentialValidationResult(&quot;iron&quot;, new HashSet&amp;lt;&amp;gt;(Collections.singletonList(&quot;avengers&quot;)));
       }

       return INVALID_RESULT;
   }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;In this simple example, the identity store is hardcoded. Basically, it knows only 2 users, one of them has some roles, while the other has another set of roles.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;You can easily extend this example and query a local file, or an in-memory data grid if you need. Or use JPA to access your relational database.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT: for TomEE to pick it up and use it in your application, the identity store must be a CDI bean.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;The complete and runnable example is available under &lt;/span&gt;&lt;a href=&quot;https://github.com/apache/tomee/tree/master/examples/security-custom-identitystore&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;https://github.com/apache/tomee/tree/master/examples/security-custom-identitystore&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://tomitribe.com/blog/custom-identity-store-with-jakarta-security-in-tomee/&quot; rel=&quot;nofollow&quot;&gt;Custom Identity Store with Jakarta Security in TomEE&lt;/a&gt; appeared first on &lt;a href=&quot;https://tomitribe.com&quot; rel=&quot;nofollow&quot;&gt;Tomitribe&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 30 Sep 2021 11:42:38 +0000</pubDate>
</item>
<item>
	<title>Sergii Kostenko: Undertow AJP balancer. UT005028: Proxy request failed: java.nio.BufferOverflowException</title>
	<guid isPermaLink="false">blog/2021/04/undertow-ajp-balancer-.html</guid>
	<link>https://kostenko.org/blog/2021/04/undertow-ajp-balancer-.html</link>
	<description>&lt;p&gt;Wildfly provides great out of the box &lt;a href=&quot;https://kostenko.org/blog/2019/04/wildfly-cluster-domain-mode.html&quot;&gt;load balancing support&lt;/a&gt; by &lt;strong&gt;Undertow&lt;/strong&gt; and &lt;strong&gt;modcluster&lt;/strong&gt; subsystems&lt;br /&gt;
Unfortunately, in case  HTTP headers size is huge enough (close to 16K),  which is so actual in JWT era - pity error happened:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;ERROR [io.undertow.proxy] (default I/O-10) UT005028: Proxy request to /ee-jax-rs-examples/clusterdemo/serverinfo failed: java.io.IOException: java.nio.BufferOverflowException
 at io.undertow.server.handlers.proxy.ProxyHandler$HTTPTrailerChannelListener.handleEvent(ProxyHandler.java:771)
 at io.undertow.server.handlers.proxy.ProxyHandler$ProxyAction$1.completed(ProxyHandler.java:646)
 at io.undertow.server.handlers.proxy.ProxyHandler$ProxyAction$1.completed(ProxyHandler.java:561)
 at io.undertow.client.ajp.AjpClientExchange.invokeReadReadyCallback(AjpClientExchange.java:203)
 at io.undertow.client.ajp.AjpClientConnection.initiateRequest(AjpClientConnection.java:288)
 at io.undertow.client.ajp.AjpClientConnection.sendRequest(AjpClientConnection.java:242)
 at io.undertow.server.handlers.proxy.ProxyHandler$ProxyAction.run(ProxyHandler.java:561)
 at io.undertow.util.SameThreadExecutor.execute(SameThreadExecutor.java:35)
 at io.undertow.server.HttpServerExchange.dispatch(HttpServerExchange.java:815)
...
Caused by: java.nio.BufferOverflowException
 at java.nio.Buffer.nextPutIndex(Buffer.java:521)
 at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:297)
 at io.undertow.protocols.ajp.AjpUtils.putString(AjpUtils.java:52)
 at io.undertow.protocols.ajp.AjpClientRequestClientStreamSinkChannel.createFrameHeaderImpl(AjpClientRequestClientStreamSinkChannel.java:176)
 at io.undertow.protocols.ajp.AjpClientRequestClientStreamSinkChannel.generateSendFrameHeader(AjpClientRequestClientStreamSinkChannel.java:290)
 at io.undertow.protocols.ajp.AjpClientFramePriority.insertFrame(AjpClientFramePriority.java:39)
 at io.undertow.protocols.ajp.AjpClientFramePriority.insertFrame(AjpClientFramePriority.java:32)
 at io.undertow.server.protocol.framed.AbstractFramedChannel.flushSenders(AbstractFramedChannel.java:603)
 at io.undertow.server.protocol.framed.AbstractFramedChannel.flush(AbstractFramedChannel.java:742)
 at io.undertow.server.protocol.framed.AbstractFramedChannel.queueFrame(AbstractFramedChannel.java:735)
 at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.queueFinalFrame(AbstractFramedStreamSinkChannel.java:267)
 at io.undertow.server.protocol.framed.AbstractFramedStreamSinkChannel.shutdownWrites(AbstractFramedStreamSinkChannel.java:244)
 at io.undertow.channels.DetachableStreamSinkChannel.shutdownWrites(DetachableStreamSinkChannel.java:79)
 at io.undertow.server.handlers.proxy.ProxyHandler$HTTPTrailerChannelListener.handleEvent(ProxyHandler.java:754)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The same request directly to backend server works well.  Tried to play with &lt;strong&gt;ajp-listener&lt;/strong&gt; and &lt;strong&gt;mod-cluster&lt;/strong&gt; filter &lt;strong&gt;&quot;max-*&quot;&lt;/strong&gt; parameters, but have no luck.&lt;/p&gt;
&lt;p&gt;Possible solution here is switch protocol from AJP to HTTP which can be bit less effective, but works well with big headers:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=listener, value=default)
&lt;/code&gt;&lt;/pre&gt;</description>
	<pubDate>Fri, 02 Apr 2021 21:00:00 +0000</pubDate>
</item>
<item>
	<title>Elder Moraes: Jakarta EE Cookbook</title>
	<guid isPermaLink="false">https://eldermoraes.com/?p=2606</guid>
	<link>https://eldermoraes.com/jakarta-ee-cookbook/</link>
	<description>&lt;p&gt;About one month ago I had the pleasure to announce the release of the second edition of my book, now called “Jakarta EE Cookbook”. By that time I had recorded a video about and you can watch it here:&lt;/p&gt;
&lt;p&gt;[embedyt] https://www.youtube.com/watch?v=SFbDs1HKEyA[/embedyt]&lt;/p&gt;
&lt;p&gt;And then came a crazy month and just now I had the opportunity to write a few lines about it! &lt;img alt=&quot;ðŸ™‚&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So, straight to the point, what you should know about the book (in case you have any interest in it).&lt;/p&gt;
&lt;h4&gt;Target audience&lt;/h4&gt;
&lt;p&gt;Java developers working on enterprise applications and that would like to get the best from the Jakarta EE platform.&lt;/p&gt;
&lt;h4&gt;Topics covered&lt;/h4&gt;
&lt;p&gt;I’m sure this is one of the most complete books of this field, and I’m saying it based on the covered topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Server-side development&lt;/li&gt;
&lt;li&gt;Building services with RESTful features&lt;/li&gt;
&lt;li&gt;Web and client-server communication&lt;/li&gt;
&lt;li&gt;Security in the enterprise architecture&lt;/li&gt;
&lt;li&gt;Jakarta EE standards (and how does it save you time on a daily basis)&lt;/li&gt;
&lt;li&gt;Deployment and management using some of the best Jakarta EE application servers&lt;/li&gt;
&lt;li&gt;Microservices with Jakarta EE and Eclipse MicroProfile&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Multithreading&lt;/li&gt;
&lt;li&gt;Event-driven for reactive applications&lt;/li&gt;
&lt;li&gt;Jakarta EE, containers &amp;amp; cloud computing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Style and approach&lt;/h4&gt;
&lt;p&gt;The book has the word “cookbook” on its name for a reason: it follows a 100% practical approach, with almost all working code available in the book (we only omitted the imports for the sake of the space).&lt;/p&gt;
&lt;p&gt;And talking about the source code being available, it is really available on my Github: &lt;a href=&quot;https://github.com/eldermoraes/javaee8-cookbook&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/eldermoraes/javaee8-cookbook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PRs and Stars are welcomed! &lt;img alt=&quot;ðŸ™‚&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Bonus content&lt;/h4&gt;
&lt;p&gt;The book has an appendix that would be worthy of another book! I tell the readers how sharing knowledge has changed my career for good and how you can apply what I’ve learned in your own career.&lt;/p&gt;
&lt;h4&gt;Surprise, surprise&lt;/h4&gt;
&lt;p&gt;In the first 24 hours of its release, this book simply reached the 1st place at Amazon among other Java releases! Wow!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter wp-image-2608 size-medium&quot; height=&quot;300&quot; src=&quot;https://eldermoraes.com/wp-content/uploads/2020/07/1st-place-241x300.png&quot; width=&quot;241&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Of course, I’m more than happy and honored for such a warm welcome given to my baby… &lt;img alt=&quot;ðŸ™‚&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in it, we are in the very last days of the special price in celebration of its release. You can take a look here &lt;a href=&quot;http://book.eldermoraes.com&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;http://book.eldermoraes.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Leave your comments if you need any clarification about it. See you!&lt;/p&gt;</description>
	<pubDate>Mon, 06 Jul 2020 19:19:50 +0000</pubDate>
</item>
<item>
	<title>Philip Riecks: Jakarta EE 8 CRUD API Tutorial using Java 11</title>
	<guid isPermaLink="false">https://rieckpil.de/?p=32091</guid>
	<link>https://rieckpil.de/jakarta-ee-crud-api-tutorial/</link>
	<description>&lt;p&gt;As part of the &lt;a href=&quot;https://www.youtube.com/watch?v=b2rtkYKoshA&amp;amp;list=PLFjB4VDnlT_1UH_Ncopre4nhCRNtBxohX&quot;&gt;Jakarta EE Quickstart Tutorials&lt;/a&gt; on YouTube, I’ve now created a five-part series to create a Jakarta EE CRUD API. Within the videos, I’m demonstrating how to start using Jakarta EE for your next application. Given the &lt;a href=&quot;https://rieckpil.de/joyful-open-liberty-developer-experience-with-liberty-maven-plugin/&quot;&gt;Liberty Maven Plugin&lt;/a&gt; and &lt;a href=&quot;https://rieckpil.de/jakarta-ee-integration-tests-with-microshed-testing/&quot;&gt;MicroShed Testing&lt;/a&gt;, the endpoints are developed using the TDD (Test Driven Development) technique.&lt;/p&gt;
&lt;p&gt;The following technologies are used within this short series: Java 11, Jakarta EE 8, Open Liberty, Derby, Flyway, MicroShed Testing &amp;amp; JUnit 5&lt;/p&gt;
&lt;h2&gt;Part I: Introduction to the application setup&lt;/h2&gt;
&lt;p&gt;This part covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introduction to the Maven project skeleton&lt;/li&gt;
&lt;li&gt;Flyway setup for Open Liberty&lt;/li&gt;
&lt;li&gt;Derby JDBC connection configuration&lt;/li&gt;
&lt;li&gt;Basic MicroShed Testing setup for TDD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Part II: Developing the endpoint to create entities&lt;/h2&gt;
&lt;p&gt;This part covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First JAX-RS endpoint to create &lt;code&gt;Person&lt;/code&gt; entities&lt;/li&gt;
&lt;li&gt;TDD approach using MicroShed Testing and the Liberty Maven Plugin&lt;/li&gt;
&lt;li&gt;Store the entities using the &lt;code&gt;EntityManager&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Part III: Developing the endpoints to read entities&lt;/h2&gt;
&lt;p&gt;This part covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop two JAX-RS endpoints to read entities&lt;/li&gt;
&lt;li&gt;Read all entities and by its id&lt;/li&gt;
&lt;li&gt;Handle non-present entities with a different HTTP status code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Part IV: Developing the endpoint to update entities&lt;/h2&gt;
&lt;p&gt;This part covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop the JAX-RS endpoint to update entities&lt;/li&gt;
&lt;li&gt;Update existing entities using HTTP PUT&lt;/li&gt;
&lt;li&gt;Validate the client payload using Bean Validation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Part V: Developing the endpoint to delete entities&lt;/h2&gt;
&lt;p&gt;This part covers the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop the JAX-RS endpoint to delete entities&lt;/li&gt;
&lt;li&gt;Enhance the test setup for deterministic and repeatable integration tests&lt;/li&gt;
&lt;li&gt;Remove the deleted entity from the database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The source code for the Maven &lt;a href=&quot;https://github.com/rieckpil/quickstart-jakarta-ee-guides/tree/master/crud-api-application&quot;&gt;CRUD API&lt;/a&gt; application is available on GitHub.&lt;/p&gt;
&lt;p&gt;For more &lt;a href=&quot;https://rieckpil.de/jakarta-ee-quickstart-guides-for-each-application-server/&quot;&gt;quickstart tutorials on Jakarta EE,&lt;/a&gt; have a look at the overview page on my blog.&lt;/p&gt;
&lt;p&gt;Have fun developing Jakarta EE CRUD API applications,&lt;/p&gt;
&lt;p&gt;Phil&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;span class=&quot;tve-leads-two-step-trigger tl-2step-trigger-0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;tve-leads-two-step-trigger tl-2step-trigger-0&quot;&gt;&lt;/span&gt;&lt;p&gt;The post &lt;a href=&quot;https://rieckpil.de/jakarta-ee-crud-api-tutorial/&quot;&gt;Jakarta EE 8 CRUD API Tutorial using Java 11&lt;/a&gt; appeared first on &lt;a href=&quot;https://rieckpil.de&quot;&gt;rieckpil&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 19 Jan 2020 15:07:54 +0000</pubDate>
</item>
<item>
	<title>Philip Riecks: Deploy a Jakarta EE application to the root context</title>
	<guid isPermaLink="false">https://rieckpil.de/?p=32039</guid>
	<link>https://rieckpil.de/deploy-a-jakarta-ee-application-to-the-root-context/</link>
	<description>&lt;p&gt;With the presence of Docker, Kubernetes and cheaper hardware, the deployment model of multiple applications inside one application server has passed. Now, you deploy&lt;strong&gt; one Jakarta EE application to one application server&lt;/strong&gt;. This eliminates the need for different context paths.Â  You can use the root context &lt;code&gt;/&lt;/code&gt; for your Jakarta EE application. With this blog post, you’ll learn how to achieve this for each Jakarta EE application server.&lt;/p&gt;
&lt;h2&gt;The default behavior for Jakarta EE application server&lt;/h2&gt;
&lt;p&gt;Without any further configuration, most of the Jakarta EE application servers deploy the application to a context path based on the filename of your &lt;code&gt;.war&lt;/code&gt;. If you e.g. deploy your &lt;code&gt;my-banking-app.war&lt;/code&gt; application, the server will use the context prefix &lt;code&gt;/my-banking-app&lt;/code&gt; for your application. All you JAX-RS endpoints, Servlets, &lt;code&gt;.jsp&lt;/code&gt;, &lt;code&gt;.xhtml&lt;/code&gt; content is then available below this context, e.g &lt;code&gt;/my-banking-app/resources/customers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This was important in the past, where you deployed multiple applications to one application server. Without the context prefix, the application server wouldn’t be able to route the traffic to the correct application.&lt;/p&gt;
&lt;p&gt;As of today, the deployment model changed with Docker, Kubernetes and cheaper infrastructure. You usually deploy one &lt;code&gt;.war&lt;/code&gt; within one application server running as a Docker container. Given this deployment model, the context prefix is irrelevant. Mapping the application to the root context &lt;code&gt;/&lt;/code&gt; is more convenient.&lt;/p&gt;
&lt;p&gt;If you configure a reverse proxy or an Ingress controller (in the Kubernetes world), you are happy if you can just route to &lt;code&gt;/&lt;/code&gt; instead of remembering the actual context path (error-prone).&lt;/p&gt;
&lt;h2&gt;Deploying to root context: Payara &amp;amp; Glassfish&lt;/h2&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.payara.fish/&quot;&gt;Payara&lt;/a&gt; is a fork of &lt;a href=&quot;https://eclipse-ee4j.github.io/glassfish/&quot;&gt;Glassfish&lt;/a&gt;, the configuration for both is quite similar. The most convenient way for Glassfish is to place a &lt;code&gt;glassfish-web.xml&lt;/code&gt; file in the &lt;code&gt;src/main/webapp/WEB-INF&lt;/code&gt; folder of your application:&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;&amp;lt;!DOCTYPE glassfish-web-app PUBLIC &quot;-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN&quot;
  &quot;http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd&quot;&amp;gt;
&amp;lt;glassfish-web-app&amp;gt;
  &amp;lt;context-root&amp;gt;/&amp;lt;/context-root&amp;gt;
&amp;lt;/glassfish-web-app&amp;gt;&lt;/pre&gt;&lt;p&gt;For Payara the filename is &lt;code&gt;payara-web.xml&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;&amp;lt;!DOCTYPE payara-web-app PUBLIC &quot;-//Payara.fish//DTD Payara Server 4 Servlet 3.0//EN&quot; &quot;https://raw.githubusercontent.com/payara/Payara-Server-Documentation/master/schemas/payara-web-app_4.dtd&quot;&amp;gt;
&amp;lt;payara-web-app&amp;gt;
	&amp;lt;context-root&amp;gt;/&amp;lt;/context-root&amp;gt;
&amp;lt;/payara-web-app&amp;gt;&lt;/pre&gt;&lt;p&gt;Both also support configuring the context path of the application within their admin console. IMHO this less convenient than the &lt;code&gt;.xml&lt;/code&gt; file solution.&lt;/p&gt;
&lt;h2&gt;Deploying to root context: Open Liberty&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://openliberty.io/&quot;&gt;Open Liberty&lt;/a&gt; also parses a proprietary &lt;code&gt;web.xml&lt;/code&gt; file within &lt;code&gt;src/main/webapp/WEB-INF&lt;/code&gt;: &lt;code&gt;ibm-web-ext.xml&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;&amp;lt;web-ext
  xmlns=&quot;http://websphere.ibm.com/xml/ns/javaee&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd&quot;
  version=&quot;1.0&quot;&amp;gt;
  &amp;lt;context-root uri=&quot;/&quot;/&amp;gt;
&amp;lt;/web-ext&amp;gt;&lt;/pre&gt;&lt;p&gt;Furthermore, you can also configure the context of your application within your &lt;code&gt;server.xml&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;&amp;lt;server&amp;gt;
  &amp;lt;featureManager&amp;gt;
    &amp;lt;feature&amp;gt;servlet-4.0&amp;lt;/feature&amp;gt;
  &amp;lt;/featureManager&amp;gt;

  &amp;lt;httpEndpoint id=&quot;defaultHttpEndpoint&quot; httpPort=&quot;9080&quot; httpsPort=&quot;9443&quot;/&amp;gt;

  &amp;lt;webApplication location=&quot;app.war&quot; contextRoot=&quot;/&quot; name=&quot;app&quot;/&amp;gt;
&amp;lt;/server&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Deploying to root context: WildFly&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wildfly.org/&quot;&gt;WildFly&lt;/a&gt; also has two simple ways of configuring the root context for your application. First, you can place a &lt;code&gt;jboss-web.xml&lt;/code&gt; within &lt;code&gt;src/main/webapp/WEB-INF&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;&amp;lt;!DOCTYPE jboss-web PUBLIC &quot;-//JBoss//DTD Web Application 2.4//EN&quot; &quot;http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd&quot;&amp;gt;
&amp;lt;jboss-web&amp;gt;
  &amp;lt;context-root&amp;gt;/&amp;lt;/context-root&amp;gt;
&amp;lt;/jboss-web&amp;gt;&lt;/pre&gt;&lt;p&gt;Second, while copying your &lt;code&gt;.war&lt;/code&gt; file to your Docker container, you can name it &lt;code&gt;ROOT.war&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;urvanov-syntax-highlighter-plain-tag&quot;&gt;FROM jboss/wildfly
 ADD target/app.war /opt/jboss/wildfly/standalone/deployments/ROOT.war&lt;/pre&gt;&lt;p&gt;For more tips &amp;amp; tricks for each application server, have a look at my &lt;a href=&quot;https://rieckpil.de/cheatsheet-java-jakarta-ee-application-servers/&quot;&gt;cheat sheet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have fun deploying your Jakarta EE applications to the root context,&lt;/p&gt;
&lt;p&gt;Phil&lt;/p&gt;
&lt;span class=&quot;tve-leads-two-step-trigger tl-2step-trigger-0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;tve-leads-two-step-trigger tl-2step-trigger-0&quot;&gt;&lt;/span&gt;&lt;p&gt;The post &lt;a href=&quot;https://rieckpil.de/deploy-a-jakarta-ee-application-to-the-root-context/&quot;&gt;Deploy a Jakarta EE application to the root context&lt;/a&gt; appeared first on &lt;a href=&quot;https://rieckpil.de&quot;&gt;rieckpil&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Tue, 07 Jan 2020 06:24:44 +0000</pubDate>
</item>
<item>
	<title>Wayne Beaton: Specification Scope in Jakarta EE</title>
	<guid isPermaLink="false">http://waynebeaton.wordpress.com/?p=5558</guid>
	<link>https://waynebeaton.wordpress.com/2019/04/08/specification-scope-in-jakarta-ee/</link>
	<description>&lt;p&gt;With the &lt;a href=&quot;https://www.eclipse.org/projects/efsp&quot;&gt;Eclipse Foundation Specification Process&lt;/a&gt; (EFSP) a single open source specification project has a dedicated project team of committers to create and maintain one or more specifications. The cycle of creation and maintenance extends across multiple versions of the specification, and so while individual members may come and go, the team remains and it is that team that is responsible for the every version of that specification that is created.&lt;/p&gt;
&lt;p&gt;The first step in managing how intellectual property rights flow through a specification is to define the range of the work encompassed by the specification. Per the Eclipse &lt;a href=&quot;https://www.eclipse.org/org/documents/Eclipse_IP_Policy.pdf&quot;&gt;Intellectual Property Policy&lt;/a&gt;, this range of work (referred to as the &lt;em&gt;scope&lt;/em&gt;) needs to be well-defined and captured. Once defined, the scope is effectively locked down (changes to the scope are possible but rare, and must be carefully managed; the scope of a specification can be tweaked and changed, but doing so requires approval from the &lt;a href=&quot;https://jakarta.ee/&quot;&gt;Jakarta EE Working Group’s&lt;/a&gt; &lt;a href=&quot;https://www.eclipse.org/projects/efsp/#efsp-committee&quot;&gt;Specification Committee&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Regarding scope, the EFSP states:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Among other things, the Scope of a Specification Project is intended to inform companies and individuals so they can determine whether or not to contribute to the Specification. Since a change in Scope may change the nature of the contribution to the project, a change to a Specification Project’s Scope must be approved by a Super-majority of the Specification Committee.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As a general rule, a scope statement should not be too precise. Rather, it should describe the intention of the specification in broad terms. Think of the scope statement as an executive summary or “elevator pitch”.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Elevator pitch: You have fifteen seconds before the elevator doors open on your floor; tell me about the problem your specification addresses.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span&gt;The scope statement must answer the question: what does an implementation of this specification do? &lt;/span&gt;The scope statement must be aspirational rather than attempt to capture any particular state at any particular point-in-time. A scope statement must not focus on the work planned for any particular version of the specification, but rather, define the problem space that the specification is intended to address.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Jakarta Batch provides describes a means for executing and managing batch processes in Jakarta EE applications.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Jakarta Message Service describes a means for Jakarta EE applications to create, send, and receive messages via loosely coupled, reliable asynchronous communication services.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;For the scope statement, you can assume that the reader has a rudimentary understanding of the field. It’s reasonable, for example, to expect the reader to understand what “batch processing” means.&lt;/p&gt;
&lt;p&gt;I should note that the two examples presented above are just examples of form. I’m pretty sure that they make sense, but defer to the project teams to work with their communities to sort out the final form.&lt;/p&gt;
&lt;p&gt;The scope is “sticky” for the entire lifetime of the specification: it spans versions. The &lt;a href=&quot;https://www.eclipse.org/projects/efsp/#efsp-plans&quot;&gt;plan&lt;/a&gt; for any particular &lt;a href=&quot;https://www.eclipse.org/projects/efsp/#efsp-version-lifecycle&quot;&gt;development cycle&lt;/a&gt; must describe work that is &lt;em&gt;in scope&lt;/em&gt;; and at the &lt;a href=&quot;https://www.eclipse.org/projects/efsp/#efsp-reviews&quot;&gt;checkpoint (progress and release) reviews&lt;/a&gt;, the project team must be prepared to demonstrate that the behavior described by the specifications (and tested by the corresponding TCK) cleanly &lt;em&gt;falls within&lt;/em&gt; the scope (note that the development life cycle of specification project is described in &lt;a href=&quot;https://waynebeaton.wordpress.com/2019/03/08/eclipse-foundation-specification-process-step-by-step/&quot;&gt;Eclipse Foundation Specification Process Step-by-Step&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In addition the &lt;em&gt;specification&lt;/em&gt; scope which is required by the Eclipse Intellectual Property Policy and EFSP, the &lt;em&gt;specification project&lt;/em&gt; that owns and maintains the specification needs a &lt;em&gt;project scope&lt;/em&gt;. The project scope is, I think, pretty straightforward: a particular specification project defines and maintains a specification.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The Jakarta Batch project defines and maintains the Jakarta Batch specification and related artifacts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Like the specification scope, the project scope should be aspirational. In this regard, the specification project is responsible for the particular specification in perpetuity. Further the related artifacts, like APIs and TCKs can be &lt;em&gt;in scope&lt;/em&gt; without actually being managed by the project &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Today, for example, most of the TCKs for the Jakarta EE specifications are rolled into the &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.jakartaee-tck&quot;&gt;Jakarta EE TCK&lt;/a&gt; project. But, over time, this single monster TCK may be broken up and individual TCKs moved to corresponding specification projects. Or not. The point is that regardless of where the technical artifacts are currently maintained, they may one day be part of the specification project, so they are &lt;em&gt;in scope&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I should back up a bit and say that our intention right now is to turn the “Eclipse Project for …” projects that we have managing artifacts related to various specifications into actual specification projects. As part of this effort, we’ll add Git repositories to these projects to provide a home for the specification documents (more on this later). A handful of these proto-specification projects currently include artifacts related to multiple specifications, so we’ll have to sort out what we’re going to do about those project scope statements.&lt;/p&gt;
&lt;p&gt;We might consider, for example, changing the project scope of the &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.jakartaee-stable&quot;&gt;Jakarta EE Stable APIs&lt;/a&gt; (note that I’m guessing a future new project name) to something simple like:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Jakarta EE Stable APIs provides a home for stable (legacy) Jakarta EE specifications and related artifacts which are no longer actively developed.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;But, all that talk about specification projects aside, our initial focus needs to be on describing the scope of the specifications themselves. With that in mind, the EE4J PMC has created a &lt;a href=&quot;https://github.com/orgs/eclipse-ee4j/projects/10&quot;&gt;project board&lt;/a&gt; with issues to track this work and we’re going to ask the project teams to start working with their communities to put these scope statements together. If you have thoughts regarding the scope statements for a particular specification, please weigh in.&lt;/p&gt;
&lt;p&gt;Note that we’re in a bit of a weird state right now. As we engage in a parallel effort to rename the specifications (and corresponding specification projects), it’s not entirely clear what we should call things. You’ll notice that the issues that have been created all use the names that we guess we’re going to end up using (there’s more more information about that in &lt;a href=&quot;https://waynebeaton.wordpress.com/2019/04/04/renaming-java-ee-specifications-for-jakarta-ee/&quot;&gt;Renaming Java EE Specifications for Jakarta EE&lt;/a&gt;).&lt;/p&gt;</description>
	<pubDate>Mon, 08 Apr 2019 14:56:30 +0000</pubDate>
</item>
<item>
	<title>Wayne Beaton: Renaming Java EE Specifications for Jakarta EE</title>
	<guid isPermaLink="false">http://waynebeaton.wordpress.com/?p=5559</guid>
	<link>https://waynebeaton.wordpress.com/2019/04/04/renaming-java-ee-specifications-for-jakarta-ee/</link>
	<description>&lt;p&gt;It’s time to change the specification names…&lt;/p&gt;
&lt;p&gt;When we first moved the APIs and TCKs for the Java EE specifications over to the &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j&quot;&gt;Eclipse Foundation&lt;/a&gt; under the &lt;a href=&quot;https://jakarta.ee/&quot;&gt;Jakarta EE&lt;/a&gt; banner, we kept the existing names for the specifications in place, and adopted placeholder names for the open source projects that hold their artifacts. As we prepare to engage in actual specification work (involving an actual specification document), it’s time to start thinking about changing the names of the specifications and the projects that contain their artifacts.&lt;/p&gt;
&lt;p&gt;Why change? For starters&lt;span&gt;, it’s just good form to leverage the Jakarta brand. But, more critically, m&lt;/span&gt;&lt;span&gt;any of the existing specification names use trademarked terms that make it either very challenging or impossible to use those names without violating trademark rules.&lt;/span&gt;&lt;span&gt; Motivation for changing the names of the existing open source projects that we’ll turn into specification projects is, I think, a little easier: &lt;/span&gt;&lt;span&gt;“Eclipse Project for …” is a terrible name. So, while the current names for our proto-specification projects have served us well to-date, it’s time to change them. &lt;/span&gt;&lt;span&gt;To keep things simple, we recommend that we just use the name of the specification as the project name. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;With this in mind, we’ve come up with a naming pattern that we believe can serve as a good starting point for discussion. To start with, in order to keep things as simple as possible, we’ll have the project use the same name as the specification (unless there is a compelling reason to do otherwise).&lt;/p&gt;
&lt;p&gt;The naming rules are relatively simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace “Java” with “Jakarta” (e.g. “Java Message Service”&lt;span&gt; becomes “Jakarta Message Service”);&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Add a space in cases where names are mashed together (e.g. “JavaMail” becomes “Jakarta Mail”);&lt;/li&gt;
&lt;li&gt;Add “Jakarta” when it is missing (e.g. “Expression Language” becomes “Jakarta Expression Language”); and&lt;/li&gt;
&lt;li&gt;Rework names to consistently start with “Jakarta” (“Enterprise JavaBeans” becomes “Jakarta Enterprise Beans”).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This presents us with an opportunity to add even more consistency to the various specification names. Some, for example, are more wordy or descriptive than others; some include the term “API” in the name, and others don’t; etc.&lt;/p&gt;
&lt;p&gt;We’ll have to sort out what we’re going to do with the &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.jakartaee-stable&quot;&gt;Eclipse Project for Stable Jakarta EE Specifications&lt;/a&gt;, which provides a home for a small handful of specifications which are not expected to change. I’ll personally be happy if we can at least drop the “Eclipse Project for” from the name&lt;span&gt; (“Jakarta EE Stable”?)&lt;/span&gt;&lt;span&gt;. We’ll also have to sort out what we’re going to do about the &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.mojarra&quot;&gt;Eclipse Mojarra&lt;/a&gt; and &lt;a href=&quot;https://projects.eclipse.org/projects/ee4j.metro&quot;&gt;Eclipse Metro&lt;/a&gt; projects which hold the APIs for some specifications; we may end up having to create new specification projects as homes for development of the corresponding specification documents (regardless of how this ends up manifesting as a specification project, we’re still going to need specification names).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Based on all of the above, here is my suggested &lt;em&gt;starting point&lt;/em&gt; for specification (and most project) names (I’ve applied the rules described above; and have suggested tweaks for consistency by &lt;del&gt;strike out&lt;/del&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jakarta &lt;del&gt;APIs&lt;/del&gt; for XML Messaging&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;Architecture for&lt;/del&gt; XML Binding&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; XML&lt;del&gt;-based&lt;/del&gt; Web Services&lt;/li&gt;
&lt;li&gt;Jakarta Common Annotations&lt;/li&gt;
&lt;li&gt;Jakarta Enterprise Beans&lt;/li&gt;
&lt;li&gt;Jakarta Persistence &lt;del&gt;API&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Jakarta Contexts and Dependency Injection&lt;/li&gt;
&lt;li&gt;Jakarta EE Platform&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; JSON Binding&lt;/li&gt;
&lt;li&gt;Jakarta Servlet&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; RESTful Web Services&lt;/li&gt;
&lt;li&gt;Jakarta Server Faces&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; JSON Processing&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;EE&lt;/del&gt; Security &lt;del&gt;API&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Jakarta Bean Validation&lt;/li&gt;
&lt;li&gt;Jakarta Mail&lt;/li&gt;
&lt;li&gt;Jakarta Beans Activation &lt;del&gt;Framework&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Jakarta Debugging Support for Other Languages&lt;/li&gt;
&lt;li&gt;Jakarta Server Pages Standard Tag Library&lt;/li&gt;
&lt;li&gt;Jakarta EE Platform Management&lt;/li&gt;
&lt;li&gt;Jakarta EE Platform Application Deployment&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; XML Registries&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; XML-based RPC&lt;/li&gt;
&lt;li&gt;Jakarta Enterprise Web Services&lt;/li&gt;
&lt;li&gt;Jakarta Authorization &lt;del&gt;Contract for Containers&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Jakarta Web Services Metadata&lt;/li&gt;
&lt;li&gt;Jakarta Authentication &lt;del&gt;Service Provider Interface for Containers&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Jakarta Concurrency Utlities&lt;/li&gt;
&lt;li&gt;Jakarta Server Pages&lt;/li&gt;
&lt;li&gt;Jakarta Connector Architecture&lt;/li&gt;
&lt;li&gt;Jakarta Dependency Injection&lt;/li&gt;
&lt;li&gt;Jakarta Expression Language&lt;/li&gt;
&lt;li&gt;Jakarta Message Service&lt;/li&gt;
&lt;li&gt;Jakarta Batch&lt;/li&gt;
&lt;li&gt;Jakarta &lt;del&gt;API for&lt;/del&gt; WebSocket&lt;/li&gt;
&lt;li&gt;Jakarta Transaction &lt;del&gt;API&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’re going to couple renaming with an effort to capture proper scope statements (I’ll cover this in my next post). The Eclipse EE4J PMC Lead, Ivar Grimstad, has &lt;a href=&quot;https://www.agilejava.eu/2019/03/18/jakarta-ee-8-status/&quot;&gt;blogged about this recently&lt;/a&gt; and has created a &lt;a href=&quot;https://github.com/orgs/eclipse-ee4j/projects/11&quot;&gt;project board&lt;/a&gt; to track the specification and project renaming activity (as of this writing, it has only just been started, so watch that space). We’ll start reaching out to the “Eclipse Project for …”  teams shortly to start engaging this process. When we’ve collected all of the information (names and scopes), we’ll engage in a restructuring review per the &lt;a href=&quot;https://www.eclipse.org/projects/dev_process/&quot;&gt;Eclipse Development Process&lt;/a&gt; (EDP) and make it all happen (more on this later).&lt;/p&gt;
&lt;p&gt;Your input is requested. I’ll monitor comments on this post, but it would be better to collect your thoughts in the issues listed on the project board (after we’ve taken the step to create them, of course), on the &lt;a href=&quot;https://github.com/eclipse-ee4j/ee4j/issues/50&quot;&gt;related issue&lt;/a&gt;, or on the &lt;a href=&quot;https://accounts.eclipse.org/mailing-list/ee4j-pmc&quot;&gt;EE4J PMC’s mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
	<pubDate>Thu, 04 Apr 2019 14:17:23 +0000</pubDate>
</item>
<item>
	<title>Elder Moraes: Top 20 Jakarta EE Experts to Follow on Twitter</title>
	<guid isPermaLink="false">https://eldermoraes.com/?p=1356</guid>
	<link>https://eldermoraes.com/top-20-java-ee-experts-to-follow-on-twitter/</link>
	<description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone wp-image-1906 size-medium&quot; height=&quot;150&quot; src=&quot;https://eldermoraes.com/wp-content/uploads/2017/06/top20-twitter-jakartaee-1-300x150.png&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is the most viewed post of this blog, so I believe it deserves an update now in 2020! Its first version was written back in 2017.&lt;/p&gt;
&lt;p&gt;There’s a lot of different opinions in this kind of lists, and there will be always somebody or something missing… just don’t be too passionate or take things personally, ok?! &lt;img alt=&quot;ðŸ˜‰&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;******************************************************&lt;/p&gt;
&lt;p&gt;We all have to agree: there are tons of tons of information shared through social media. It’s no different on Twitter.&lt;/p&gt;
&lt;p&gt;When we talk about staying tuned with some technology, it’s important to have some kind of focus. Otherwise, you could end up confused or, worst, getting bad and/or wrong information.&lt;/p&gt;
&lt;p&gt;For these reasons I have a small but incredible list of people/accounts that I use to follow on Twitter to get really good information about Jakarta EE.&lt;/p&gt;
&lt;p&gt;If you are passionate about Jakarta EE like me, I truly hope this list may be helpful to you. If you are not, I hope you enjoy as well! &lt;img alt=&quot;ðŸ˜‰&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Important: the list isn’t a ranking, so don’t judge the account by the position at the list. In fact, don’t judge anyone by anything…&lt;/p&gt;
&lt;h3&gt;Jakarta EE – &lt;a href=&quot;https://twitter.com/JakartaEE&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@JakartaEE&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The official Jakarta EE handle.&lt;/p&gt;
&lt;h3&gt;Wayne Beaton – &lt;a href=&quot;https://twitter.com/waynebeaton&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@waynebeaton&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wayne is a Director of Open Source Projects at the Eclipse Foundation. Undoubtedly, Jakarta EE is one of the biggest projects at Eclipse today (if not the biggest one), so it’s important to stay tunned with Wayne has to say.&lt;/p&gt;
&lt;h3&gt;Adam Bien – &lt;a href=&quot;http://twitter.com/AdamBien&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@AdamBien&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Adam works as a freelancer with Java since JDK 1.0, with Servlets/EJB since 1.0 and before the advent of J2EE in several large-scale applications. He is an architect and developer (with usually 20/80 distribution) in Java (SE / EE / FX) projects. He has written several books about JavaFX, J2EE, and Java EE, and he is the author of &lt;a href=&quot;http://realworldpatterns.com&quot;&gt;Real World Java EE Patternsâ€”Rethinking Best Practices&lt;/a&gt; and &lt;a href=&quot;http://press.adam-bien.com/real-world-java-ee-night-hacks-dissecting-the-business-tier.htm&quot;&gt;Real World Java EE Night Hacksâ€”Dissecting The Business Tier&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He is also aÂ &lt;a href=&quot;http://java.net/website/java-champions/bios.html#Bien&quot;&gt;Java Champion&lt;/a&gt;,Â &lt;a href=&quot;http://netbeans.org/community/contribute/dreamteam.html&quot;&gt;NetBeans Dream Team Founding Member&lt;/a&gt;,Â &lt;a href=&quot;http://apex.oracle.com/pls/otn/f?p=19297:4:409221233034912::NO:4:P4_ID:3120&quot;&gt;Oracle ACE Director&lt;/a&gt;,Â &lt;a href=&quot;http://www.oracle.com/technetwork/issue-archive/2010/10-nov/o60eca-176293.html#bien&quot;&gt;Java Developer of the Year 2010&lt;/a&gt; and has a huge amount of nominations as JavaOne Rockstar.&lt;/p&gt;
&lt;h3&gt;Kevin Sutter – &lt;a href=&quot;http://twitter.com/kwsutter&quot;&gt;@kwsutter&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Kevin Sutter is the lead architect for the Jakarta EE and JPA solutions for WebSphere Application Server and the WebSphere Liberty Profile. He is also very active with Java and open-source strategies as they relate to IBMâ€™s application middleware.&lt;/p&gt;
&lt;h3&gt;Ivar Grimstad – &lt;a href=&quot;http://twitter.com/ivar_grimstad&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@ivar_grimstad&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ivar Grimstad is Java Champion, JUG Leader, JCP Spec Lead, EC and EG Member, NetBeans Dream Team and International Speaker.&lt;/p&gt;
&lt;p&gt;He is the PMC (Project Management Committee) Lead of EE4J and Jakarta EE Developer Advocate at Eclipse Foundation.&lt;/p&gt;
&lt;h3&gt;David Blevins – &lt;a href=&quot;http://twitter.com/ivar_grimstad&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@dblevins&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;David Blevins is the founder of Tomitribe and a veteran of open source Jakarta EE. He has been both implementing and defining Enterprise Java specifications for more than 10 years and has a strong drive to see it simple, testable, and as light as Java SE. Blevins is cofounder of OpenEJB (1999), Geronimo (2003), and TomEE (2011). He is a member of the EJB 3.0, EJB 3.1, EJB 3.2, Java EE 6, Java EE 7, and Java EE 8 Security Expert Groups, and a member of the Apache Software Foundation. Blevins is a contributing author to Component-Based Software Engineering: Putting the Pieces Together (Addison Wesley). Blevins is also a regular speaker at JavaOne, Devoxx, ApacheCon, OSCon, JAX, and other Java-focused conferences.&lt;/p&gt;
&lt;h3&gt;Otavio Santana – &lt;a href=&quot;http://twitter.com/otaviojava&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@otaviojava&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OtÃ¡vio Santana is a developer and enthusiast of open source. He is an evangelist and practitioner of agile philosophy and polyglot development in Brazil. Santana is a JUG leader of JavaBahia and SouJava, and a strong supporter of Java communities in Brazil, where he also leads the BrasilJUGs initiative to incorporate Brazilian JUGs into joint activities.&lt;/p&gt;
&lt;p&gt;He is also the co-creator of &lt;a href=&quot;http://www.jnosql.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Jakarta NoSQL&lt;/a&gt;,Â a Java framework that streamlines the integration of Java applications with NoSQL databases. It defines a set of APIs to interact with NoSQL databases and provides a standard implementation for most NoSQL databases. This helps to achieve veryÂ &lt;em&gt;low coupling&lt;/em&gt;Â with the underlying NoSQL technologies used.&lt;/p&gt;
&lt;h3&gt;Java Champions – &lt;a href=&quot;http://twitter.com/Java_Champions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@Java_Champions&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Well, why the Java Champions handle is here? Because many Java Champions are Jakarta EE experts, so following the official Twitter is nice to be in touch with what they are saying about it.&lt;/p&gt;
&lt;h3&gt;&lt;span class=&quot;css-901oao css-16my406 css-bfa6kz r-hkyrab r-1qd0xha r-1vr29t4 r-ad9z0x r-bcqeeo r-3s2u2q r-qvutc0&quot;&gt;&lt;span class=&quot;css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0&quot;&gt;Alex Theedom&lt;/span&gt;&lt;/span&gt; – &lt;a href=&quot;https://twitter.com/alextheedom&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@alextheedom&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0&quot;&gt;Trainer, Java Champion, Jakarta EE spec committee, author of Jakarta EE &lt;/span&gt;&lt;span class=&quot;css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0&quot;&gt;books and courses&lt;/span&gt;&lt;span class=&quot;css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0&quot;&gt;. Conference speaker and blogger.&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;OmniFaces – &lt;a href=&quot;http://twitter.com/OmniFaces&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@OmniFaces&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OmniFaces is a utility library for JSF 2 that focusses on utilities that ease everyday tasks with the standard JSF API. OmniFaces is a response to frequently recurring problems encountered during ages of professional JSF development and from questions being asked on &lt;a href=&quot;http://stackoverflow.com&quot;&gt;Stack Overflow&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Dmitry Kornilov – &lt;a href=&quot;https://twitter.com/m0mus&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@m0mus&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dmitry has over 20 years of experience in design and implementation of complex software systems, defining systems architecture, team leading and project management. He has worked as project leader of EclipseLink and Yasson and as spec lead of JSON-P and JSON-B specifications.&lt;/p&gt;
&lt;h3&gt;Steve Millidge – &lt;a href=&quot;https://twitter.com/l33tj4v4&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@l33tj4v4&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Steve is the Founder and Director of Payara and C2B2 Consulting. Having used Java extensively since pre1.0, Steve has over 15 yearsâ€™ experience as a field-based Professional Service Consultant along with extensive knowledge of Java middleware.&lt;/p&gt;
&lt;p&gt;Before running his own business, Steve worked for Oracle as a Principal Consultant in Oracleâ€™s Technology Architecture Practice, specializing in Business Process Integration and scalable n-tier component architectures.&lt;/p&gt;
&lt;h3&gt;Emily Jiang – &lt;a href=&quot;https://twitter.com/emilyfhjiang&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@emilyfhjiang&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;il&quot;&gt;Emily&lt;/span&gt; is a &lt;span class=&quot;il&quot;&gt;Java&lt;/span&gt; Champion and has been working on MicroProfile since 2016. She also leads the specifications of MicroProfile Config, Fault Tolerance and Service Mesh. She works for IBM as Liberty Architect for MicroProfile and CDI and is heavily involved in &lt;span class=&quot;il&quot;&gt;Java&lt;/span&gt; EE implementation in Liberty releases.&lt;/p&gt;
&lt;h3&gt;Arjan Tijms – &lt;a href=&quot;https://twitter.com/arjan_tijms&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@arjan_tijms&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Arjan is a Jakarta EE committer and member of the Jakarta EE Steering Committee.&lt;/p&gt;
&lt;h3&gt;MicroProfile – &lt;a href=&quot;https://twitter.com/MicroProfileIO&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@MicroProfileIO&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MicroProfile is a baseline platform definition that optimizes Enterprise Java for a microservices architecture and delivers application portability across multiple MicroProfile runtimes. The initially planned baseline is JAX-RS + CDI + JSON-P, with the intent of the community having an active role in the MicroProfile definition and roadmap.&lt;/p&gt;
&lt;h3&gt;Sebastian Daschner – &lt;a href=&quot;https://twitter.com/DaschnerS&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@DaschnerS&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sebastian has been working with Java enterprise software development for many years. Besides his work for clients, he set a high priority in educating developers in conference presentations, video courses, and training. He believes that teaching others not only greatly improves their situation but also educates yourself.&lt;/p&gt;
&lt;h3&gt;David Heffelfinger – &lt;a href=&quot;http://twitter.com/ensode&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@ensode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;David R. Heffelfinger is an independent consultant based in the greater Washington DC area. He has authored several books on Java EE and related technologies. Heffelfinger has been architecting, designing, and developing software professionally since 1995. He has been using Java as his primary programming language since 1996. He has worked on many large-scale projects for several clients, including the US Department of Homeland Security, Freddie Mac, Fannie Mae, and the US Department of Defense. He has a master’s degree in software engineering from Southern Methodist University, Dallas, Texas. Heffelfinger is a frequent speaker at Java conferences such as Oracle Code One (forme JavaOne).&lt;/p&gt;
&lt;h3&gt;John Clingan – &lt;a href=&quot;https://twitter.com/jclingan&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@jclingan&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;John is Product Manager at Red Hat and an ex Java EE PM. He is also a MicroProfile co-founder.&lt;/p&gt;
&lt;h3&gt;Josh Juneau – &lt;a href=&quot;http://twitter.com/javajuneau&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@javajuneau&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Josh Juneau works as an application developer, system analyst, and database administrator. He is active in many fields of application development but primarily focuses on Jakarta EE. Juneau is a technical writer for Oracle Technology Network, &lt;em&gt;Java Magazine&lt;/em&gt;, and Apress. He is a member of the NetBeans Dream Team, the JCP, and a part of the JSR 372 Expert Group. He enjoys working with the Java communityâ€”he is the director of meetings for the Chicago Java User Group.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Tanja Obradovic&lt;/strong&gt; – &lt;a href=&quot;https://twitter.com/TanjaEclipse&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;@TanjaEclipse&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Tanja is the Jakarta EE Program Manager at Eclipse Foundation.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
	<pubDate>Tue, 08 Jan 2019 00:47:05 +0000</pubDate>
</item>

</channel>
</rss>
