Skip to content

143 - adopt JDK 25 as preferred runtime - #143

Open
robobario wants to merge 3 commits into
kroxylicious:mainfrom
robobario:upgrade-the-preferred-runtime
Open

robobario wants to merge 3 commits into
kroxylicious:mainfrom
robobario:upgrade-the-preferred-runtime

Conversation

@robobario

@robobario robobario commented Oct 13, 2026 •

Copy link
Copy Markdown
Member

Proposal #141 needs JEP 527 (post-quantum ML-KEM) to avoid depending on Bouncy Castle. JDK 25 also brings the JEP 491 virtual thread pinning fix and a more current LTS. Keep the Java 21 language level and test coverage in place so this isn't a breaking change for plugin developers or bare-metal JDK 21 users.

Assisted-by: Claude Sonnet 5 noreply@anthropic.com

Proposal kroxylicious#141 needs JEP 527 (post-quantum ML-KEM) to avoid depending
on Bouncy Castle. JDK 25 also brings the JEP 491 virtual thread
pinning fix and a more current LTS. Keep the Java 21 language level
and test coverage in place so this isn't a breaking change for
plugin developers or bare-metal JDK 21 users.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Robert Young <robertyoungnz@gmail.com>
@robobario
robobario requested a review from a team as a code owner October 13, 2026 21:40
@robobario robobario changed the title proposal: adopt JDK 25 as preferred runtime 143 - adopt JDK 25 as preferred runtime Oct 13, 2026
Signed-off-by: Robert Young <robertyoungnz@gmail.com>
Comment thread proposals/143-adopt-jdk-25-as-preferred-runtime.md Outdated
Comment thread proposals/143-adopt-jdk-25-as-preferred-runtime.md Outdated
Comment thread proposals/143-adopt-jdk-25-as-preferred-runtime.md

@SamBarker SamBarker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Proposal looks good — happy with the runtime/language-level separation. A few minor comments inline.

Decouple the JDK 25 runtime move from waiting on OpenJDK 25.0.5, since
PQC support arrives separately through the normal dependency upgrade
cycle. Explain why integration/system tests pin to JDK 25 instead of
21, following the DNS resolver precedent. Add the admission controller
to the affected-projects list.

Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Robert Young <robertyoungnz@gmail.com>
@robobario robobario mentioned this pull request Oct 14, 2026
@robobario

Copy link
Copy Markdown
Member Author

had an offline chat about this and there's some doubt about whether we need an additional concept/name like "preferred runtime" when we've been through the same process for 17->21, where we had the language/compile level at 17 and everything else at 21 for some time, with unit tests additionally run against 17.

@MarkNSweep

Copy link
Copy Markdown
Contributor

I wouldn't want to scope creep this proposal but with Java 29 (next LTS) due less than a year away, is it worth making this a proposal to adopt new LTS versions. Having code built to the current LTS -1 (in this case Java 21) and moving the JDK to the next LTS (Java 25) means that we would plan to move the code to 25 and JDK to 29 next year. This would allow a predictable upgrade path but also provide a timeline for when the project will be able to use new language features.


Kroxylicious compiles to Java 21 bytecode (`maven.compiler.release=21`); the floor moved from 17 to 21 on 3 July 2026, completing stage 2 of proposal 013.

CI builds and runs the unit test suite against JDK 21. Container images for `kroxylicious` and `kroxylicious-operator` run on JDK 21.

@k-wall k-wall Oct 22, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Don't we also run the unit tests on JDK 25?


This proposal separates the *preferred runtime* (the JDK the project builds containers with and recommends to operators) from the *language level* (the bytecode target and minimum supported JDK).

1. Update the container images for `kroxylicious`, `kroxylicious-operator`, and `kroxylicious-admission-control` to use a JDK 25 base image, and update CI workflows to build with JDK 25. This does not need to wait for OpenJDK 25.0.5; the runtime move and PQC enablement are separable, and JDK 25.0.5 reaches the project through the normal dependency upgrade cycle once it ships.

@k-wall k-wall Oct 22, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: we mostly use ubi-minimal as a base image, then install the JDK RPM


1. Update the container images for `kroxylicious`, `kroxylicious-operator`, and `kroxylicious-admission-control` to use a JDK 25 base image, and update CI workflows to build with JDK 25. This does not need to wait for OpenJDK 25.0.5; the runtime move and PQC enablement are separable, and JDK 25.0.5 reaches the project through the normal dependency upgrade cycle once it ships.
2. Keep `maven.compiler.release` at 21. No bytecode or language-level change. Users running Kroxylicious on bare-metal JDK 21 see no breaking change.
3. Continue running the unit test suite against JDK 21, as happens today, so the minimum supported JDK stays verified. Run integration/system tests against JDK 25 only, not JDK 21. We already pin integration tests to a specific JDK where behaviour depends on it (JDK 21 for DNS resolver behaviour); the same logic applies here. Once JDK 25.0.5 lands, verifying a PQC-enabled session (proposal #141) requires a JVM with JEP 527, so those tests can only run meaningfully on JDK 25.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(JDK 21 for DNS resolver behaviour)

nit: That was a special case we needed when the project was Java 17 focused. The special casing disappeared last year.


1. Update the container images for `kroxylicious`, `kroxylicious-operator`, and `kroxylicious-admission-control` to use a JDK 25 base image, and update CI workflows to build with JDK 25. This does not need to wait for OpenJDK 25.0.5; the runtime move and PQC enablement are separable, and JDK 25.0.5 reaches the project through the normal dependency upgrade cycle once it ships.
2. Keep `maven.compiler.release` at 21. No bytecode or language-level change. Users running Kroxylicious on bare-metal JDK 21 see no breaking change.
3. Continue running the unit test suite against JDK 21, as happens today, so the minimum supported JDK stays verified. Run integration/system tests against JDK 25 only, not JDK 21. We already pin integration tests to a specific JDK where behaviour depends on it (JDK 21 for DNS resolver behaviour); the same logic applies here. Once JDK 25.0.5 lands, verifying a PQC-enabled session (proposal #141) requires a JVM with JEP 527, so those tests can only run meaningfully on JDK 25.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Run integration/system tests against JDK 25 only, not JDK 21.

I'm not sure about that. We'd need to be very confident that our JDK specific code (PQC for instance) is covered by the unit tests. Running no integration tests against JDK 21 makes me feel uneasy. Could we identify a subset of integration tests and run those against JDK 21?

@robobario robobario Oct 27, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the motivation here was conserving our actions budget which is pretty taxed already. In a perfect world we could run the full IT suite against both versions. Running a subset sounds like a good idea to me.

Would it also be worth something like a daily test run to exercise the full set of ITs on 21? I know it's shifting things further away from the breaking commit but I don't feel like we can double our IT load on GHA without further impacting the difficulty of getting things merged. It would give some confidence if we have any automation that runs all the tests.

@robobario

Copy link
Copy Markdown
Member Author

I wouldn't want to scope creep this proposal but with Java 29 (next LTS) due less than a year away, is it worth making this a proposal to adopt new LTS versions. Having code built to the current LTS -1 (in this case Java 21) and moving the JDK to the next LTS (Java 25) means that we would plan to move the code to 25 and JDK to 29 next year. This would allow a predictable upgrade path but also provide a timeline for when the project will be able to use new language features.

Having the floor be the prior LTS with an upgrade every two years does feel like a reasonable amount of runway. One problem is since we've increased the floor to 21 recently, increasing it again when JDK 29 releases would be quite quick.

Then there's unknown Vendor requirements, we may find come the release JDK LTS X that some vendor really needs more time to upgrade from LTS X-2 and it may be in the projects interest to weigh that up against keeping up with JDK improvements and new language features. So I feel like each floor bump should have a proposal to give community members a chance to speak up.

It might also dovetail with the 1.0.0 discussion, like maybe we could consider tying JRE minimum versions to a major project version?

I think you're right though, that we could write up a policy that would help users. If we can say what the project would prefer to do, and that we'll consult the community when we bump the floor, that would just make it a mechanical thing. I think it'd be good to do separately from this PR and I can have a go at writing a policy after this one is wrapped up.

@MarkNSweep

Copy link
Copy Markdown
Contributor

I think that PQC and its associated back porting is a special case, so raising a separate proposal to define the adoption of new LTS's would be good. If we pinned the Java byte code to JVM LTS X - 1, but tested and built the project images on JVM LTS that effectively gives 2 LTS releases to move up whilst still being able to take advantage of JVM enhancements and bug fixes.

Let me know if I can help with the new proposal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants