about low code Java frameworks like: CUBA and JMIX, design principles, DTOs and JPA Buddyis available for download.
March 24, 2023
JavaLand 2023
by Ivar Grimstad at March 24, 2023 02:07 PM
This was my ninth JavaLand! Since the conference was canceled in 2020, I have spoken at every JavaLand since it started in 2014, including the online edition of 2021. It is safe to say that it is one of my favorite conferences, and I hope to return again and again!
This year, Eclipse Foundation had a booth where we showcased Jakarta EE and Adoptium. I had a blast talking to all the people that came and visited me at the booth.


My Jakarta EE 10 talk was very well attended. I had the pleasure of presenting in Wintergarten, which is the second-biggest stage at JavaLand. Unfortunately, my development environment acted up on one of the demos, but the rest of the talk went without any issues.
Directly after my regular conference talk, I moderated the Jakarta EE Panel with Ed Burns, Emily Jiang, and Jan Westerkamp as the panelists. We had a couple of topics prepared and got some good questions from the audience as well.
And, last but not least. No conference with Emily without a morning run. At JavaLand, we were both dressed up in our nice Jakarta EE running shirts, as well as the limited Jakarta EE neck warmers.
March 23, 2023
Using UUID As Entity Primary Key In Jakarta EE 10
by Luqman Saeed at March 23, 2023 12:37 PM
In prior versions of Jakarta EE, the use of UUID as entity ID or database primary key type was a vendor specific feature. So even though you could use it, you had to rely on vendor specific constructs to get the mapping right. With the release of Jakarta EE 10 however, the Jakarta Persistence specification now provides native support for using UUID as entity ID type.
The jakarta.persistence.GenerationType now has a UUID option that indicates to the persistence provider to generate and assign RFC 4122 UUID to the annotated field. The HelloEntity below shows how to use this new feature.

Support for Java SE 20 in Open Liberty 23.0.0.3-beta
March 23, 2023 12:00 AM
Open Liberty 23.0.0.3-beta introduces support for Java SE 20, which provides many exciting features and changes. This beta also includes all of Jakarta EE Platform 10 and MicroProfile 6.
The Open Liberty 23.0.0.3-beta includes the following beta features (along with all GA features):
See also previous Open Liberty beta blog posts.
Support for Java SE 20
Try out Java 20, which includes the following features and changes:
By trying out the changes in Java 20 now, you get more time to review your applications, microservices, and runtime environments so you can be a step ahead when it becomes generally available.
Try Java 20 today:
-
Install the 23.0.0.3-beta version of Open Liberty.
-
Edit your Liberty server.env file to point
JAVA_HOME
to your Java 20 installation. -
Start testing!
For more information on Java 20, visit the Java 20 release notes page, API Javadoc page or download page.
Jakarta EE 10 and MicroProfile 6
This beta release also includes Jakarta EE Platform 10 and MicroProfile 6, which were first made available in the 22.0.0.13-beta. To find out more, reference the 22.0.0.13-beta blog post.
Try it now
To try out these features, update your build tools to pull the Open Liberty All Beta Features package instead of the main release. The beta works with Java SE 20, Java SE 17, Java SE 11, and Java SE 8.
If you’re using Maven, you can install the All Beta Features package using:
<plugin>
<groupId>io.openliberty.tools</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<version>RELEASE</version>
<configuration>
<runtimeArtifact>
<groupId>io.openliberty.beta</groupId>
<artifactId>openliberty-runtime</artifactId>
<version>23.0.0.3-beta</version>
<type>zip</type>
</runtimeArtifact>
</configuration>
</plugin>
You must also add dependencies to your pom.xml file for the beta version of the APIs that are associated with the beta features that you want to try. For example, for Jakarta EE 10 and MicroProfile 6, you would include:
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>6.0-RC3</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>10.0.0</version>
<scope>provided</scope>
</dependency>
Or for Gradle:
dependencies {
libertyRuntime group: 'io.openliberty.beta', name: 'openliberty-runtime', version: '[23.0.0.3-beta,)'
}
Or take a look at our Downloads page.
For more information on using a beta release, refer to the Installing Open Liberty beta releases documentation.
We welcome your feedback
Let us know what you think on our mailing list. If you hit a problem, post a question on StackOverflow. If you hit a bug, please raise an issue.
March 21, 2023
8 things you need to know when migrating to Hibernate 6.x
by Thorben Janssen at March 21, 2023 01:00 PM
The post 8 things you need to know when migrating to Hibernate 6.x appeared first on Thorben Janssen.
Hibernate 6 has been released for a while, and the latest Spring Data JPA version includes it as a dependency. So, it’s no surprise that…
The post 8 things you need to know when migrating to Hibernate 6.x appeared first on Thorben Janssen.
March 19, 2023
How JPA Buddy Happened--airhacks.fm podcast
by admin at March 19, 2023 06:59 PM
Subscribe to airhacks.fm podcast via: spotify| iTunes| RSS
Hashtag Jakarta EE #168
by Ivar Grimstad at March 19, 2023 10:59 AM
Welcome to issue number one hundred and sixty-eight of Hashtag Jakarta EE!
I’m back in business after a refreshing vacation! First up is JavaLand next week. Not only will I participate in interviews, panels, and a Jakarta EE talk. I will also staff the Jakarta EE booth in the exhibition area. In addition to this, there are heaps of community activities such as the JavaLand Jogging on Wednesday morning.
The 2023 Jakarta EE Developer Survey is now open. The survey will be open until May 25, but there is no need to wait. Take a couple of minutes and provide your valuable insights.
The Jakarta EE Platform project continues to gather input and plan for Jakarta EE 11. Check out the minutes on the Jakarta EE Platform Project pages. Note that the URL has changed as the repositories have been moved to the Jakarta EE organization on GitHub. This is part of an ongoing effort to better organize the repository locations. When the work is done, the intent is to have all Jakarta EE specification sources at https://github.com/jakartaee, whereas the implementations, samples, tutorials, and other sources are located at https://github.com/eclipse-ee4j.
March 18, 2023
Coding Microservice From Scratch (Part 8) | JAX-RS Done Right! | Head Crashing Informatics 73
by Markus Karg at March 18, 2023 05:00 PM
Write a pure-Java microservice from scratch, without an application server nor any third party frameworks, tools, or IDE plugins — Just using JDK, Maven and JAX-RS aka Jakarta REST 3.1. This video series shows you the essential steps!
You asked me to add dependency injection to our Microservice, so here we go!
If you like this video, please give it a thumbs up, share it, subscribe to my channel, or become my patreon https://www.patreon.com/mkarg. Thanks!
March 15, 2023
Think twice before using an object mapping library to get your DTOs
by Thorben Janssen at March 15, 2023 01:00 PM
The post Think twice before using an object mapping library to get your DTOs appeared first on Thorben Janssen.
I often get asked if I can recommend any object mapping library to map entity objects to DTOs. And you can find several discussions and…
The post Think twice before using an object mapping library to get your DTOs appeared first on Thorben Janssen.
March 14, 2023
Intercepting REST Requests With Jakarta REST Request Filters
by Luqman Saeed at March 14, 2023 12:44 PM
Oftentimes in web applications, there is the need to intercept a request from the client to resource methods. Sometimes this interception must take place even before the request is matched to a resource method. For such needs, Jakarta REST provides the jakarta.ws.rs.container.ContainerRequestFilter interface. This interface is a Jakarta REST extension that can be used to intercept requests to resource methods.
An implementation of this interface can decide if requests should be intercepted before they’re matched to resource methods through the @PreMatching annotation. A pre-matched request filter will be invoked by the container before the request is matched to its intended resource method.
For this blog post, let us look at two use cases for request filters. One is a situation where for security reasons, certain HTTP methods are not allowed. For example an organisation can have a security rule in its firewall that disallows HTTP PUT methods. In this case, either all methods have to be POST or request filters can be used to workaround the restriction.
The second situation is for the custom implementation of authentication. Of course you absolutely should NOT hand-roll your own security setup unless you know in detail exactly what you are doing. You are better off using tried and tested security frameworks and services out there. But for this blog post, assuming we need to implement custom security, we can use a pre matching request filter. The following code snippet below shows a ContainerRequestFilter implementation that implements the two scenarios above.

March 13, 2023
Early 2023 Java / Clouds Events, JUGs, Workshops and Conferences
by admin at March 13, 2023 11:46 AM
-
Gedoplan Remote Session: Standards, J2EE, Java EE, Jakarta EE, MicroProfile ....und nun was?
[online event]
"Expertenkreis Java" remote session 16 Mar 2023https://gedoplan.de/expertenkreisjava/
-
CODE Frenzy Conference: Lean, Fast, Productive - IaC for Serverless Java on AWS
[online event]
CODE Frenzy Virtual Conference 29 Mar 2023https://codefrenzy.pl/bio.html#id=51630
-
Cloud Builders Conference: Сloud Builders: Java Patterns and Practices for Serverless Applications
[online event]
Cloud Builders: Java Virtual Conference 30 Mar 2023https://www.cloud-builders.tech/#agenda-1
-
JUG Zurich: Wenn Cloud, dann richtig... und mit Java
JUG Zurich session (in-person) JUG Zurich Gleisarena FFHS Campus Zürich 30 Mar 2023https://www.jug.ch/html/events/2023/cloud_mit_java.html
-
JUG Zurich: To Cloud Or Not To Cloud What Is The Architectural Difference?
Digital Crafts Day / Conference (in-person) JUG Zurich Ostbayerische Technische Hochschule Amberg-Weiden 28 Apr 2023https://dc-nordoberpfalz.de/digital-crafts-day.php
-
online: AWS Java Bootstrap
[online event]
airhacks.live workshops 15 Jun 2023https://workshops.adam-bien.com/aws-java-bootstrap.htm
-
online: Cost Driven Architectures with Java on AWS
[online event]
airhacks.live workshops 22 Jun 2023https://workshops.adam-bien.com/aws-cost-driven-architectures.htm
Events are also announced at meetup.com/airhacks/ and discord.gg/airhacks
March 08, 2023
Upgrade your cloud-native Java development experience with Liberty Tools for Eclipse IDE
March 08, 2023 12:00 AM
Liberty Tools for Eclipse IDE provides a simplified yet powerful development experience. With capabilities like dev mode, Liberty config editing, and Jakarta EE and MicroProfile code assistance, you can code and manage your application without leaving your IDE.
Try it out today by installing from the Eclipse Marketplace.
Check out the following video for a deep dive walk-through of Liberty Tools for Eclipse IDE:
Let’s dive in!
What is Liberty Tools?
Liberty Tools is the next generation IDE tooling for developing cloud-native Java applications with Liberty. It takes an app-centric approach, leveraging the capabilities of the Liberty Maven and Liberty Gradle plugins, so you no longer have to spend time creating and managing Liberty instances. By running dev mode behind the scenes, the Liberty runtime is automatically downloaded and started, and your app is built, packaged, and deployed to it. To save even more time, listeners detect any changes you make, and your app is automatically rebuilt and redeployed without having to restart the runtime.
Keeping in line with the app-centric design, Liberty Tools provides code assistance for both Jakarta EE and MicroProfile APIs. Code completion, hover descriptions, diagnostics and quick-fixes save time, reduce errors, and keep you focused on your code. Liberty Tools accomplishes this by integrating with the Language Server for Jakarta EE and the Language Server for MicroProfile, both open source projects that are continually adding new features and support.
While much of the runtime mechanics are automated with Liberty Tools, some runtime configuration is, of course, necessary. However, this process has been streamlined with config assistance for server.xml
, bootstrap.properties
, and server.env
files. Rather than having to refer to the documentation to find the correct Liberty feature to add or the appropriate value to set for your specific logging attribute, Liberty Tools provides lists of options and descriptions, all without having to leave Eclipse.
Prefer another IDE? Liberty Tools for Eclipse IDE maintains functional parity with plugins for Visual Studio Code and Intellij IDEA.
Requirements
Liberty Tools for Eclipse IDE is designed to work with supported versions of both the IDE for Java EE Developers and the IDE for Java Developers. While Java 17 is needed to run the tool, you can choose a different version of Java to run your application.
Since Liberty Tools uses the Liberty Maven and Liberty Gradle plugins behind the scenes, these plugins must be configured in your application’s pom.xml
or build.gradle
files. Liberty Tools will also need to run the Maven or Gradle executable which can be accomplished by configuring the Maven and Gradle home in the tool’s preferences, or including a wrapper with the application.
Managing your applications
Any application in your Eclipse workspace that contains src/main/liberty/config/server.xml
is automatically enabled to run with Liberty Tools. Actions are available to manage these apps such as Start
, Stop
, Debug
and Run Tests
, and you can run these actions from either the Liberty Dashboard or the Eclipse Run As menu.
Liberty Dashboard
The Liberty Dashboard consolidates the Liberty enabled applications in your workspace into a single view. To open the dashboard, click on the Open Liberty UFO icon on the top tray or press Alt + L. To run an action, simply right-click on an app in the list.

Eclipse Run As menu
Liberty Tools offers the same set of actions in the Eclipse Run As menu that appears when you right click on a project in the Project Explorer view.

Starting your app
To start your application in dev mode, select either the Start or Start… actions. The latter opens a Run Configurations dialog box where you can add to the command-line parameters such as additional parameters to dev mode or configure the JRE to use when running the app. When a start action is selected, Liberty Tools opens a Terminal tab and starts dev mode.


The Start in container action will start dev mode in a local Docker container and requires 'docker' on the PATH.
|
Running tests
Tests are important for any application. Liberty Tools makes it easy to run your unit and integration tests by either selecting the Run tests
action, or simply clicking Enter
in the terminal. You can even view the results of your latest run by selecting View test reports
.
Debugging your app
By default, the Liberty runtime is configured with port 7777 for debugging. However, this configuration requires that port to be available on your system and for you to manually attach a debugger. With Liberty Tools, you can start your app using the Debug
action, which finds an available port and automatically attaches the Eclipse debugger to it.
Get coding!
Liberty Tools provides coding assistance for Jakarta EE and MicroProfile APIs, as well as select Liberty configuration files.
Jakarta EE
Code completion for Jakarta EE makes it easy to add classes and methods to your app. Just type CTRL + Space from within any Java file to choose from a list of available code snippets. Additionally, diagnostics flag errors and suggest quick-fixes to implement on the spot.


MicroProfile
Similar code completion is available for MicroProfile, as well as type-ahead suggestions and hover descriptions for MicroProfile Config properties. You can easily see what values are set for injected properties directly from your code and get lists of available variables and values to add to your configuration.


Liberty config editing
Liberty Tools streamlines the process of configuring the Liberty runtime through config completion for server.xml
, bootstrap.properties
and server.env
files. Type CTRL + Space from within these files to get lists of suggested configuration elements, properties, and values.


March 06, 2023
Openshift Cheatsheet for DevOps
by F.Marchioni at March 06, 2023 02:05 PM
In this article you will find a comprehensive Openshift Container Platform cheat sheet for System Administrators and Developers. Login and Configuration Firstly, let’s check the most common commands for Login and Configuration in OpenShift: #login with a user oc login https://192.168.99.100:8443 -u developer -p developer #login as system admin oc login -u system:admin #User Information ... Read more
The post Openshift Cheatsheet for DevOps appeared first on Mastertheboss.
March 04, 2023
Speed it up by throwing it away | Maven Contribution | Java Coding | Head Crashing Informatics 72
by Markus Karg at March 04, 2023 05:00 PM
For a third time, I speeded up Plexus-Utils, which is the workhorse underlying #Maven. This time, simply by throwing code away!
If you like this video, please give it a thumbs up, share it, subscribe to my channel, or become my patreon https://www.patreon.com/mkarg. Thanks!
February 25, 2023
Quarkus Reactive REST made easy
by F.Marchioni at February 25, 2023 10:10 AM
Quarkus JAX RS implementation has improved a lot since its first release. Within this tutorial we will show some new features which are available in Quarkus starting from the new reactive REST paradigm. Quarkus uses SmallRye Mutiny for as main Reactive library. In our first tutorial, we have discussed how to use Mutiny to deliver ... Read more
The post Quarkus Reactive REST made easy appeared first on Mastertheboss.
February 17, 2023
How to change Quarkus default HTTP Port?
by F.Marchioni at February 17, 2023 09:23 PM
Quarkus includes the “undertow” extension which is triggered when you include a JAXRS dependency in your project. We will see in this tutorial which are the most common settings you can apply to a Quarkus application to configure the embedded Undertow server. First of all let’s specify how you can set configuration parameters on Quarkus. ... Read more
The post How to change Quarkus default HTTP Port? appeared first on Mastertheboss.
February 16, 2023
What is Apache Camel and how does it work?
by Rhuan Henrique Rocha at February 16, 2023 11:14 PM
In this post, I will talk to you about what the Apache Camel is. It is a brief introduction before I starting to post practical content. Thus, let’s go to understand what this framework is.
Apache Camel is an open source Java integration framework that allows different applications to communicate with each other efficiently. It provides a platform for integrating heterogeneous software systems. Camel is designed to make application integration easy, simplifying the complexity of communication between different systems.
Apache Camel is written in Java and can be run on a variety of platforms, including Jakarta EE application servers and OSGi-based application containers, and can runs inside cloud environments using Spring Boot or Quarkus. Camel also supports a wide range of network protocols and message formats, including HTTP, FTP, SMTP, JMS, SOAP, XML, and JSON.
Camel uses the Enterprise Integration Patterns (EIP) pattern to define the different forms of integration. EIP is a set of commonly used design patterns in system integration. Camel implements many of these patterns, making it a powerful tool for integration solutions.
Additionally, Camel has a set of components that allow it to integrate with different systems. The components can be used to access different resources, such as databases, web services, and message systems. Camel also supports content-based routing, which means it can route messages based on their content.
Camel is highly configurable and extensible, allowing developers to customize its functionality to their needs. It also supports the creation of integration routes at runtime, which means that routes can be defined and changed without the need to restart the system.
In summary, Camel is a powerful and flexible tool for software system integration. It allows different applications to communicate efficiently and effectively, simplifying the complexity of system integration. Camel is a reliable and widely used framework that can help improve the efficiency and effectiveness of system integration in a variety of environments.
If you want to start using this framework you can access the documentation at the site. It’s my first post about the Apache Camel and will post more practical content about this amazing framework.
February 03, 2023
Jersey 3.1.1 released – focused on performance
by Jan at February 03, 2023 11:50 PM
February 02, 2023
How to use a Datasource in Quarkus
by F.Marchioni at February 02, 2023 10:13 AM
Agroal is a connection pool implementation that can be used with Quarkus to manage database connections. In this tutorial, we will go over how to use the DataSource in a Quarkus application. First, you’ll need to add the Agroal extension to your Quarkus application. You can do this by adding the following dependency to your ... Read more
The post How to use a Datasource in Quarkus appeared first on Mastertheboss.
January 31, 2023
Jakarta EE track at Devnexus 2023!!!!
by Tanja Obradovic at January 31, 2023 08:25 PM
We have great news to share with you!
For the very first time at Devnexus 2023 we will have Jakarta EE track with 10 sessions and we will take this opportunity, to whenever possible, celebrate all we have accomplished in Jakarta EE community.
Jakarta EE track sessions
- 5 years of Jakarta EE Panel: a look into the future (hosted by Ivar and Tanja)
- Deep Dive MicroProfile 6.0 with Jakarta EE 10 Core Profile
- From javax to jakarta, the path paved with pitfalls
- Jakarta EE 10 and Beyond
- Jakarta EE and MicroProfile Highlights
- Jakarta EE for Spring Developers
- Jakarta EE integration testing
- Jakarta EE or Spring? Real world testimonies
- Let's take a look at how a Jakarta EE cloud-native application should look!
- Upgrading a Legacy Java EE App with Style
You may not be aware but this year (yes, time flies!!) marks 5 years of Jakarta EE, so we will be celebrating through out the year! Devnexus 2023, looks a great place to mark this milestone as well! So stay tuned for details, but in the meanwhile please help us out, register for the event come to see us and spread the word.
Help us out in spreading the word about Jakarta EE track @Devnexus 2023, just re-share posts you see from us on various social platforms!
To make it easier for you to spread the word on socials, we also have prepared a social kit document to help us with promotion of the Jakarta EE track @Devnexus 2023, sessions and speakers. The social kit document is going to be updated with missing sessions and speakers, so visit often and promote far and wide.
Note: Organizers wanted to do something for people impacted by the recent tech layoffs, and decided to offer a 50% discount for any conference pass (valid for a limited time). Please use code DN-JAKARTAEE for @JakartaEE Track to get additional 20% discount!
In addition, there will be an IBM workshop that will be highlighting Jakarta EE; look for "Thriving in the cloud: Venturing beyond the 12 factors". Please use the promo code ($100 off): JAKARTAEEATDEVNEXUS the organizers prepared for you (valid for a limited time).
I hope to see you all at Devnexus 2023!
January 25, 2023
Jakarta EE Community Update - 2022 in Review
by Tanja Obradovic at January 25, 2023 06:08 PM
2022 was an extremely important and successful year for Jakarta EE! We continue to see growth in membership, growth of compatible products, and most importantly growth of contributors and committers.
Here are some highlights from 2022:
Releases
We released Jakarta EE 10 the first innovative community driven release with the new features. Jakarta EE 10 defines a new profile specification with Jakarta EE Core Profile 10. The “Core Profile” is targeting modernized and lightweight Java applications and microservices.
The release also contains updates in over 20 specifications and adds important features requested by our global community. It also has a new profile:Jakarta EE Core Profile
- Jakarta Contexts and Dependency Injection (CDI) 4.0, including CDI-Lite that enables build time extensions
- Jakarta Security 3.0 supporting OpenID Connect
- Jakarta Servlet 6.0 for simplified programming and improved security
- Jakarta Faces (JSF) 4.0 with a modernized API using CDI
- Jakarta JSON Binding (JSON-B) 3.0 with new support for polymorphic types
- Jakarta RESTful Web Services standardizes a Java SE Bootstrap API and standard support for multipart/form-data
- Jakarta Persistence standardizing UUID as Basic Type and extending Query language and Query API
- Jakarta Concurrency 3.0 is moved to the Web Profile and enhances parallel and reactive programming models available to applications
The work on Jakarta EE 11 has started! Now is a great time to get involved and have an impact on the development of the technology. The Jakarta EE Steering Committee has approved a resolution about the next Jakarta EE 11 release with the following high level guidelines:
- Target Java version 21
- Target GA date Q1 2024
- Priorities
- Unified APIs improving Developer Experience
- New Specifications
- Build on the Latest Java
- Enable Community Contribution
These guidelines are provided to encourage a common community direction for Jakarta EE 11.
Jakarta EE Platform team meetings are open for everyone to attend! There are weekly calls happening on Tuesdays at 11:00 AM ET and everyone is welcome to join. Please check the Jakarta EE Specifications Calendar (public url, iCal) for details. We are looking forward to more involvement and input from the community! If you miss a call or are interested in seeing what is being discussed, check out the meeting minutes.
Membership Growth
We have noticed growth in the individuals becoming contributors and committers in the Jakarta EE Specification projects. We encouraged, promoted and celebrated individual contributions in one of our Jakarta EE Studio sessions during the JakartaOne Livestream 2022 event.
We also had a great year for organization membership growth. New members from 2022 are:
- Beijing Vsettan Data Technology Co. Ltd.
- Microsoft
- OmniFish
- NEC Corporation
- Shenzhen Ping A Communication Technology Co., Ltd
- Garden State JUG
- Open Elements
Compatible Products Program
The compatible product list is continually growing!
In total for all the releases, 17 vendors with 19 products listed are on the Jakarta EE Compatible Products page so far.
- Jakarta EE 10 (5 vendors with 4 Full Profile Compatible Products and 3 Web Profile and 3 Core Profile Compatible Products; some products with multiple versions) https://jakarta.ee/compatibility/certification/10/
- Jakarta EE 9.1 (12 vendors with 11 Full Profile Compatible Products and 5 Web Profile Compatible Products; some products with multiple versions) https://jakarta.ee/compatibility/certification/9.1/
- Jakarta EE 9 (6 vendors with 6 Full Profile Compatible Products and 4 Web Profile Compatible Products) https://jakarta.ee/compatibility/certification/9/
- Jakarta EE 8 (17 vendors with 19 Full Profile Compatible Products and 6 Web Profile Compatible Products) https://jakarta.ee/compatibility/certification/8/
JakartaOne Livestream Events
Our popular JakartaOne Livestream virtual conference series has attracted many interesting speakers and even more attendees!
56 Speakers:
- 12 Keynotes
- 33 Technical Talks
- 20 Vendor Presentations
- 36+ hours
We had over 2000 registered attendees for the live event and over 3000 YouTube playlist views!
The biggest celebration of Jakarta EE is always our JakartaOne Livestream annual event! This year was no exception, JakartaOne Livestream 2022 took place on December 6, 2022 and it was a great success!
The JakartaOne Livestream virtual conferences, as you know, run in different languages as well!
This year we had the following language-specific events:
- JakartaOne Livestream - German - June 30, 2022
- JakartaOne LiveStream - Japanese - September 16, 2022
- JakartaOne Livestream - Chinese - August 31, 2022
- JakartaOne Livestream - Portuguese - September 29, 2022
If you and your community have interest in organizing the JakartaOne Livestream event, please visit jakartaone.org and find out all about hosting the event!
Jakarta EE Developer Survey!
Now in its sixth year, this is the enterprise Java ecosystem’s leading survey with thousands of developers sharing their insights from around the globe. This time around, we will launch the survey on March 16, 2023. Please take the survey and share it with your network to maximize the community outreach. Your input is greatly appreciated and matters to help Java ecosystem stakeholders better understand the requirements, priorities, and perceptions of enterprise developer communities.
Key findings of the 2022 survey include:
- Jakarta EE is the basis for the top frameworks used for building cloud native applications
- The top three frameworks for building cloud native applications include Spring/Spring Boot, which lost ground this year at 57% (60% in 2022), followed by Jakarta EE at 53% (up from 47% in 2021), and MicroProfile at 30% (down from 34% in 2021). It’s important to note that Spring/SpringBoot is reliant on Jakarta EE developments for its operation and is not competitive with Jakarta EE. Both are critical ingredients to the healthy enterprise Java ecosystem.
- Jakarta EE 9/9.1 usage has grown to 14% (vs. 9% in 2021).
- While 36% of respondents have already migrated or plan to adopt Jakarta EE 9/9.1 (with 14% already running Jakarta EE 9/9.1 in production), 19% of respondents plan to skip Jakarta EE 9/9.1 altogether and move directly to Jakarta EE 10.
- Over 59% of respondents (48% in 2021) have migrated to Jakarta EE or plan to do so within the next 6-24 months.
Stay tuned for the 2023 Developer Survey URL on March 16!
Jakarta Tech Talks
Jakarta Tech Talks is another very popular community oriented meet-up series that is designed to share knowledge and invite all interested to participate in Jakarta EE-related technologies. We had 13 sessions in 2022 and we have quite a few sessions already scheduled for 2023!
If you are interested in presenting or have an idea on what you would like to hear in a Jakarta Tech Talk, please let us know.
______________________________
The Jakarta EE Working Group Charter can be viewed here. More information about the working group is available via its website and its mailing lists can be found here. The Jakarta EE Working Group is supported and backed by its industry members. The Working Group has declared these projects as being in its purview. Jakarta EE compatible products can be viewed here.
Stay Connected With the Jakarta EE Community
The Jakarta EE community is very active and there are a number of channels to help you stay up to date with all of the latest and greatest news and information. Subscribe to your preferred channels today:
· Social media: Twitter, Facebook, LinkedIn Group, LinkedIn Page
· Mailing lists: jakarta.ee-community@eclipse.org, jakarta.ee-wg@eclipse.org, project mailing lists, Slack workspace
· Calendars: Jakarta EE Community Calendar, Jakarta EE Specification Meetings Calendar
· Newsletters, blogs, and emails: Eclipse Community Newsletter, Jakarta EE blogs, Hashtag Jakarta EE
· Meetings: Jakarta Tech Talks, Jakarta EE Update, and Eclipse Foundation events and conferences
You can find the complete list of channels here.
To help shape the future of open source, cloud native Java, get involved in the Jakarta EE Working Group.
To learn more about Jakarta EE-related plans and check the date for the next Jakarta Tech Talk, be sure to bookmark the Jakarta EE Community Calendar.
We always welcome your feedback!
Thank you for your interest and involvement in Jakarta EE!
REST Crud Application using Quarkus and Vue.js
by F.Marchioni at January 25, 2023 03:01 PM
This article shows how to run a Quarkus 3 application using Jakarta REST Service and a Vue.js front-end. The example application will wrap the CRUD method of the endpoint with equivalent Vue.js functions. Let’s get started ! Pre-requisites: You should be familiar with REST Services and VueJS Web interfaces. If you are new to that, ... Read more
The post REST Crud Application using Quarkus and Vue.js appeared first on Mastertheboss.
January 22, 2023
Comparing Jackson vs JSONB
by F.Marchioni at January 22, 2023 07:06 PM
JSON-B and Jackson are both libraries that can be used for parsing and generating JSON data in Java. However, they have some differences in their functionality and usage. This tutorial will discuss them in detail. Jackson and JSON-B in a nutshell Firstly, if you are new to JSON parsing, let’s give an overview to these ... Read more
The post Comparing Jackson vs JSONB appeared first on Mastertheboss.
January 19, 2023
Getting started with Quarkus 3
by F.Marchioni at January 19, 2023 12:47 PM
This article introduces some of the new features of the upcoming Quarkus 3 release which is, at the time of writing, in Alpha state. We will cover the main highlights and some tools you can use to upgrade existing Quarkus applications. Quarkus 3 highlights Firstly, let’s discuss Quarkus 3 main highlights: An example Quarkus 3 ... Read more
The post Getting started with Quarkus 3 appeared first on Mastertheboss.
How do I know the WSDL URL of my Web Service ?
by F.Marchioni at January 19, 2023 08:58 AM
In this tutorial we will learn how to find the SOAP Web Service WSDL URL, so that you can quickly test your SOAP Web Service. SOAP Web Service overview Firstly, let’s deploy a sample SOAP Web Service on JBoss EAP or WildFly. If you inspect the server.log file, you will see that the Logger org.jboss.ws.cxf.metadata ... Read more
The post How do I know the WSDL URL of my Web Service ? appeared first on Mastertheboss.
January 09, 2023
How to do a Database dump of H2 DB
by F.Marchioni at January 09, 2023 10:18 AM
Using the H2 Database is a common option when developing application prototypes. Once challenge is that, if you are using it as in-memory embedded H2 database , you cannot access the database from outside the JVM. A simple trick is to create a dump of the database, to check the data in all tables In ... Read more
The post How to do a Database dump of H2 DB appeared first on Mastertheboss.
January 02, 2023
How to configure Java Memory in a Docker Container
by F.Marchioni at January 02, 2023 03:52 PM
When running a Java application in a Docker container, it is important to properly configure the JVM memory settings. This is essential to ensure that the application has enough memory to run correctly. If you don’t specify a value for the --memory flag when starting a Docker container, the container will be given an automatic ... Read more
The post How to configure Java Memory in a Docker Container appeared first on Mastertheboss.
November 19, 2022
Jakarta EE and MicroProfile at EclipseCon Community Day 2022
by Reza Rahman at November 19, 2022 10:39 PM
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 here. All the materials can be found here.

Jakarta EE Community State of the Union
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 here.
Jakarta Concurrency – What’s Next
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 here. There are some excellent code examples included.
Jakarta Security – What’s Next
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 here.
Jakarta Data – What’s Coming
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 here. There are some excellent code examples included.
MicroProfile Community State of the Union
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 here. There are some excellent technical details included.
MicroProfile Telemetry – What’s Coming
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 here. There are some excellent technical details and code examples included.
See You There Next Time?
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.
November 15, 2022
Jersey 3.1.0 is finally released
by Jan at November 15, 2022 03:31 PM
November 04, 2022
JFall 2022
November 04, 2022 09:56 AM
An impression of JFall by yours truly.
keynote
Sold out!
Packet room!
Very nice first keynote speaker by Saby Sengupta about the path to transform.
He is a really nice storyteller. He had us going.
Dutch people, wooden shoes, wooden hat, would not listen
- Saby
lol
Get the answer to three why questions. If the answers stop after the first why. It may not be a good idea.
This great first keynote is followed by the very well known Venkat Subramaniam about The Art of Simplicity.
The question is not what can we add? But What can we remove?
Simple fails less
Simple is elegant
All in al a great keynote! Loved it.
Design Patterns in the light of Lambdas
By Venkat Subramaniam
The GOF are kind of the grand parents of our industry. The worst thing they have done is write the damn book.
— Venkat
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.
The cleanup is the responsibility of the Resource class. Much better than asking developers to take care of it. It will be forgotten!
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.
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.
Still a great talk though.
lunch
Was actually very nice!
NLJUG update keynote
The Java Magazine was mentioned we (as Editors) had to shout for that!
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.
Then the voting for the Innovation Awards.
I kinda missed the next keynote by ING because I was playing with a rubix cube and I did not really like his talk
jakarta EE 10 platform
by Ivar Grimstad
Ivar talks about the specification of Jakarta EE.
To create a lite version of CDI it is possible to start doing things at build time and facilitate other tools like GraalVM and Quarkus.
He gives nice demos on how to migrate code to work in de jakarta namespace.
To start your own Jakarta EE application just go to start.jakarta.ee en follow the very simple UI instructions
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.
Be prepared to do some namespace changes when moving from Java EE 8 to Jakarta EE.
All slides here
conclusion
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.
See you at JSpring.
Ivo.
September 26, 2022
Survey Says: Confidence Continues to Grow in the Jakarta EE Ecosystem
by Mike Milinkovich at September 26, 2022 01:00 PM
The results of the 2022 Jakarta EE Developer Survey 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.
Strong Turnout Helps Drive Future of Jakarta EE
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.
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.
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.
Findings Indicate Growing Adoption and Rising Expectations
Some of the survey’s key findings include:
- Jakarta EE is the basis for the top frameworks used for building cloud native applications.
- 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.
- Jakarta EE 9/9.1 usage increased year-over-year by 5%.
- Java EE 8, Jakarta EE 8, and Jakarta EE 9/9.1 hit the mainstream with 81% adoption.
- 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.
- Most respondents said they have migrated to Jakarta EE already or planned to do so within the next 6-24 months.
- The top three community priorities for Jakarta EE are:
- Native integration with Kubernetes (same as last year)
- Better support for microservices (same as last year)
- Faster support from existing Java EE/Jakarta EE or cloud vendors (new this year)
Two of the results, when combined, highlight something interesting:
- 19% of respondents planned to skip Jakarta EE 9/9.1 and go straight to 10 once it’s available
- 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
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.
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.
Learn More
If you’d like to learn more about the project, there are several Jakarta EE mailing lists to sign up for. You can also join the conversation on Slack. And if you want to get involved, start by choosing a project, sign up for its mailing list and start communicating with the team.
September 22, 2022
Jakarta EE 10 Brings Java Development Into the Modern Cloud Native Era
by Mike Milinkovich at September 22, 2022 04:00 PM
Jakarta EE, a Working Group hosted by the Eclipse Foundation, released Jakarta EE 10 today.
This achievement was only possible because of a global community of contributors. Congratulations and thank you to everyone who played a part in this release.
There are many new and innovative features added by the Jakarta EE community.
Jakarta EE 10 Enables Modern, Lightweight Java Applications and Microservices
Let’s start with some of the key updates in Jakarta EE 10 — updates that plant Jakarta EE firmly in the modern era of open source microservices and containers.
Most prominently, Jakarta EE 10 includes a new profile specification: Jakarta EE Core Profile. The Core Profile includes a subset of Jakarta EE specifications that target the smaller, lightweight runtimes needed for microservices development. This is the first new Profile added to the enterprise Java specifications in over a decade.
In addition, new functionality has been added to more than 20 component specifications. For example:
- Jakarta Contexts and Dependency Injection (CDI) 4.0 includes a new CDI-Lite specification allowing a reflection-free programing model that enables compiling to native by providing build compatible extensions.
- Jakarta RESTful Web Services 3.1 standardizes a Java SE Bootstrap API and support for multipart/form-dat
- Jakarta Security 3.0 supports OpenID Connect for authentication to help developers meet modern web-based security requirements
Jakarta EE 10 also broadens support for annotations so it’s easier to build modularized applications and there’s better integration across component APIs.
Finally, I want to point out that Jakarta EE 10 gives enterprises the flexibility to leverage Java in the way that’s best for their organization. They can:
- Develop and deploy Jakarta EE 10 applications on Java SE 11 as well as Java SE 17, the most current long-term support (LTS) release of Java SE
- Take advantage of new features, including the modular system, that were introduced in Java SE 9 and supported in Java SE 11
The Jakarta EE Gamble Is Paying Off
This is all great news for Jakarta EE. But to understand how significant this release is, we need to go back to the Java EE days.
Java EE was the bedrock of application development for the Fortune 1000 for 20 years before it moved to the Eclipse Foundation as Jakarta EE. But the first Jakarta EE releases didn’t add new functionality. Then, Jakarta EE 9 introduced a major breaking change: the move to the jakarta.* namespace.
It’s hard to overstate what a gamble that was. Java EE had been basically backwards-compatible for more than two decades. We asked enterprises to change the fundamentals of applications they’d been relying on for a long time. We asked the enterprise Java ecosystem to re-align their products and opens source projects on a new namespace. Oftentimes, when you try to make such a radical change, your ecosystem says no, it’s too much work. And quite a few people thought the Jakarta EE gamble could fail for exactly that reason.
But it didn’t. IBM, Red Hat, Payara, Spring, the Apache Tomcat and TomEE projects, and Eclipse Jetty, to name a few, all moved to the new namespace with us.
Now, with new support for modern microservices architectures and containers, Jakarta EE 10 paves the way for Jakarta EE to drive the innovative, multi-vendor standards needed for the future of our industry.
Get Involved in the Future of Jakarta EE
The momentum around Jakarta EE 10 is well underway. Eclipse GlassFish has released a compatible implementation, and other enterprises and project teams — including Fujitsu, IBM, Oracle, Payara, Red Hat and Tomitribe — are already working towards certifying Jakarta EE 10 compatible products
Jakarta EE has an exciting future ahead, and we want everyone to participate and contribute. To learn more, connect with the global community. If enterprise Java is important to your business strategy, join the Jakarta EE Working Group. Learn more about the benefits and advantages of membership here.
Jakarta EE 10 has Landed!
by javaeeguardian at September 22, 2022 03:48 PM
The Jakarta EE Ambassadors are thrilled to see Jakarta EE 10 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.
There are quite a few changes that were delivered – here are some key themes and highlights:
- CDI Alignment
- @Asynchronous in Concurrency
- Better CDI support in Batch
- Java SE Alignment
- Support for Java SE 11, Java SE 17
- CompletionStage, ForkJoinPool, parallel streams in Concurrency
- Bootstrap APIs for REST
- Closing standardization gaps
- 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
- CDI Lite/Core Profile to enable next generation cloud native runtimes – MicroProfile will likely align with CDI Lite/Jakarta EE Core
- Deprecation/removal
- @Context annotation in REST, EJB Entity Beans, embeddable EJB container, deprecated Servlet/Faces/CDI features
While there are many features that we identified in our Jakarta EE 10 Contribution Guide 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 see here what was delivered, what’s on the way and what gaps still remain. You can try Jakarta EE 10 out now using compatible implementations 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.
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 join us.
Jakarta EE is truly moving forward – the next phase of the platform’s evolution is here!
July 13, 2022
Java Reflections unit-testing
by Vladimir Bychkov at July 13, 2022 09:06 PM
July 06, 2022
The Power of Enum – Take advantage of it to make your code more readable and efficient
by otaviojava at July 06, 2022 06:51 AM
May 05, 2022
Java EE - Jakarta EE Initializr
May 05, 2022 02:23 PM
Getting started with Jakarta EE just became even easier!
Get started
Hot new Update!
Moved from the Apache 2 license to the Eclipse Public License v2 for the newest version of the archetype as described below.
As a start for a possible collaboration with the Eclipse start project.
New Archetype with JakartaEE 9
JakartaEE 9 + Payara 5.2022.2 + MicroProfile 4.1 running on Java 17
- And the docker image is also ready for x86_64 (amd64) AND aarch64 (arm64/v8) architectures!
February 21, 2022
FOSDEM 2022 Conference Report
by Reza Rahman at February 21, 2022 12:24 AM
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 & Inclusion.

Fundamentals of Diversity & Inclusion for Technologists
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 & 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 SpeakerDeck. The video for the talk is now posted on YouTube.
Jakarta EE – Present and Future
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 SpeakerDeck. The video for the talk is now posted on YouTube.
I am very happy to have had the opportunity to speak at FOSDEM. I hope to contribute again in the future.
January 18, 2022
Making Readable Code With Dependency Injection and Jakarta CDI
by otaviojava at January 18, 2022 03:53 PM
December 12, 2021
Infinispan Apache Log4j 2 CVE-2021-44228 vulnerability
December 12, 2021 10:00 PM
Infinispan 10+ uses Log4j version 2.0+ and can be affected by vulnerability CVE-2021-44228, which has a 10.0 CVSS score. The first fixed Log4j version is 2.15.0.
So, until official patch is coming, - you can update used logger version to the latest in few simple steps
- Download Log4j version 2.15.0: https://www.apache.org/dyn/closer.lua/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.zip
- Unpack distributive
- Replace affected libraries
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 ./
Please, note - patch above is not official, but according to initial tests it works with no issues
November 18, 2021
JPA query methods: influence on performance
by Vladimir Bychkov at November 18, 2021 07:22 AM
October 27, 2021
Eclipse Jetty Servlet Survey
by jesse at October 27, 2021 01:25 PM
September 30, 2021
Custom Identity Store with Jakarta Security in TomEE
by Jean-Louis Monteiro at September 30, 2021 11:42 AM
In the previous post, we saw how to use the built-in ‘tomcat-users.xml’ identity store with Apache TomEE. 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.
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.
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.
What is an identity store?
An identity store is a database or a directory (store) of identity information about a population of users that includes an application’s callers.
In essence, an identity store contains all information such as caller name, groups or roles, and required information to validate a caller’s credentials.
How to implement my own identity store?
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.
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
}
}
By default, an identity store is used for both validating user credentials and providing groups/roles for the authenticated user. Depending on what #validationTypes() will return, you will have to implement #validate(…) and/or #getCallerGroups(…)
#getCallerGroups(…) will receive the result of #valide(…). Let’s look at a very simple example:
@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("jon", "doe")) {
return new CredentialValidationResult("jon", new HashSet<>(asList("foo", "bar")));
}
if (usernamePasswordCredential.compareTo("iron", "man")) {
return new CredentialValidationResult("iron", new HashSet<>(Collections.singletonList("avengers")));
}
return INVALID_RESULT;
}
}
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.
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.
IMPORTANT: for TomEE to pick it up and use it in your application, the identity store must be a CDI bean.
The complete and runnable example is available under https://github.com/apache/tomee/tree/master/examples/security-custom-identitystore
The post Custom Identity Store with Jakarta Security in TomEE appeared first on Tomitribe.
September 24, 2021
Book Review: Practical Cloud-Native Java Development with MicroProfile
September 24, 2021 12:00 AM
General information
- Pages: 403
- Published by: Packt
- Release date: Aug 2021
Disclaimer: I received this book as a collaboration with Packt and one of the authors (Thanks Emily!)
A book about Microservices for the Java Enterprise-shops
Year after year many enterprise companies are struggling to embrace Cloud Native practices that we tend to denominate as Microservices, however Microservices is a metapattern that needs to follow a well defined approach, like:
- (We aim for) reactive systems
- (Hence we need a methodology like) 12 Cloud Native factors
- (Implementing) well-known design patterns
- (Dividing the system by using) Domain Driven Design
- (Implementing microservices via) Microservices chassis and/or service mesh
- (Achieving deployments by) Containers orchestration
Many of these concepts require a considerable amount of context, but some books, tutorials, conferences and YouTube videos tend to focus on specific niche information, making difficult to have a "cold start" in the microservices space if you have been developing regular/monolithic software. For me, that's the best thing about this book, it provides a holistic view to understand microservices with Java and MicroProfile for "cold starter developers".
About the book
Using a software architect perspective, MicroProfile could be defined as a set of specifications (APIs) that many microservices chassis implement in order to solve common microservices problems through patterns, lessons learned from well known Java libraries, and proposals for collaboration between Java Enterprise vendors.
Subsequently if you think that it sounds a lot like Java EE, that's right, it's the same spirit but on the microservices space with participation for many vendors, including vendors from the Java EE space -e.g. Red Hat, IBM, Apache, Payara-.
The main value of this book is the willingness to go beyond the APIs, providing four structured sections that have different writing styles, for instance:
- Section 1: Cloud Native Applications - Written as a didactical resource to learn fundamentals of distributed systems with Cloud Native approach
- Section 2: MicroProfile Deep Dive - Written as a reference book with code snippets to understand the motivation, functionality and specific details in MicroProfile APIs and the relation between these APIs and common Microservices patterns -e.g. Remote procedure invocation, Health Check APIs, Externalized configuration-
- Section 3: End-to-End Project Using MicroProfile - Written as a narrative workshop with source code already available, to understand the development and deployment process of Cloud Native applications with MicroProfile
- Section 4: The standalone specifications - Written as a reference book with code snippets, it describes the development of newer specs that could be included in the future under MicroProfile's umbrella
First section
This was by far my favorite section. This section presents a well-balanced overview about Cloud Native practices like:
- Cloud Native definition
- The role of microservices and the differences with monoliths and FaaS
- Data consistency with event sourcing
- Best practices
- The role of MicroProfile
I enjoyed this section because my current role is to coach or act as a software architect at different companies, hence this is good material to explain the whole panorama to my coworkers and/or use this book as a quick reference.
My only concern with this section is about the final chapter, this chapter presents an application called IBM Stock Trader that (as you probably guess) IBM uses to demonstrate these concepts using MicroProfile with OpenLiberty. The chapter by itself presents an application that combines data sources, front/ends, Kubernetes; however the application would be useful only on Section 3 (at least that was my perception). Hence you will be going back to this section once you're executing the workshop.
Second section
This section divides the MicroProfile APIs in three levels, the division actually makes a lot of sense but was evident to me only during this review:
- The base APIs to create microservices (JAX-RS, CDI, JSON-P, JSON-B, Rest Client)
- Enhancing microservices (Config, Fault Tolerance, OpenAPI, JWT)
- Observing microservices (Health, Metrics, Tracing)
Additionally, section also describes the need for Docker and Kubernetes and how other common approaches -e.g. Service mesh- overlap with Microservice Chassis functionality.
Currently I'm a MicroProfile user, hence I knew most of the APIs, however I liked the actual description of the pattern/need that motivated the inclusion of the APIs, and the description could be useful for newcomers, along with the code snippets also available on GitHub.
If you're a Java/Jakarta EE developer you will find the CDI section a little bit superficial, indeed CDI by itself deserves a whole book/fascicle but this chapter gives the basics to start the development process.
Third section
This section switches the writing style to a workshop style. The first chapter is entirely focused on how to compile the sample microservices, how to fulfill the technical requirements and which MicroProfile APIs are used on every microservice.
You must notice that this is not a Java programming workshop, it's a Cloud Native workshop with ready to deploy microservices, hence the step by step guide is about compilation with Maven, Docker containers, scaling with Kubernetes, operators in Openshift, etc.
You could explore and change the source code if you wish, but the section is written in a "descriptive" way assuming the samples existence.
Fourth section
This section is pretty similar to the second section in the reference book style, hence it also describes the pattern/need that motivated the discussion of the API and code snippets. The main focus of this section is GraphQL, Reactive Approaches and distributed transactions with LRA.
This section will probably change in future editions of the book because at the time of publishing the Cloud Native Container Foundation revealed that some initiatives about observability will be integrated in the OpenTelemetry project and MicroProfile it's discussing their future approach.
Things that could be improved
As any review this is the most difficult section to write, but I think that a second edition should:
- Extend the CDI section due its foundational status
- Switch the order of the Stock Tracer presentation
- Extend the data consistency discussión -e.g. CQRS, Event Sourcing-, hopefully with advances from LRA
The last item is mostly a wish since I'm always in the need for better ways to integrate this common practices with buses like Kafka or Camel using MicroProfile. I know that some implementations -e.g. Helidon, Quarkus- already have extensions for Kafka or Camel, but the data consistency is an entire discussion about patterns, tools and best practices.
Who should read this book?
- Java developers with strong SE foundations and familiarity with the enterprise space (Spring/Java EE)
September 14, 2021
#156 Bash, Apple and EJB, TomEE, Geronimo and Jakarta EE
by David Blevins at September 14, 2021 02:07 PM
New podcast episode with Adam Bien & David Blevins. Apple and EJB, @ApacheTomEE, @tomitribe, @JakartaEE, the benefits of code generation with bash, and over-engineering”–the 156th http://airhacks.fm
The post #156 Bash, Apple and EJB, TomEE, Geronimo and Jakarta EE appeared first on Tomitribe.
July 28, 2021
Jakarta Community Acceptance Testing (JCAT)
by javaeeguardian at July 28, 2021 05:41 AM
Today the Jakarta EE Ambassadors are announcing the start of the Jakarta EE Community Acceptance (JCAT) Testing initiative. The purpose of this initiative is to test Jakarta EE 9/9.1 implementations testing using your code and/or applications. Although Jakarta EE is extensively tested by the TCK, container specific tests, and QA, the purpose of JCAT is for developers to test the implementations.
Jakarta EE 9/9.1 did not introduce any new features. In Jakarta EE 9 the APIs changed from javax to jakarta. Jakarta EE 9.1 raised the supported floor to Java 11 for compatible implementations. So what are we testing?
- Testing individual spec implementations standalone with the new namespace.
- Deploying existing Java EE/Jakarta EE applications to EE 9/9.1.
- Converting Java EE/Jakarta EE applications to the new namespace.
- Running applications on Java 11 (Jakarta EE 9.1)
Participating in this initiative is easy:
- Download a Jakarta EE implementation:
- Deploy code:
- Port or run your existing Jakarta EE application
- Test out a feature using a starter template
To join this initiative, please take a moment to fill-out the form:
To submit results or feedback on your experiences with Jakarta EE 9/9.1:
Jakarta EE 9 / 9.1 Feedback Form
Resources:
- Jakarta EE Ambassadors Google Group List
- Jakarta EE Amabassors Twitter
- Jakarta EE Starter
- Jakarta EE 9 Boilerplate
- Jakarta EE Migration
Start Date: July 28, 2021
End Date: December 31st, 2021
April 17, 2021
Your Voice Matters: Take the Jakarta EE Developer Survey
by dmitrykornilov at April 17, 2021 11:36 AM

The Jakarta EE Developer Survey is in its fourth year and is the industry’s largest open source developer survey. It’s open until April 30, 2021. I am encouraging you to add your voice. Why should you do it? Because Jakarta EE Working Group needs your feedback. We need to know the challenges you facing and suggestions you have about how to make Jakarta EE better.
Last year’s edition surveyed developers to gain on-the-ground understanding and insights into how Jakarta solutions are being built, as well as identifying developers’ top choices for architectures, technologies, and tools. The 2021 Jakarta EE Developer Survey is your chance to influence the direction of the Jakarta EE Working Group’s approach to cloud native enterprise Java.
The results from the 2021 survey will give software vendors, service providers, enterprises, and individual developers in the Jakarta ecosystem updated information about Jakarta solutions and service development trends and what they mean for their strategies and businesses. Additionally, the survey results also help the Jakarta community at the Eclipse Foundation better understand the top industry focus areas and priorities for future project releases.
A full report from based on the survey results will be made available to all participants.
The survey takes less than 10 minutes to complete. We look forward to your input. Take the survey now!
April 13, 2021
Less is More? Evolving the Servlet API!
by gregw at April 13, 2021 06:19 AM
April 02, 2021
Undertow AJP balancer. UT005028: Proxy request failed: java.nio.BufferOverflowException
April 02, 2021 09:00 PM
Wildfly provides great out of the box load balancing support by Undertow and modcluster subsystems
Unfortunately, in case HTTP headers size is huge enough (close to 16K), which is so actual in JWT era - pity error happened:
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)
The same request directly to backend server works well. Tried to play with ajp-listener and mod-cluster filter "max-*" parameters, but have no luck.
Possible solution here is switch protocol from AJP to HTTP which can be bit less effective, but works well with big headers:
/profile=full-ha/subsystem=modcluster/proxy=default:write-attribute(name=listener, value=default)
January 08, 2021
Oracle Joins MicroProfile Working Group
by dmitrykornilov at January 08, 2021 06:02 PM

I am very pleased to announce that since the beginning of 2021 Oracle is officially a part of MicroProfile Working Group.
In Oracle we believe in standards and supporting them in our products. Standards are born in blood, toil, tears, and sweat. Standards are a result of collaboration of experts, vendors, customers and users. Standards bring the advantages of portability between different implementations that make standard-based solutions vendor-neutral.
We created Java EE which was the first enterprise Java standard. We opened it and moved it to the Eclipse Foundation to make its development truly open source and vendor neutral. Now we are joining MicroProfile which in the last few years has become a leading standard for cloud-native solutions.
We’ve been supporting MicroProfile for years before officially joining the Working Group. We created project Helidon which has supported MicroProfile APIs since MicroProfile version 1.1. Contributing to the evolution and supporting new versions of MicroProfile is one of our strategic goals.
I like the community driven and enjoyable approach of creating cloud-native APIs invented by MicroProfile. I believe that our collaboration will be effective and together we will push MicroProfile forward to a higher level.
November 14, 2020
An introduction to MicroProfile GraphQL
by Jean-François James at November 14, 2020 05:05 PM
September 23, 2020
General considerations on updating Enterprise Java projects from Java 8 to Java 11
September 23, 2020 12:00 AM
The purpose of this article is to consolidate all difficulties and solutions that I've encountered while updating Java EE projects from Java 8 to Java 11 (and beyond). It's a known fact that Java 11 has a lot of new characteristics that are revolutionizing how Java is used to create applications, despite being problematic under certain conditions.
This article is focused on Java/Jakarta EE but it could be used as basis for other enterprise Java frameworks and libraries migrations.
Is it possible to update Java EE/MicroProfile projects from Java 8 to Java 11?
Yes, absolutely. My team has been able to bump at least two mature enterprise applications with more than three years in development, being:
A Management Information System (MIS)
- Time for migration: 1 week
- Modules: 9 EJB, 1 WAR, 1 EAR
- Classes: 671 and counting
- Code lines: 39480
- Project's beginning: 2014
- Original platform: Java 7, Wildfly 8, Java EE 7
- Current platform: Java 11, Wildfly 17, Jakarta EE 8, MicroProfile 3.0
- Web client: Angular
Mobile POS and Geo-fence
- Time for migration: 3 week
- Modules: 5 WAR/MicroServices
- Classes: 348 and counting
- Code lines: 17160
- Project's beginning: 2017
- Original platform: Java 8, Glassfish 4, Java EE 7
- Current platform: Java 11, Payara (Micro) 5, Jakarta EE 8, MicroProfile 3.2
- Web client: Angular
Why should I ever consider migrating to Java 11?
As everything in IT the answer is "It depends . . .". However there are a couple of good reasons to do it:
- Reduce attack surface by updating project dependencies proactively
- Reduce technical debt and most importantly, prepare your project for the new and dynamic Java world
- Take advantage of performance improvements on new JVM versions
- Take advantage from improvements of Java as programming language
- Sleep better by having a more secure, efficient and quality product
Why Java updates from Java 8 to Java 11 are considered difficult?
From my experience with many teams, because of this:
Changes in Java release cadence
Currently, there are two big branches in JVMs release model:
- Java LTS: With a fixed lifetime (3 years) for long term support, being Java 11 the latest one
- Java current: A fast-paced Java version that is available every 6 months over a predictable calendar, being Java 15 the latest (at least at the time of publishing for this article)
The rationale behind this decision is that Java needed dynamism in providing new characteristics to the language, API and JVM, which I really agree.
Nevertheless, it is a know fact that most enterprise frameworks seek and use Java for stability. Consequently, most of these frameworks target Java 11 as "certified" Java Virtual Machine for deployments.
Usage of internal APIs
Errata: I fixed and simplified this section following an interesting discussion on reddit :)
Java 9 introduced changes in internal classes that weren't meant for usage outside JVM, preventing/breaking the functionality of popular libraries that made use of these internals -e.g. Hibernate, ASM, Hazelcast- to gain performance.
Hence to avoid it, internal APIs in JDK 9 are inaccessible at compile time (but accesible with --add-exports), remaining accessible if they were in JDK 8 but in a future release they will become inaccessible, in the long run this change will reduce the costs borne by the maintainers of the JDK itself and by the maintainers of libraries and applications that, knowingly or not, make use of these internal APIs.
Finally, during the introduction of JEP-260 internal APIs were classified as critical and non-critical, consequently critical internal APIs for which replacements are introduced in JDK 9 are deprecated in JDK 9 and will be either encapsulated or removed in a future release.
However, you are inside the danger zone if:
- Your project compiles against dependencies pre-Java 9 depending on critical internals
- You bundle dependencies pre-Java 9 depending on critical internals
- You run your applications over a runtime -e.g. Application Servers- that include pre Java 9 transitive dependencies
Any of these situations means that your application has a probability of not being compatible with JVMs above Java 8. At least not without updating your dependencies, which also could uncover breaking changes in library APIs creating mandatory refactors.
Removal of CORBA and Java EE modules from OpenJDK
Also during Java 9 release, many Java EE and CORBA modules were marked as deprecated, being effectively removed at Java 11, specifically:
- java.xml.ws (JAX-WS, plus the related technologies SAAJ and Web Services Metadata)
- java.xml.bind (JAXB)
- java.activation (JAF)
- java.xml.ws.annotation (Common Annotations)
- java.corba (CORBA)
- java.transaction (JTA)
- java.se.ee (Aggregator module for the six modules above)
- jdk.xml.ws (Tools for JAX-WS)
- jdk.xml.bind (Tools for JAXB)
As JEP-320 states, many of these modules were included in Java 6 as a convenience to generate/support SOAP Web Services. But these modules eventually took off as independent projects already available at Maven Central. Therefore it is necessary to include these as dependencies if our project implements services with JAX-WS and/or depends on any library/utility that was included previously.
IDEs and application servers
In the same way as libraries, Java IDEs had to catch-up with the introduction of Java 9 at least in three levels:
- IDEs as Java programs should be compatible with Java Modules
- IDEs should support new Java versions as programming language -i.e. Incremental compilation, linting, text analysis, modules-
- IDEs are also basis for an ecosystem of plugins that are developed independently. Hence if plugins have any transitive dependency with issues over JPMS, these also have to be updated
Overall, none of the Java IDEs guaranteed that plugins will work in JVMs above Java 8. Therefore you could possibly run your IDE over Java 11 but a legacy/deprecated plugin could prevent you to run your application.
How do I update?
You must notice that Java 9 launched three years ago, hence the situations previously described are mostly covered. However you should do the following verifications and actions to prevent failures in the process:
- Verify server compatibility
- Verify if you need a specific JVM due support contracts and conditions
- Configure your development environment to support multiple JVMs during the migration process
- Verify your IDE compatibility and update
- Update Maven and Maven projects
- Update dependencies
- Include Java/Jakarta EE dependencies
- Execute multiple JVMs in production
Verify server compatibility
Mike Luikides from O'Reilly affirms that there are two types of programmers. In one hand we have the low level programmers that create tools as libraries or frameworks, and on the other hand we have developers that use these tools to create experience, products and services.
Java Enterprise is mostly on the second hand, the "productive world" resting in giant's shoulders. That's why you should check first if your runtime or framework already has a version compatible with Java 11, and also if you have the time/decision power to proceed with an update. If not, any other action from this point is useless.
The good news is that most of the popular servers in enterprise Java world are already compatible, like:
- Apache Tomcat
- Apache Maven
- Spring
- Oracle WebLogic
- Payara
- Apache TomEE
... among others
If you happen to depend on non compatible runtimes, this is where the road ends unless you support the maintainer to update it.
Verify if you need an specific JVM
On a non-technical side, under support contract conditions you could be obligated to use an specific JVM version.
OpenJDK by itself is an open source project receiving contributions from many companies (being Oracle the most active contributor), but nothing prevents any other company to compile, pack and TCK other JVM distribution as demonstrated by Amazon Correto, Azul Zulu, Liberica JDK, etc.
In short, there is software that technically could run over any JVM distribution and version, but the support contract will ask you for a particular version. For instance:
- WebLogic is only certified for Oracle HotSpot and GraalVM
- SAP Netweaver includes by itself SAP JVM
Configure your development environment to support multiple JDKs
Since the jump from Java 8 to Java 11 is mostly an experimentation process, it is a good idea to install multiple JVMs on the development computer, being SDKMan and jEnv the common options:
SDKMan
SDKMan is available for Unix-Like environments (Linux, Mac OS, Cygwin, BSD) and as the name suggests, acts as a Java tools package manager.
It helps to install and manage JVM ecosystem tools -e.g. Maven, Gradle, Leiningen- and also multiple JDK installations from different providers.
jEnv
Also available for Unix-Like environments (Linux, Mac OS, Cygwin, BSD), jEnv is basically a script to manage and switch multiple JVM installations per system, user and shell.
If you happen to install JDKs from different sources -e.g Homebrew, Linux Repo, Oracle Technology Network- it is a good choice.
Finally, if you use Windows the common alternative is to automate the switch using .bat files however I would appreciate any other suggestion since I don't use Windows so often.
Verify your IDE compatibility and update
Please remember that any IDE ecosystem is composed by three levels:
- The IDE acting as platform
- Programming language support
- Plugins to support tools and libraries
After updating your IDE, you should also verify if all of the plugins that make part of your development cycle work fine under Java 11.
Update Maven and Maven projects
Probably the most common choice in Enterprise Java is Maven, and many IDEs use it under the hood or explicitly. Hence, you should update it.
Besides installation, please remember that Maven has a modular architecture and Maven modules version could be forced on any project definition. So, as rule of thumb you should also update these modules in your projects to the latest stable version.
To verify this quickly, you could use versions-maven-plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.8.1</version>
</plugin>
Which includes a specific goal to verify Maven plugins versions:
mvn versions:display-plugin-updates
After that, you also need to configure Java source and target compatibility, generally this is achieved in two points.
As properties:
<properties>
...
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
As configuration on Maven plugins, specially in maven-compiler-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
Finally, some plugins need to "break" the barriers imposed by Java Modules and Java Platform Teams knows about it. Hence JVM has an argument called illegal-access to allow this, at least during Java 11.
This could be a good idea in plugins like surefire and failsafe which also invoke runtimes that depend on this flag (like Arquillian tests):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<argLine>
--illegal-access=permit
</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<argLine>
--illegal-access=permit
</argLine>
</configuration>
</plugin>
Update project dependencies
As mentioned before, you need to check for compatible versions on your Java dependencies. Sometimes these libraries could introduce breaking changes on each major version -e.g. Flyway- and you should consider a time to refactor this changes.
Again, if you use Maven versions-maven-plugin has a goal to verify dependencies version. The plugin will inform you about available updates.:
mvn versions:display-dependency-updates
In the particular case of Java EE, you already have an advantage. If you depend only on APIs -e.g. Java EE, MicroProfile- and not particular implementations, many of these issues are already solved for you.
Include Java/Jakarta EE dependencies
Probably modern REST based services won't need this, however in projects with heavy usage of SOAP and XML marshalling is mandatory to include the Java EE modules removed on Java 11. Otherwise your project won't compile and run.
You must include as dependency:
- API definition
- Reference Implementation (if needed)
At this point is also a good idea to evaluate if you could move to Jakarta EE, the evolution of Java EE under Eclipse Foundation.
Jakarta EE 8 is practically Java EE 8 with another name, but it retains package and features compatibility, most of application servers are in the process or already have Jakarta EE certified implementations:
We could swap the Java EE API:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
For Jakarta EE API:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
After that, please include any of these dependencies (if needed):
Java Beans Activation
Java EE
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
Jakarta EE
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>1.2.2</version>
</dependency>
JAXB (Java XML Binding)
Java EE
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
Jakarta EE
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
Implementation
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
JAX-WS
Java EE
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
Jakarta EE
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.3</version>
</dependency>
Implementation (runtime)
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>
Implementation (standalone)
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.2-1</version>
<type>pom</type>
</dependency>
Java Annotation
Java EE
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Jakarta EE
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
</dependency>
Java Transaction
Java EE
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.3</version>
</dependency>
Jakarta EE
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>1.3.3</version>
</dependency>
CORBA
In the particular case of CORBA, I'm aware of its adoption. There is an independent project in eclipse to support CORBA, based on Glassfish CORBA, but this should be investigated further.
Multiple JVMs in production
If everything compiles, tests and executes. You did a successful migration.
Some deployments/environments run multiple application servers over the same Linux installation. If this is your case it is a good idea to install multiple JVMs to allow stepped migrations instead of big bang.
For instance, RHEL based distributions like CentOS, Oracle Linux or Fedora include various JVM versions:
Most importantly, If you install JVMs outside directly from RPMs(like Oracle HotSpot), Java alternatives will give you support:
However on modern deployments probably would be better to use Docker, specially on Windows which also needs .bat script to automate this task. Most of the JVM distributions are also available on Docker Hub:
July 13, 2020
Secure your JAX-RS APIs with MicroProfile JWT
by Jean-François James at July 13, 2020 03:55 PM
July 12, 2020
Jakarta EE: Multitenancy with JPA on WildFly, Part 1
by Rhuan Henrique Rocha at July 12, 2020 10:49 PM
In this two-part series, I demonstrate two approaches to multitenancy with the Jakarta Persistence API (JPA) running on WildFly. In the first half of this series, you will learn how to implement multitenancy using a database. In the second half, I will introduce you to multitenancy using a schema. I based both examples on JPA and Hibernate.
Because I have focused on implementation examples, I won’t go deeply into the details of multitenancy, though I will start with a brief overview. Note, too, that I assume you are familiar with Java persistence using JPA and Hibernate.
Multitenancy architecture
Multitenancy is an architecture that permits a single application to serve multiple tenants, also known as clients. Although tenants in a multitenancy architecture access the same application, they are securely isolated from each other. Furthermore, each tenant only has access to its own resources. Multitenancy is a common architectural approach for software-as-a-service (SaaS) and cloud computing applications. In general, clients (or tenants) accessing a SaaS are accessing the same application, but each one is isolated from the others and has its own resources.
A multitenant architecture must isolate the data available to each tenant. If there is a problem with one tenant’s data set, it won’t impact the other tenants. In a relational database, we use a database or a schema to isolate each tenant’s data. One way to separate data is to give each tenant access to its own database or schema. Another option, which is available if you are using a relational database with JPA and Hibernate, is to partition a single database for multiple tenants. In this article, I focus on the standalone database and schema options. I won’t demonstrate how to set up a partition.
In a server-based application like WildFly, multitenancy is different from the conventional approach. In this case, the server application works directly with the data source by initiating a connection and preparing the database to be used. The client application does not spend time opening the connection, which improves performance. On the other hand, using Enterprise JavaBeans (EJBs) for container-managed transactions can lead to problems. As an example, the server-based application could do something to generate an error to commit or roll the application back.
Implementation code
Two interfaces are crucial to implementing multitenancy in JPA and Hibernate:
- MultiTenantConnectionProvider is responsible for connecting tenants to their respective databases and services. We will use this interface and a tenant identifier to switch between databases for different tenants.
- CurrentTenantIdentifierResolver is responsible for identifying the tenant. We will use this interface to define what is considered a tenant (more about this later). We will also use this interface to provide the correct tenant identifier to
MultiTenantConnectionProvider
.
In JPA, we configure these interfaces using the persistence.xml
file. In the next sections, I’ll show you how to use these two interfaces to create the first three classes we need for our multitenancy architecture: DatabaseMultiTenantProvider
, MultiTenantResolver
, and DatabaseTenantResolver
.
DatabaseMultiTenantProvider
DatabaseMultiTenantProvider
is an implementation of the MultiTenantConnectionProvider
interface. This class contains logic to switch to the database that matches the given tenant identifier. In WildFly, this means switching to different data sources. The DatabaseMultiTenantProvider
class also implements the ServiceRegistryAwareService
, which allows us to inject a service during the configuration phase.
Here’s the code for the DatabaseMultiTenantProvider
class:
public class DatabaseMultiTenantProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService{ private static final long serialVersionUID = 1L; private static final String TENANT_SUPPORTED = "DATABASE"; private DataSource dataSource; private String typeTenancy ; @Override public boolean supportsAggressiveRelease() { return false; } @Override public void injectServices(ServiceRegistryImplementor serviceRegistry) { typeTenancy = (String) ((ConfigurationService)serviceRegistry .getService(ConfigurationService.class)) .getSettings().get("hibernate.multiTenancy"); dataSource = (DataSource) ((ConfigurationService)serviceRegistry .getService(ConfigurationService.class)) .getSettings().get("hibernate.connection.datasource"); } @SuppressWarnings("rawtypes") @Override public boolean isUnwrappableAs(Class clazz) { return false; } @Override public <T> T unwrap(Class<T> clazz) { return null; } @Override public Connection getAnyConnection() throws SQLException { final Connection connection = dataSource.getConnection(); return connection; } @Override public Connection getConnection(String tenantIdentifier) throws SQLException { final Context init; //Just use the multi-tenancy if the hibernate.multiTenancy == DATABASE if(TENANT_SUPPORTED.equals(typeTenancy)) { try { init = new InitialContext(); dataSource = (DataSource) init.lookup("java:/jdbc/" + tenantIdentifier); } catch (NamingException e) { throw new HibernateException("Error trying to get datasource ['java:/jdbc/" + tenantIdentifier + "']", e); } } return dataSource.getConnection(); } @Override public void releaseAnyConnection(Connection connection) throws SQLException { connection.close(); } @Override public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException { releaseAnyConnection(connection); } }
As you can see, we call the injectServices
method to populate the datasource
and typeTenancy
attributes. We use the datasource
attribute to get a connection from the data source, and we use the typeTenancy
attribute to find out if the class supports the multiTenancy
type. We call the getConnection
method to get a data source connection. This method uses the tenant identifier to locate and switch to the correct data source.
MultiTenantResolver
MultiTenantResolver
is an abstract class that implements the CurrentTenantIdentifierResolver
interface. This class aims to provide a setTenantIdentifier
method to all CurrentTenantIdentifierResolver
implementations:
public abstract class MultiTenantResolver implements CurrentTenantIdentifierResolver { protected String tenantIdentifier; public void setTenantIdentifier(String tenantIdentifier) { this.tenantIdentifier = tenantIdentifier; } }
This abstract class is simple. We only use it to provide the setTenantIdentifier
method.
DatabaseTenantResolver
DatabaseTenantResolver
also implements the CurrentTenantIdentifierResolver
interface. This class is the concrete class of MultiTenantResolver
:
public class DatabaseTenantResolver extends MuiltiTenantResolver { private Map<String, String> regionDatasourceMap; public DatabaseTenantResolver(){ regionDatasourceMap = new HashMap(); regionDatasourceMap.put("default", "MyDataSource"); regionDatasourceMap.put("america", "AmericaDB"); regionDatasourceMap.put("europa", "EuropaDB"); regionDatasourceMap.put("asia", "AsiaDB"); } @Override public String resolveCurrentTenantIdentifier() { if(this.tenantIdentifier != null && regionDatasourceMap.containsKey(this.tenantIdentifier)){ return regionDatasourceMap.get(this.tenantIdentifier); } return regionDatasourceMap.get("default"); } @Override public boolean validateExistingCurrentSessions() { return false; } }
Notice that DatabaseTenantResolver
uses a Map
to define the correct data source for a given tenant. The tenant, in this case, is a region. Note, too, that this example assumes we have the data sources java:/jdbc/MyDataSource
, java:/jdbc/AmericaDB
, java:/jdbc/EuropaDB
, and java:/jdbc/AsiaDB
configured in WildFly.
Configure and define the tenant
Now we need to use the persistence.xml
file to configure the tenant:
<persistence> <persistence-unit name="jakartaee8"> <jta-data-source>jdbc/MyDataSource</jta-data-source> <properties> <property name="javax.persistence.schema-generation.database.action" value="none" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgresPlusDialect"/> <property name="hibernate.multiTenancy" value="DATABASE"/> <property name="hibernate.tenant_identifier_resolver" value="net.rhuanrocha.dao.multitenancy.DatabaseTenantResolver"/> <property name="hibernate.multi_tenant_connection_provider" value="net.rhuanrocha.dao.multitenancy.DatabaseMultiTenantProvider"/> </properties> </persistence-unit> </persistence>
Next, we define the tenant in the EntityManagerFactory
:
@PersistenceUnit protected EntityManagerFactory emf; protected EntityManager getEntityManager(String multitenancyIdentifier){ final MuiltiTenantResolver tenantResolver = (MuiltiTenantResolver) ((SessionFactoryImplementor) emf).getCurrentTenantIdentifierResolver(); tenantResolver.setTenantIdentifier(multitenancyIdentifier); return emf.createEntityManager(); }
Note that we call the setTenantIdentifier
before creating a new instance of EntityManager
.
Conclusion
I have presented a simple example of multitenancy in a database using JPA with Hibernate and WildFly. There are many ways to use a database for multitenancy. My main point has been to show you how to implement the CurrentTenantIdentifierResolver
and MultiTenantConnectionProvider
interfaces. I’ve shown you how to use JPA’s persistence.xml
file to configure the required classes based on these interfaces.
Keep in mind that for this example, I have assumed that WildFly manages the data source and connection pool and that EJB handles the container-managed transactions. In the second half of this series, I will provide a similar introduction to multitenancy, but using a schema rather than a database. If you want to go deeper with this example, you can find the complete application code and further instructions on my GitHub repository.
July 06, 2020
Jakarta EE Cookbook
by Elder Moraes at July 06, 2020 07:19 PM
About one month ago I had the pleasure to announce the release of the second edition of my book, now…
The post Jakarta EE Cookbook appeared first on Elder Moraes.
January 29, 2020
Monitoring REST APIs with Custom JDK Flight Recorder Events
January 29, 2020 02:30 PM
The JDK Flight Recorder (JFR) is an invaluable tool for gaining deep insights into the performance characteristics of Java applications. Open-sourced in JDK 11, JFR provides a low-overhead framework for collecting events from Java applications, the JVM and the operating system.
In this blog post we’re going to explore how custom, application-specific JFR events can be used to monitor a REST API, allowing to track request counts, identify long-running requests and more. We’ll also discuss how the JFR Event Streaming API new in Java 14 can be used to export live events, making them available for monitoring and alerting via tools such as Prometheus and Grafana.
January 20, 2020
Enforcing Java Record Invariants With Bean Validation
January 20, 2020 04:30 PM
January 19, 2020
Jakarta EE 8 CRUD API Tutorial using Java 11
by Philip Riecks at January 19, 2020 03:07 PM
As part of the Jakarta EE Quickstart Tutorials 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 Liberty Maven Plugin and MicroShed Testing, the endpoints are developed using the TDD (Test Driven Development) technique.
The following technologies are used within this short series: Java 11, Jakarta EE 8, Open Liberty, Derby, Flyway, MicroShed Testing & JUnit 5
Part I: Introduction to the application setup
This part covers the following topics:
- Introduction to the Maven project skeleton
- Flyway setup for Open Liberty
- Derby JDBC connection configuration
- Basic MicroShed Testing setup for TDD
Part II: Developing the endpoint to create entities
This part covers the following topics:
- First JAX-RS endpoint to create
Person
entities - TDD approach using MicroShed Testing and the Liberty Maven Plugin
- Store the entities using the
EntityManager
Part III: Developing the endpoints to read entities
This part covers the following topics:
- Develop two JAX-RS endpoints to read entities
- Read all entities and by its id
- Handle non-present entities with a different HTTP status code
Part IV: Developing the endpoint to update entities
This part covers the following topics:
- Develop the JAX-RS endpoint to update entities
- Update existing entities using HTTP PUT
- Validate the client payload using Bean Validation
Part V: Developing the endpoint to delete entities
This part covers the following topics:
- Develop the JAX-RS endpoint to delete entities
- Enhance the test setup for deterministic and repeatable integration tests
- Remove the deleted entity from the database
The source code for the Maven CRUD API application is available on GitHub.
For more quickstart tutorials on Jakarta EE, have a look at the overview page on my blog.
Have fun developing Jakarta EE CRUD API applications,
Phil
The post Jakarta EE 8 CRUD API Tutorial using Java 11 appeared first on rieckpil.
January 07, 2020
Deploy a Jakarta EE application to the root context
by Philip Riecks at January 07, 2020 06:24 AM
With the presence of Docker, Kubernetes and cheaper hardware, the deployment model of multiple applications inside one application server has passed. Now, you deploy one Jakarta EE application to one application server. This eliminates the need for different context paths. You can use the root context /
for your Jakarta EE application. With this blog post, you'll learn how to achieve this for each Jakarta EE application server.
The default behavior for Jakarta EE application server
Without any further configuration, most of the Jakarta EE application servers deploy the application to a context path based on the filename of your .war
. If you e.g. deploy your my-banking-app.war
application, the server will use the context prefix /my-banking-app
for your application. All you JAX-RS endpoints, Servlets, .jsp
, .xhtml
content is then available below this context, e.g /my-banking-app/resources/customers
.
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.
As of today, the deployment model changed with Docker, Kubernetes and cheaper infrastructure. You usually deploy one .war
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 /
is more convenient.
If you configure a reverse proxy or an Ingress controller (in the Kubernetes world), you are happy if you can just route to /
instead of remembering the actual context path (error-prone).
Deploying to root context: Payara & Glassfish
As Payara is a fork of Glassfish, the configuration for both is quite similar. The most convenient way for Glassfish is to place a glassfish-web.xml
file in the src/main/webapp/WEB-INF
folder of your application:
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app> <context-root>/</context-root> </glassfish-web-app>
For Payara the filename is payara-web.xml
:
<!DOCTYPE payara-web-app PUBLIC "-//Payara.fish//DTD Payara Server 4 Servlet 3.0//EN" "https://raw.githubusercontent.com/payara/Payara-Server-Documentation/master/schemas/payara-web-app_4.dtd"> <payara-web-app> <context-root>/</context-root> </payara-web-app>
Both also support configuring the context path of the application within their admin console. IMHO this less convenient than the .xml
file solution.
Deploying to root context: Open Liberty
Open Liberty also parses a proprietary web.xml
file within src/main/webapp/WEB-INF
: ibm-web-ext.xml
<web-ext xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd" version="1.0"> <context-root uri="/"/> </web-ext>
Furthermore, you can also configure the context of your application within your server.xml
:
<server> <featureManager> <feature>servlet-4.0</feature> </featureManager> <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443"/> <webApplication location="app.war" contextRoot="/" name="app"/> </server>
Deploying to root context: WildFly
WildFly also has two simple ways of configuring the root context for your application. First, you can place a jboss-web.xml
within src/main/webapp/WEB-INF
:
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd"> <jboss-web> <context-root>/</context-root> </jboss-web>
Second, while copying your .war
file to your Docker container, you can name it ROOT.war
:
FROM jboss/wildfly ADD target/app.war /opt/jboss/wildfly/standalone/deployments/ROOT.war
For more tips & tricks for each application server, have a look at my cheat sheet.
Have fun deploying your Jakarta EE applications to the root context,
Phil
The post Deploy a Jakarta EE application to the root context appeared first on rieckpil.
November 19, 2019
Modernizing our GitHub Sync Toolset
November 19, 2019 08:10 PM
I am happy to announce that my team is ready to deploy a new version of our GitHub Sync Toolset on November 26, 2019 from 10:00 to 11:00 am EST.
We are not expecting any disruption of service but it’s possible that some committers may lose write access to their Eclipse project GitHub repositories during this 1 hour maintenance window.
This toolset is responsible for syncronizing Eclipse committers accross all our GitHub repositories and on top of that, this new release will start syncronizing contributors.
In this context, a contributor is a GitHub user with read access to the project GitHub repositories. This new feature will allow committers to assign issues to contributors who currently don’t have write access to the repository. This feature was requested in 2015 via Bug 483563 - Allow assignment of GitHub issues to contributors.
Eclipse Committers are reponsible for maintaining a list of GitHub contributors from their project page on the Eclipse Project Management Infrastructure (PMI).
To become an Eclipse contributor on a GitHub for a project, please make sure to tell us your GitHub Username in your Eclipse account.
October 17, 2019
A Tool for Jakarta EE Package Renaming in Binaries
by BJ Hargrave (noreply@blogger.com) at October 17, 2019 09:26 PM
Tools are always important to take the drudgery away from developers. So I have put together a tool prototype which can be used to transform binaries such as individual class files and complete JARs and WARs to rename uses of the Java EE package names to their new Jakarta EE package names.
The tools is rule driven which is nice since the Jakarta EE community still needs to define the actual package renames for Jakarta EE 9. The rules also allow the users to control which class files in a JAR/WAR are transformed. Different users may want different rules depending upon their specific needs. And the tool can be used for any package renaming challenge, not just the specific Jakarta EE package renames.
The tools provides an API allowing it to be embedded in a runtime to dynamically transform class files during the class loader definition process. The API also supports transforming JAR files. A CLI is also provided to allow use from the command line. Ultimately, the tool can be packaged as Gradle and Maven plugins to incorporate in a broader tool chain.
Given that the tool is prototype, and there is much work to be done in the Jakarta EE community regarding the package renames, I have started a list of TODOs in the project' issues for known work items.
Please try out the tool and let me know what you think. I am hoping that tooling such as this will ease the community cost of dealing with the package renames in Jakarta EE.
PS. Package renaming in source code is also something the community will need to deal with. But most IDEs are pretty good at this sort of thing, so I think there is probably sufficient tooling in existence for handling the package renames in source code.
by BJ Hargrave (noreply@blogger.com) at October 17, 2019 09:26 PM
May 28, 2019
Jakarta EE, A de facto standard in the making
by David R. Heffelfinger at May 28, 2019 10:06 PM
I’ve been involved in Java EE since the very beginning, Having written one of the first ever books on Java EE. My involvement in Java EE / Jakarta EE has been on an education / advocacy role. Having written books, articles, blog posts and given talks in conferences about the technology. I advocate Jakarta EE not because I’m paid to do so, but because I really believe it is a great technology. I’m a firm believer that the fact that Jakarta EE is a standard, with multiple competing implementations, results in very high quality implementations, since Jakarta EE avoids vendor lock-in and encourages competition, benefiting developers.
Oracle’s donation of Java EE to the Eclipse Foundation was well received and celebrated by the Java EE community. Many prominent community members had been advocating for a more open process for Java EE, which is exactly what Jakarta EE, under the stewardship from the Eclipse Foundation provides.
There are some fundamental changes on how Jakarta EE is managed, that differ from Java EE, that benefit the Jakarta EE community greatly.
Fundamental differences between Java EE and Jakarta EE Management
Some of the differences in the way Jakarta EE is managed as opposed to Java EE are that there is no single vendor controlling the technology, there is free access to the TCK and there is no reference implementation.
No single company controls the standard
First and foremost, we no longer have a single company as a steward of Jakarta EE. Instead, we have several companies who have a vested interest in the success of the technology working together to develop the standard. This has the benefit that the technology is not subject to the whims of any one vendor, and, if any of the vendors loses interest in Jakarta EE, others can easily pick up the slack. The fact that there is no single vendor behind the technology makes Jakarta EE very resilient, it is here to stay.
TCK freely accessible
Something those of us involved heavily in Jakarta EE (and Java EE before), take for granted, but that may not be clear to others, is that Jakarta EE is a set of specifications with multiple implementations. Since the APIs are defined in a specification, they don’t change across Jakarta EE implementations, making Jakarta EE compliant code portable across implementations. For example, a Jakarta EE compliant application should run with minimal or no modifications on popular Jakarta EE implementations such as Apache Tomee, Payara, IBM’s OpenLiberty or Red Hat’s Thorntail
One major change that Jakarta EE has against Java EE is the fact that the Technology Compatibility Kit (TCK) is open source and free. The TCK is a set of test to verify that a Jakarta EE implementation is 100% compliant with all Jakarta EE specifications. With Java EE, organizations wanting to create a Java EE implementation, had to pay large sums of money to gain access to the TCK, once their implementation passed all the tests, their implementation was certified as Java EE compatible. The fact that the TCK was not freely accessible became a barrier to innovation, as smaller organizations and open source developers not always had the funds to get access to the TCK. Now that the TCK is freely accessible, the floodgates will open, and we should see a lot more quality implementations of Jakarta EE.
No reference implementation
Another major change between Java EE and Jakarta EE is that Java EE had the concept of a reference implementation. The idea behind having a Java EE reference implementation was to prove that suggested API specifications were actually feasible to implement. Having a reference implementation, however, had a side effect. If the reference implementation implemented something that wasn’t properly defined in the specification, then many developers expected all Java EE implementations to behave the same way, making the reference implementation a de-facto Java EE specification of sorts. Jakarta EE does away with the concept of a reference implementation, and will have multiple compatible implementations instead. The fact that there isn’t a reference implementation in Jakarta EE will result in more complete specifications, as differences in behavior between implementations will bring to light deficiencies in the specifications, these deficiencies can then be addressed by the community.
Conclusion
With multiple organizations with a vested interest in Jakarta EE’s success, a lowered barrier of entry for new Jakarta EE implementations, and better specifications Jakarta EE will become the de-facto standard in server-side Java development.