<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on foojay.io - Friends Of OpenJDK</title><link>https://foojay.io/today/category/java/</link><description>Recent content in Java on foojay.io - Friends Of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 16 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foojay.io/today/category/java/index.xml" rel="self" type="application/rss+xml"/><item><title>A Smaller, Faster Java Server with a Spring-Style API</title><link>https://foojay.io/today/java-server-work-before-startup/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/java-server-work-before-startup/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/java-server-work-before-startup/java-server-work-before-startup-d9b84f58b7.jpg" alt="Java server wiring moves from startup into the build" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;What do you pay for Spring and Java&amp;rsquo;s dynamic architecture? Can you deliver the same API without the same runtime cost?&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;For a small service, you might want dependency injection, transactions and scheduled jobs without a long startup or a large deployment. That is the case our native Java backend is trying to make. Write a controller and a service, compile their wiring into the application, then deploy a native executable.&lt;/p&gt;</description></item><item><title>Apple Shouldn't Dictate Your App's Redesign Schedule</title><link>https://foojay.io/today/who-decides-your-app-redesign/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/who-decides-your-app-redesign/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/who-decides-your-app-redesign/who-decides-your-app-redesign-e9b18f15b8.jpg" alt="Apple designs iOS; you choose your redesign schedule" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Apple&amp;rsquo;s design team doesn&amp;rsquo;t know what&amp;rsquo;s on your backlog. A new iOS appearance might be exactly what you want for your next release. It might also arrive halfway through a customer rollout, when changing the navigation is the last thing you need.&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;We want to support the new SDK without making that decision for you. This week, you can select Xcode 27 on our build servers with the returning &lt;code&gt;ios.xcode_version&lt;/code&gt; hint. Local builds and CI also support Xcode 27, and our iOS 27 theme gets more detailed Liquid Glass effects. You choose when to adopt that appearance. Codename One renders most controls itself, so the theme ships with your app. Updating the SDK can leave that theme and your application CSS in place.&lt;/p&gt;</description></item><item><title>Build Your First SaaS with MongoDB Ephemeral Clusters</title><link>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/build-your-first-saas-with-mongodb-ephemeral-clusters/</guid><description>&lt;p&gt;It&amp;rsquo;s a new world. A prototype that once meant hours or days of setup can now be up and running in minutes. With one API call, an AI agent can create a MongoDB Atlas cluster from your IDE, so you can start building without stopping to navigate account setup, cloud choices, regions, or cluster configuration.&lt;/p&gt;&#10;&lt;p&gt;In this tutorial, you will use an &lt;a href="https://www.mongodb.com/products/tools/atlas-ephemeral-clusters/" target="_blank" rel="noopener noreferrer"&gt;Atlas Ephemeral Cluster&lt;/a&gt; to build a polished job-application tracker: a small SaaS where a user manages applications on a Kanban board. The application is deliberately simple. The point is the workflow: give an agent a real database immediately, validate an idea quickly, and claim the cluster only when the prototype is worth keeping.&lt;/p&gt;</description></item><item><title>Lightweight Spring Boot Monitoring Without Prometheus and Grafana</title><link>https://foojay.io/today/lightweight-spring-boot-monitoring/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lightweight-spring-boot-monitoring/</guid><description>&lt;p&gt;Running one Spring Boot application or a handful of them on a VPS still calls for basic operational visibility. You need to know whether an application is reachable, whether errors are rising, and whether it restarted. You may not need a complete monitoring platform to answer those questions.&lt;/p&gt;&#10;&lt;p&gt;Spring Boot Actuator already exposes much of that information through its health endpoint and Micrometer metrics. &lt;a href="https://github.com/PVRLabs/statlite" target="_blank" rel="noopener noreferrer"&gt;StatLite&lt;/a&gt; turns it into a focused dashboard for health, requests, errors, latency, memory, uptime, and restarts. It runs as one Go binary and stores its history in SQLite.&lt;/p&gt;</description></item><item><title>One Embedding per Job, or Two? Measuring Semantic Search in a Spring Boot Job Portal</title><link>https://foojay.io/today/embedding-strategies-job-search/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/embedding-strategies-job-search/</guid><description>&lt;p&gt;This job portal started as a practice project. I built it after college, mostly so I&amp;rsquo;d have something to put on my resume. Recently I picked it up again. I was job hunting myself, looking for a switch, and it struck me that I should develop it properly, and maybe even launch it someday.&lt;/p&gt;&#10;&lt;p&gt;The first thing that bothered me was search. The results just weren&amp;rsquo;t good, so I started reading about how to make them better.&lt;/p&gt;</description></item><item><title>What I Learned Building an AI Code Reviewer with Java and Spring Boot</title><link>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/what-i-learned-building-an-ai-code-reviewer-with-java-spring-boot/</guid><description>&lt;p&gt;AI-assisted coding has changed how quickly developers can write software.&lt;/p&gt;&#10;&lt;p&gt;But that creates another question:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;How do you review all that generated code effectively?&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;That question led me to build CodeGuard AI, a self-hosted AI code-review application for GitHub Pull Requests using Java and Spring Boot.&lt;/p&gt;&#10;&lt;p&gt;At first, the architecture seemed simple:&lt;/p&gt;&#10;&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic"&gt;GitHub Pull Request&#10; ↓&#10; LLM&#10; ↓&#10; Review&lt;/pre&gt;&lt;p&gt;In practice, that wasn&amp;rsquo;t enough.&#10;The interesting engineering work was everything around the model: collecting useful Pull Request context, defining review instructions, structuring the model response, assessing findings, and integrating the result back into the GitHub workflow.&#10;This article explains what I learned while building that workflow.&lt;/p&gt;</description></item><item><title>Introduction to Error Prone: How to Catch Bugs at Compile Time</title><link>https://foojay.io/today/introduction-to-error-prone-how-to-catch-bugs-at-compile-time/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/introduction-to-error-prone-how-to-catch-bugs-at-compile-time/</guid><description>&lt;p&gt;The Java compiler&amp;rsquo;s job is to check whether code follows the rules of the language. Trying to remove an element from a collection that can never contain it, or using the wrong letter in a date pattern, does not break those rules, so nothing stops the code from compiling. In short, any code that follows the rules compiles, even when it does not do what its author intended.&lt;/p&gt;&#10;&lt;h2 id="what-is-error-prone"&gt;What is Error Prone?&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://errorprone.info/" target="_blank" rel="noopener noreferrer"&gt;Error Prone&lt;/a&gt; is an open source static analysis tool that Google built to fill this gap. Unlike most static analysis tools, it does not run as a separate step; it plugs into &lt;code&gt;javac&lt;/code&gt; as a plugin. Using the information the compiler produces while analyzing the code, it looks for patterns that follow the rules of the language but are most likely wrong, and reports them as compiler warnings or errors.&lt;/p&gt;</description></item><item><title>Your agents don't need an LLM to negotiate</title><link>https://foojay.io/today/your-agents-dont-need-an-llm-to-negotiate/</link><pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/your-agents-dont-need-an-llm-to-negotiate/</guid><description>&lt;p&gt;In agents that negotiate, the negotiating usually ends up inside a language model. You describe&#10;the situation in a prompt, the model answers, and you parse what comes back. It works, and it&#10;costs a network round trip and a line on a bill for every decision.&lt;/p&gt;&#10;&lt;p&gt;For the narrow case of handing work to whoever should do it, there&amp;rsquo;s a protocol that predates&#10;all of this. It&amp;rsquo;s called Contract Net, and it&amp;rsquo;s small enough to read in an afternoon.&#10;&lt;a href="https://github.com/mauro-mura/agenor" target="_blank" rel="noopener noreferrer"&gt;Agenor&lt;/a&gt; ships it. The example below has a manager hand a job to one of three workers in a single JVM, and its imports&#10;contain nothing from any model provider.&lt;/p&gt;</description></item><item><title>Introducing cbGenesis: The AI-Native ColdBox Starter for BoxLang</title><link>https://foojay.io/today/introducing-cbgenesis-ai-native-coldbox-starter-for-boxlang/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/introducing-cbgenesis-ai-native-coldbox-starter-for-boxlang/</guid><description>&lt;p&gt;&lt;strong&gt;Ortus Solutions today announces the general availability of &lt;a href="https://cbgenesis.coldbox.org" target="_blank" rel="noopener noreferrer"&gt;cbGenesis 1.0&lt;/a&gt;, a production-ready ColdBox HMVC starter template for BoxLang, and the first one designed from day one to be built &lt;em&gt;with&lt;/em&gt; an AI coding agent, not just &lt;em&gt;by&lt;/em&gt; one.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;&#10;&#9;&#9;&#9;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wbiZTAPrYQs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Introducing cbGenesis"&gt;&lt;/iframe&gt;&#10;&#9;&#9;&lt;/div&gt;&#10;&#10;&lt;p&gt;For twenty years, &lt;strong&gt;ColdBox&lt;/strong&gt; has been one of the most battle-tested HMVC frameworks in the CFML and BoxLang world. &lt;strong&gt;cbGenesis&lt;/strong&gt; takes that foundation and ships the part every team rebuilds by hand: authentication, permissions, security hardening, an admin panel, tests, and the guidance an AI agent needs to extend all of it correctly.&lt;/p&gt;</description></item><item><title>We Didn't Want to Build Another Java Server</title><link>https://foojay.io/today/why-another-java-server/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/why-another-java-server/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/why-another-java-server/why-another-java-server-f8959ffdf0.jpg" alt="Small servers, one Java stack" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;h2 id="why-build-another-java-server"&gt;Why Build Another Java Server?&lt;/h2&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;The last thing we wanted to build was another Java server framework. We have Spring, Micronaut, Quarkus, and enough ways to answer an HTTP request to fill a conference schedule.&lt;/p&gt;</description></item><item><title>try.boxlang.io Now Runs Every BoxLang Version, With or Without CFML</title><link>https://foojay.io/today/tryboxlang/</link><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/tryboxlang/</guid><description>&lt;p&gt;The &lt;a href="https://try.boxlang.io/" target="_blank" rel="noopener noreferrer"&gt;BoxLang playground&lt;/a&gt; now lets you choose among released BoxLang versions and switch CFML compatibility on or off without installing a runtime or setting up containers. Choose a version, enter a snippet, and run it in the browser.&lt;/p&gt;&#10;&lt;p&gt;Behind the editor is a serverless implementation on AWS Lambda. Each combination of BoxLang version and compatibility mode is built from one repository and deployed as an isolated function. Here&amp;rsquo;s what changed and how that arrangement works.&lt;/p&gt;</description></item><item><title>Adding RAG to a Jakarta EE 11 App With Only the JDK and Jakarta Specs</title><link>https://foojay.io/today/adding-rag-to-jakarta-ee-11-app/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/adding-rag-to-jakarta-ee-11-app/</guid><description>&lt;p&gt;The standard story about AI in the enterprise goes something like this. Your app needs AI, so you spin up a Python service. You add a vector database like Pinecone or Weaviate. You pick an orchestration framework. You now have two deployment pipelines, two languages, and two teams. The original Java monolith that handled your business logic just fine becomes one half of a distributed system that exists mostly to connect to the other half.&lt;/p&gt;</description></item><item><title>Green Build, Wrong Task: A Working Agreement for Java Teams Using AI Coding Agents</title><link>https://foojay.io/today/green-build-wrong-task-a-working-agreement-for-java-teams-using-ai-coding-agents/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/green-build-wrong-task-a-working-agreement-for-java-teams-using-ai-coding-agents/</guid><description>&lt;p&gt;You open a pull request. &lt;code&gt;./gradlew check&lt;/code&gt; is green, the diff is 400 lines, the description says &amp;ldquo;added tests as requested&amp;rdquo;. You scroll and see a dozen unit tests for one service class. What you asked for, in a two-line Jira comment, was end-to-end coverage of the checkout flow.&lt;/p&gt;&#10;&lt;p&gt;Nobody lied. The agent filled a gap in the request with the most likely reading and got to work. This is the first of three failure modes our team went through in a webinar on September 28. I am writing it up because the fixes turned out to be boring and mechanical, and they work with whatever agent your team has already installed.&lt;/p&gt;</description></item><item><title>Real-Time Fraud Detection in Java with Kafka Streams and Vector Similarity</title><link>https://foojay.io/today/real-time-fraud-detection-kafka-vector-similarity/</link><pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/real-time-fraud-detection-kafka-vector-similarity/</guid><description>&lt;p&gt;&lt;em&gt;This content is based on a talk that my colleague Tim Kelly and I presented at &lt;a href="https://devnexus.com/events/real-time-fraud-detection-in-java-with-kafka-streams-vector-similarity" target="_blank" rel="noopener noreferrer"&gt;DevNexus 2026&lt;/a&gt; in Atlanta, one of the largest Java conferences in the world.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Imagine you&amp;rsquo;re at a supermarket or shopping online. You tap your card or click &amp;ldquo;Buy Now&amp;rdquo;. In that exact moment, your bank has to make a decision: is this transaction legitimate, or is it fraud? And it has to do that in milliseconds, and get it right. If it blocks a real transaction, it frustrates the customer. If it approves a fraudulent one, it leads to financial loss. So the question is: how do banks actually do this? What&amp;rsquo;s happening behind the scenes? In this article, we&amp;rsquo;ll explore a real-world approach to solving this problem using Java, Apache Kafka, Kafka Streams, and vector similarity with MongoDB.&lt;/p&gt;</description></item><item><title>Building a Code Editor Control in JavaFX</title><link>https://foojay.io/today/building-a-javafx-code-editor-control/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/building-a-javafx-code-editor-control/</guid><description>&lt;p&gt;JavaFX doesn&amp;rsquo;t ship with a code-editor control, and &lt;code&gt;TextArea&lt;/code&gt; isn&amp;rsquo;t built to grow into one — no per-character styling, no gutter, no virtualization tuned for thousands of lines. Building a real one means going back to &lt;code&gt;Control&lt;/code&gt; + &lt;code&gt;Skin&lt;/code&gt; and constructing the editor surface yourself. This post walks through several pieces of a custom editor control.&lt;/p&gt;&#10;&lt;h2 id="the-core-idea-two-virtualized-lists-not-one"&gt;The core idea: two virtualized lists, not one&lt;/h2&gt;&#10;&lt;p&gt;The instinctive design is a single &lt;code&gt;ListView&amp;lt;String&amp;gt;&lt;/code&gt;, one row per line, with each row containing both the line number and the code. This approach has a drawback: when the user scrolls horizontally, the line numbers disappear.&lt;/p&gt;</description></item><item><title>Run Java in the Browser with TeaVM</title><link>https://foojay.io/today/java-in-the-browser-with-teavm/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/java-in-the-browser-with-teavm/</guid><description>&lt;p&gt;There’s something satisfying about editing a line of Java on a web page, clicking &lt;strong&gt;Run&lt;/strong&gt;, and seeing the result appear right there in the browser. I use this approach for the live Java snippets at &lt;a href="https://nablatensor.com/learn" target="_blank" rel="noopener noreferrer"&gt;nablatensor.com/learn&lt;/a&gt; and for source code used to bootstrap &lt;a href="https://nablatensor.com/quantlab" target="_blank" rel="noopener noreferrer"&gt;nablatensor.com/quantlab&lt;/a&gt;. In this article, I’ll explain how the pieces fit together and walk you through a React app you can run yourself.&lt;/p&gt;&#10;&lt;h2 id="from-java-source-to-a-result"&gt;From Java source to a result&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://teavm.org/docs/intro/overview.html" target="_blank" rel="noopener noreferrer"&gt;TeaVM&lt;/a&gt; compiles Java bytecode into JavaScript or WebAssembly for the browser. To let readers edit and compile the examples, I use &lt;a href="https://github.com/Vsprocessing/teavm-javac" target="_blank" rel="noopener noreferrer"&gt;teavm-javac&lt;/a&gt;, which brings a Java compiler into the browser as well. &lt;strong&gt;Compilation happens directly in the reader&amp;rsquo;s browser:&lt;/strong&gt; the edited source is sent to a Web Worker in the same tab, without sending a compilation request to a server.&lt;/p&gt;</description></item><item><title>Foojay Podcast #102: Why Foojay Walked Away From WordPress for Static Sites</title><link>https://foojay.io/today/foojay-podcast-102/</link><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/foojay-podcast-102/</guid><description>&lt;p&gt;Foojay.io quietly moved off WordPress and onto Hugo, a static site generator. No more CMS login, no database, no admin panel — just Markdown and AsciiDoc files, built and deployed straight from GitHub. In this episode we dig into why that move happened, and into the bigger question behind it: is a traditional CMS still the right way to run a content site in 2026, or has static tooling caught up? Along the way we go through the real security numbers behind WordPress&amp;rsquo;s plugin ecosystem — more than 10,000 vulnerabilities found in WordPress plugins since 2025 alone — and put very different static site generators head to head: Hugo and Jekyll, the veterans, versus Roq, the Java-and-Quarkus-based newcomer.&lt;/p&gt;</description></item><item><title>Changes Included in Release 26.08 of Azul Zing Builds of OpenJDK</title><link>https://foojay.io/today/changes-included-in-release-26-08-of-azul-zing-builds-of-openjdk/</link><pubDate>Fri, 02 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/changes-included-in-release-26-08-of-azul-zing-builds-of-openjdk/</guid><description>&lt;p&gt;Azul Zing Builds of OpenJDK, the optimized Java runtime within &lt;a href="https://www.azul.com/products/prime" target="_blank" rel="noopener noreferrer"&gt;Azul Platform Prime&lt;/a&gt;, has reached the release of the 26.08 Stable Release line. This Stable Build represents an August 2026 promotion from Stream to Stable status, consolidating six months of Stream Build work into a single, supported release line. The headline addition is &lt;strong&gt;Compilation Streaming&lt;/strong&gt;, which lets a JVM download pre-compiled code from Azul Optimizer Hub at startup instead of waiting on its own JIT compilation queue.&lt;/p&gt;</description></item><item><title>Announcing 'Skinning JavaFX Applications'</title><link>https://foojay.io/today/announcing-skinning-javafx-applications/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/announcing-skinning-javafx-applications/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever tried to make a JavaFX application look like Microsoft or JetBrains, you know that CSS is not enough. &lt;em&gt;Skinning JavaFX Applications&lt;/em&gt; is my attempt to close that gap — a practical, code-first book built from years of shipping real desktop business applications.&lt;/p&gt;&#10;&lt;p&gt;The main purpose of this book is to cover the Control-Skin architecture, so you can create your own custom controls and skins. We&amp;rsquo;ll cover how to implement custom window chrome, runtime theme switching, Fluent Design materials like Mica and Acrylic, and a full set of micro-interactions.&lt;/p&gt;</description></item><item><title>Lathe: A Java Language Server That Works Straight From Your Maven Build</title><link>https://foojay.io/today/lathe-a-java-language-server-from-your-maven-build/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/lathe-a-java-language-server-from-your-maven-build/</guid><description>&lt;p&gt;I have written Java in many editors and IDEs over the years, and they all seem to struggle with the same&#10;thing.&lt;/p&gt;&#10;&lt;p&gt;For me, the hard part of a Java IDE or language server was never the code intelligence. It was getting&#10;the project structure right. The IDE reads your build files and then tries to guess the module&#10;structure from them. And over time, Java&amp;rsquo;s compiler and runtime configuration has become more and more&#10;complex: annotation processors, the module system, and more. So you often end up in a familiar place:&#10;the code compiles and runs in the build, but not in the IDE. Even the best ones tend to break the&#10;project setup after an upgrade.&lt;/p&gt;</description></item><item><title>Durable Execution Is a Property, Not a Product</title><link>https://foojay.io/today/durable-execution-is-a-property-not-a-product/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/durable-execution-is-a-property-not-a-product/</guid><description>&lt;p&gt;Three method calls. That is my entire workflow: charge a payment, reserve inventory, send a confirmation email.&lt;/p&gt;&#10;&lt;p&gt;Run those three calls on a dedicated workflow engine and here is what happens before your business logic is done: 23 history events are appended, 15 durable state transitions are committed to a database, and 15 gRPC round trips travel between your worker and the orchestration cluster.&lt;/p&gt;&#10;&lt;p&gt;That, in one paragraph, is why I want to talk about durable execution. Not because the engines are bad. They are impressive systems built by serious engineers. I want to talk about it because the Java community is being sold a property as if it were a product, and I think most of us already own the property.&lt;/p&gt;</description></item><item><title>Lies, Damn Lies and Benchmarks</title><link>https://foojay.io/today/performance-work-between-benchmarks/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/performance-work-between-benchmarks/</guid><description>&lt;p&gt;&lt;img src="https://foojay.io/today/performance-work-between-benchmarks/performance-work-between-benchmarks-add0d8fe44.jpg" alt="Lies, Damn Lies And Benchmarks" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;There&amp;rsquo;s an old joke about three kinds of lies: &lt;a href="https://www.spec.org/osg/news/articles/news9412/lies.html" target="_blank" rel="noopener noreferrer"&gt;lies, damn lies, and benchmarks&lt;/a&gt;. Codename One did very well in our benchmarks. But were they accurate? Were they representative?&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;Performance is the fitted sheet of programming. Just when you get the damn corner into place, the rest of the bed is a complete mess.&lt;/p&gt;</description></item><item><title>My love-hate relationship with Java formatters</title><link>https://foojay.io/today/my-love-hate-relationship-with-java-formatters/</link><pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/my-love-hate-relationship-with-java-formatters/</guid><description>&lt;p&gt;Disclaimer: I don&amp;rsquo;t want to turn this into &amp;ldquo;Java formatters week&amp;rdquo;, but I started my own project a while ago, and I think it&amp;rsquo;s time for it to come out of stealth mode.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve been writing Java for many, many years, and the Sun Code Conventions were my favorite bedside reading. I&amp;rsquo;ve seen plenty of variations over the years, and even after they became the Oracle Code Conventions, they were still the same few-page guide on how to write a hello-world app with the standard class library. For some reason I never took to the Google conventions: too C-flavored, with tiny indents, too few columns on the screen, and so on.&lt;/p&gt;</description></item><item><title>The Java 21 Doomsday Clock Countdown</title><link>https://foojay.io/today/the-java-21-doomsday-clock-countdown/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/the-java-21-doomsday-clock-countdown/</guid><description>&lt;h2 id="the-java-21-countdown-is-pressing"&gt;The Java 21 Countdown Is Pressing&lt;/h2&gt;&#10;&lt;p&gt;Oracle JDK 21 was free to use in production under Oracle&amp;rsquo;s No-Fee Terms and Conditions (NFTC) license. That free ride is over. Oracle&amp;rsquo;s licensing rule ties free NFTC use to one year after the next Long Term Support (LTS) release ships, and since Java 25 became generally available on September 16, 2025, the license window closed on September 16, 2026.&lt;/p&gt;&#10;&lt;p&gt;The date that matters now is &lt;strong&gt;October 20, 2026&lt;/strong&gt;. That is Oracle&amp;rsquo;s next quarterly update — the first batch of Java 21 patches, including Critical Security Patch Updates (CSPUs), that no longer reaches you under the free license. Every Java 21 fix from that day forward requires a paid Oracle subscription. This is not a one-time event: the same mechanism already retired free updates for Java 17, and it will retire Java 25&amp;rsquo;s free updates in turn once Java 29 ships. It&amp;rsquo;s a recurring toll booth built into Oracle&amp;rsquo;s licensing terms.&lt;/p&gt;</description></item><item><title>How much will post-quantum migration cost your Java codebase?</title><link>https://foojay.io/today/how-much-will-post-quantum-migration-cost-your-java-codebase/</link><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/how-much-will-post-quantum-migration-cost-your-java-codebase/</guid><description>&lt;p&gt;The post-quantum transition has stopped being a research topic and become a set of dates. NIST finalized ML-KEM (FIPS 203), ML-DSA (FIPS 204) and SLH-DSA (FIPS 205) in August 2024. NIST IR 8547 deprecates RSA, ECDSA, (EC)DH and the rest after 2030 and disallows them after 2035, and similar timelines are turning up in government guidance elsewhere.&lt;/p&gt;&#10;&lt;p&gt;So the destination is settled. For most Java teams the hard question is not &lt;em&gt;what&lt;/em&gt; to migrate to. It is &lt;em&gt;how much&lt;/em&gt; the migration will cost for their specific codebase, and where the expensive parts are hiding. That question has been oddly hard to answer, and most of the post-quantum migration tooling I could find targets C, C++ and Rust, even though a great deal of enterprise cryptography runs on the JVM.&lt;/p&gt;</description></item><item><title>Testing Kafka Consumer Recovery Contracts With Testcontainers and JUnit</title><link>https://foojay.io/today/testing-kafka-consumer-recovery-contracts-with-testcontainers-and-junit/</link><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/testing-kafka-consumer-recovery-contracts-with-testcontainers-and-junit/</guid><description>&lt;p&gt;A Kafka consumer can pass a unit test and still fail when production redelivers a&#10;record.&lt;/p&gt;&#10;&lt;p&gt;That happens because the unit test usually checks the handler, not the recovery&#10;contract. It verifies that one message produces one expected side effect. It&#10;rarely verifies what happens when the same event arrives twice, when a malformed&#10;record reaches the topic, or when the consumer applies a side effect and then&#10;crashes before committing the offset.&lt;/p&gt;</description></item><item><title>One Database, Two Models: Building AI-Friendly Java Applications with MySQL JSON Duality Views</title><link>https://foojay.io/today/one-database-two-models-mysql-json-duality-views-java/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/one-database-two-models-mysql-json-duality-views-java/</guid><description>&lt;p&gt;MySQL can now hand your application a complete JSON document, such as an order with its customer and line items, while the data stays in normal relational tables. You can even send the document back and MySQL updates the right rows. I built a small Java app to see how far that goes. Reading got much simpler. Writing works too, but it comes with a few sharp edges you should know about before you use it.&lt;/p&gt;</description></item><item><title>VoIP, VPN, and the Build System Behind Them</title><link>https://foojay.io/today/voip-vpn-builders/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://foojay.io/today/voip-vpn-builders/</guid><description>&lt;p&gt;In 2019, a reader asked whether our WhatsApp clone included VoIP. &lt;a href="https://www.codenameone.com/blog/whatsapp-clone-ga/#comment-24081" target="_blank" rel="noopener noreferrer"&gt;I said no&lt;/a&gt;. It would require native integration, and the setup was too much for that project. For years, that was the line.&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/voip-vpn-builders/voip-vpn-builders-bdff9b8012.jpg" alt="A phone, secure tunnel, and native build pipeline" width="1024" height="512" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;aside style="border-left: 4px solid #007aff; padding: 14px 18px; margin: 24px 0; border-radius: 4px; font-size: 0.95em;"&gt;&lt;strong&gt;What is Codename One?&lt;/strong&gt; Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at &lt;a href="https://www.codenameone.com/"&gt;codenameone.com&lt;/a&gt;.&lt;/aside&gt;&#10;&lt;p&gt;VPN sat behind the same line. These features do not live neatly inside the application process. On iOS, a VoIP push can arrive before the application installs a Java listener, yet CallKit expects the incoming call to reach the lock screen on its deadline. A Call Directory integration is a separate extension executable with its own lifecycle and signing identity. Managed VPN adds Network Extension entitlements and profile rules. Android solves the same jobs through &lt;code&gt;ConnectionService&lt;/code&gt;, &lt;code&gt;VpnManager&lt;/code&gt;, &lt;code&gt;VpnService&lt;/code&gt;, manifest declarations, and foreground-service rules.&lt;/p&gt;</description></item><item><title>BoxLang 1.17.0 Released: Module Inception, CLI Checker, Jar Loading and much more!</title><link>https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/</link><pubDate>Thu, 17 Sep 2026 20:20:32 +0000</pubDate><guid>https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/</guid><description>&lt;p&gt;&lt;strong&gt;BoxLang has always been an extensible language. As of 1.17.0, it is a hierarchically extensible one.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://foojay.io/today/boxlang-1-17-0-released-module-inception-cli-checker-jar-loading-and-much-more/boxlang-v1.17.0-700x467.jpg" alt="" width="700" height="467" loading="lazy" decoding="async"&gt;&lt;/p&gt;&#10;&lt;p&gt;Modules can now contain other modules; &lt;strong&gt;aka Module Inception&lt;/strong&gt; . Recursively. To any depth. Each nested module gets its own class loader, chained to its parent&amp;rsquo;s, and BoxLang&amp;rsquo;s own &lt;code&gt;ModuleService&lt;/code&gt; discovers, registers, activates, and unloads that entire tree itself. No package manager. No build tool. No install ordering. Drop in one artifact and everything it depends on comes with it, already wired up and already isolated. &lt;strong&gt;Not only that, you can now package modules into a single jar.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Can You Explain the Diff Your AI Agent Just Wrote?</title><link>https://foojay.io/today/can-you-explain-the-diff-your-ai-agent-just-wrote/</link><pubDate>Tue, 15 Sep 2026 14:12:01 +0000</pubDate><guid>https://foojay.io/today/can-you-explain-the-diff-your-ai-agent-just-wrote/</guid><description>&lt;p&gt;Every Java developer has been in a code review where the question is simple: &amp;ldquo;What does this method do?&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;The answer used to tell you something. The developer who wrote it would describe the intent, the edge cases, the trade-off they considered and rejected. The code review was a conversation about the invariant the code protects.&lt;/p&gt;&#10;&lt;p&gt;Now the answer is sometimes: &amp;ldquo;The agent wrote it.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;The code compiles. The tests pass. The linter is clean. Nobody in the review can explain the architecture of the PR, including the person who submitted it.&lt;/p&gt;</description></item></channel></rss>