April - The Rest of the Story - JVM Weekly vol. 127
I know there is a lot of April left, not my fault, calendar is working against my publishing schedule this month...
Since the last few editions have been quite thematic, I’ve gathered many interesting links in April that didn’t make it into previous issues. Many aren’t extensive enough for a full section, but they still seem compelling enough to share.
And to wrap things up, I’m adding a few release updates.
1. Missed in April
April marks a strong start to the conference season, so let's begin with conferences! And not just any conference, but JavaOne.
Inside Java Newscast #89 delivers a solid portion of updates from JavaOne 2025. There’s a lot of interesting content inside: Dan Heidinga from Leyden warns that unit tests are not suitable for AOT training in JDK 24, as they introduce unnecessary classes and don’t reflect the production environment. Stefan Johansson provides an accessible comparison of garbage collection in the JVM, showing the differences between G1, ZGC, and Shenandoah in terms of throughput, latency, and memory usage. For dessert, Richard Fichtner adds two pro tips for analyzing Maven builds with plugins and extensions.
JavaOne 2025 also featured AI, with Lize Raes and Mohamed A. demonstrating the advanced LangChain4j pipeline for Retrieval Augmented Generation, featuring routers, transformers, and retrievers to make models speak meaningfully. Brian Goetz shared a roadmap for Valhalla, with JEP 401 and the concept of types with null restrictions.
And if that’s not enough, here’s a recording from JavaOne of Brian's presentation on the next roadmap for Java:
Next, something for conference fans - fresh recordings from Voxxed Days! We start with Voxxed Day Zurich, where you can catch the full conference recording available on YouTube. If you're more into bikes than mountains, check out the summary of Voxxed Day Amsterdam in the TechTalks Weekly newsletter - it includes summaries, photos, links to slides, and a solid dose of JVM energy from the Netherlands.
If that’s still not enough, it’s worth checking out JDConf - a Microsoft conference focused on Java. The full agenda is available on the jdconf.com website, and most presentations have already made their way to YouTube in this playlist. A lot of cloud topics, dev tools, and practical advice – perfect to play in the background during an afternoon deploy.
Closing the conference topic, GraalVM, represented by @Patrick Ziegler & Fabio Niephaus during the Wasm I/O 2025 conference, showcased an example of compiling Java code to JVM bytecode directly in the browser. By utilizing the javac compiler compiled to WebAssembly, users can write code in an online editor, which is then compiled into a .class file ready for download or disassembly. The current demo version saves code to a HelloWasm.java file, expecting a class named HelloWasm or non-public classes. While the project is still in early development and may contain imperfections, it represents a promising step towards running JVM tools in a WebAssembly environment.
We’ve wrapped up the conference topic, but will stay on the WASM theme.
Browsercraft is an experimental demo project that allows running an unmodified version of Minecraft 1.2.5 directly in the browser using CheerpJ - a Java virtual machine based on WebAssembly. Thanks to this solution, the game runs entirely on the client side, with no need for Java installation or additional plugins. CheerpJ allows running Java applications without modifying the source code, meaning that the original Minecraft JAR file is downloaded from Mojang’s servers and run directly in the browser.
Currently, Browsercraft has some limitations - for example, a lack of sound support - but the creators emphasize that these are solvable issues, not fundamental technological barriers. It’s a bit slow, but fun as hell.
We will return to CheerpJ, but meanwhile I become a bit nostalgic, so I want to share with you my first contact ever with Minecraft. Thank you YouTube. I wonder if anybody remember that little thing.
In the latest blog post on Moderne , Shannon Pamperl and Sam Snyder announce the long-awaited support for Gradle Kotlin DSL in OpenRewrite. The lack of full support for this DSL previously forced some users to return to Groovy in order to use refactoring tools. The main hurdle was Gradle's complicated code generation, relying on unstable internal APIs and large distributions. Instead of attempting to replicate this process, the OpenRewrite team opted for a heuristic approach, using "landmarks" in the structure of scripts, such as dependencies blocks, to effectively navigate and modify build.gradle.kts files. This now enables the use of popular recipes like UpgradeDependencyVersion or AddDependency in projects using Kotlin DSL.
Once again, let’s revisit JDK 24. In the latest blog post, Sean Mullan outlines key security improvements in this release. The post expands on the most important new features, including two quantum-resistant cryptographic algorithms: ML-KEM for key encapsulation (JEP 496) and ML-DSA for digital signatures (JEP 497). Additionally, a new API for Key Derivation Functions (KDF) has been introduced in preview, laying the foundation for future work on post-quantum cryptography. Sean also mentions that JDK 24 permanently deactivates the Security Manager (JEP 486), ending its long-standing presence in the Java ecosystem.
And finally, an announcement from the Jakarta EE 11 front.
Jakarta EE Web Profile 11 has officially passed review and approved by the Jakarta EE Specification Committee, including Fujitsu, IBM, Oracle, Payara, Tomitribe, and members of the EE4J PMC, participants, and committee members. Ivar Grimstad announced the end of voting and marked the corresponding pull requests as approved. This is an important step towards finalizing the Web Profile 11 specification within the Jakarta EE platform.
2. Release Radar
IntelliJ IDEA 2025.1
Let's start with our favorite IDE.
Although IntelliJ IDEA 2025.1 focuses on integration with AI tools, we'll first look at the standard updates. This version offers full support for Java 24, including integration of features like stream gatherers with stream debugging tools. It also enables pausing and resuming observer evaluation during debugging, providing better control over potential side effects.
Kotlin Notebook has been integrated as a native IDE feature, eliminating the need for additional plugin installations and offering an interactive environment for JVM developers. It enables code prototyping, exploring new APIs, writing documentation, analyzing data, and interacting with HTTP endpoints without modifying build files. Notebooks can also use the project's base code, expanding their use in everyday development tasks.
For Kotlin developers, an important update is that K2 Mode is now enabled by default, offering faster code analysis thanks to the revamped analysis engine and Kotlin Analysis API.
Now that we've covered that, let's move on to the main course. JetBrains introduces advanced AI tools to their IDEs, including the AI Assistant and the new coding agent Junie, available under a single subscription with a free tier. Junie, powered by Anthropic models, can perform complex programming tasks, such as creating new modules or integrating with external services, based on simple natural language descriptions. I've played with it myself and I must say it works really smoothly :)

However, Junie still doesn't support TRUE voice-based Vibe Coding. They probably kept something for version 2025.2
Quarkus 3.21
Quarkus 3.21 was released on March 26, 2025 (and that's why it just slipped to make it to the March's Release Radar). It isn't a pretty spectacular release - the main feature is the introduction of TLS Registry support in the MongoDB Client extension, simplifying TLS configuration by centralizing settings. In addition, the update includes new versions of specific platform components: Quarkus CXF 3.21, Camel Quarkus 3.20.0, and Amazon Services extension version 3.3.1.
WildFly 36
On the other hand, WildFly 36 brings several significant updates. The main application server now supports Prometheus registry in the micrometer extension, allowing metric collection in pull mode. The JBoss EJB Client library and ejb3 subsystem gained support for the remote+tls protocol, and the Undertow subsystem now enables configuration of X-Forwarded and Host headers in reverse proxy mode and accepts custom AJP headers. Additionally, the WildFly AI feature set is being expanded and is currently in incubation.
WildFly 36 is compliant with Jakarta EE 10 (Full, Web, and Core Profiles) on Java SE 17 and 21 and supports MicroProfile 7.0. Early implementations of Jakarta EE 11 specifications, including beta Hibernate ORM 7 and alpha Hibernate Search 8, are available in Preview.
Moreover, an experimental integration with JBang has been added, allowing WildFly applications to be run directly from the command line.
And speaking of JBang...
JBang Jash
JBang Jash (pronounced "Jazz") is a new Java library that simplifies running processes and shell scripts while providing a convenient API for developers. Version 0.0.1 allows easy execution of system commands without the need to manage threads or input/output streams—Jash handles these aspects automatically.
By default, if a command exits with a non-zero exit code, Jash will throw an exception. Other features include piping and stream processing of results. The library is independent of JBang and can be used in any Java project.
Async Profiler 4.0
Async Profiler 4.0 includes an interactive heatmap and an experimental native memory leak profiler. It also introduces the jfrconv tool for converting JFR recordings and an option to display instruction addresses in profiles. Additionally, clock profiling has been optimized, and the --cstack vm/vmx option has been added for more precise stack tracing.
Version 4.0 also supports JDK 23 and newer, and improves compatibility with musl (a lightweight C standard library commonly used in Alpine Linux) and glibc (the GNU C Library, standard on most Linux distributions). Profiling inside containers is now possible using the --libpath option, which specifies the path to necessary libraries.
The release introduces enhancements to the conversion and visualization tools, including new options such as --grain (which adjusts the time resolution or level of detail in profiling output), --nostop (which prevents the tool from pausing after processing each section), and --inverted (which reverses the call stack view to display leaf functions at the top).
You can now collect allocation traces (records of where memory is allocated) and live objects at the same time. There is also a new ability to filter native frames (non-Java or low-level stack frames) in allocation profiles, making the output more focused.
Finally, support for demangling Rust v0 symbols (turning encoded Rust function names into readable ones) has been added, along with improved compatibility for ARM64 architecture (used in devices like Apple Silicon).
It’s also worth noting that code under the CDDL license has been removed, meaning the entire project is now under the Apache 2.0 license.
JobRunr 7.5
JobRunr 7.5 introduces official support for Quarkus 3.20 and Micronaut 4.8, as well as improved configuration validation, now detecting mismatches between JobRequest and JobRequestHandler to prevent silent errors. In Spring, Quarkus, and Micronaut environments, InMemoryStorage can now be configured using the jobrunr.database.type=mem property.
In the Pro version, support for CockroachDB has been added through CockroachStorageProvider, making JobRunr more suitable for multi-region architectures. Additionally, BatchJob handling in JobBuilder has been improved.
CheerpJ 4.0
CheerpJ 4.0, announced by Leaning Technologies , introduces some exciting advancements for running Java applications in the browser. The most notable update is the support for WebAssembly (Wasm) modules at runtime, allowing Java apps to load native C/C++ code via Java Native Interface. This makes it possible to run applications like Minecraft (as you have already seen!), which rely on JNI libraries such as LWJGL, directly in the browser without any manual JavaScript implementations. CheerpJ 4.0 also enhances compatibility with modern Java versions, beginning with Java 11, with plans to add support for Java 17 later this year and Java 21 in 2026.
Beyond JNI support, CheerpJ 4.0 introduces a new library mode that enables Java libraries to be used directly from JavaScript with native async/await syntax.
3. Github All Stars
Jox
Jox is a modern open-source library from SoftwareMill, designed for safe concurrency and stream processing in Java 21+ using virtual threads. It offers fast and scalable channels with select operation support, inspired by Go's solutions, as well as a developer-friendly structured concurrency approach and a functional streaming API, compatible with reactive streams and blocking I/O.
Jox 1.0.0, the first stable release of SoftwareMill introduces several notable changes. The collectAsView() method has been removed from the Source interface, along with the CollectSource class, as this functionality is now provided by the Flows class. Additionally, Renovate has been integrated to automate dependency updates. Jox offers efficient, Go-like channels with select support, structured concurrency scopes, and a functional streaming API compatible with reactive streams and blocking I/O.
The library is open-source under the Apache 2.0 license and is designed to scale with Java’s virtual threads.
Metro
Zac Sweers presented Metro – a new cross-platform dependency injection library for Kotlin, based on a compiler plugin. Metro takes inspiration from Dagger, Anvil, and Kotlin-Inject, and allows the creation of @DependencyGraph interfaces with @Provides methods, supports constructor injection, @AssistedFactory, optional dependencies with default values, and integration with Compose via high-level function injection.
Built-in dependency graph validation and code generation at the FIR/IR level ensure better compilation performance compared to KAPT or KSP. Metro also offers interoperability with existing Dagger and Kotlin-Inject components, making migration in multi-platform projects easier.
Kroxylicious
Kroxylicious is an emerging open-source project aimed at simplifying the creation of proxies for Apache Kafka by providing many standard features "out of the box", such as encryption, multi-tenancy and schema validation. This allows developers to focus on implementing logic specific to their needs without having to build foundational components from scratch. On April 18, 2025, the Commonhaus foundation announced the inclusion of the Kroxylicious project as a member.
Sam Barker , lead software engineer at Red Hat and project leader, emphasized that the decision to join Commonhaus was driven by the desire to provide users and contributors with confidence regarding the project's future and openness. He pointed out that the foundation offers a lightweight management approach, focusing on self-governance and a "code-first" approach, which enables rapid iterations and exploration of new possibilities.
Barker also highlighted that finding a common home with projects that Kroxylicious is built on, such as SDKMan and Jackson, is a big advantage.
JavaIPCodecSuite
JavaIPCodecSuite is a small open-source library that fills a gap in the Java ecosystem by offering low-level encoders and decoders for TCP/IP family protocols. It supports IPv4, IPv6, TCP, UDP, ARP, Ethernet, ICMP, IGMP headers, and partially ICMPv6 and related protocols such as MLD, NDP, and RPL. The library has no external dependencies and works with Java 8 and above.
It is ideal for educational use, testing network devices, and automating tests in embedded environments where other languages, such as C/C++, dominate. The project is developed by Toni Lappalainen and available on GitHub.
PS: Interesting thread on Reddit discussing when such a library might be useful.
Doc4k
Doc4k is an experimental CLI tool by smyrgeorge, created for analyzing large Kotlin projects using artificial intelligence. Using a Tree-sitter parser, the tool generates an internal representation of the code, enabling the tracking of execution flow from a selected entry function and identifying related calls.
The extracted functions are then passed to a language model (LLM) for analysis, generating tests or summaries. This approach minimizes the number of tokens and increases the result accuracy. The project is currently in the proof-of-concept phase and requires manual configuration (Node.js, OpenAI API Key), but further work is planned, including rewriting the tool in Kotlin, supporting other languages, and integrating with IntelliJ IDEA.
And no, there are no LLMs project in this edition (although Doc4k could be considered a "gray area") - but that's because I plan to prepare a separate edition for that topic - but there’s still time for that.
I just want people who are tired of such issues to be able to filter out this edition without unsubscribing from the whole newsletter 😅.
I don't want to induce you any additional anxiety.