Contents
Key takeawaysHow the four builds differSupport end datesTCK certificationWho supports whatWhat support costsSecurity patch speedPlatform coveragePrimary and fallbackWhat we have seenPlanning a switchWhat to do nextFAQAll four builds are free and run the same code. Choose on the support window for your oldest Java release, who is contractually obliged when the JVM fails, how fast security builds ship, and whether a certified binary exists for your platforms.
- There is no industry LTS date. Each vendor publishes its own end date for the same Java version, and on Java 11 the published windows differ by more than four years between Temurin and Corretto or Zulu.
- Compatibility is claimed per build. A conformance statement covers one version on one platform, so ask for the statement that matches what you deploy.
- Only Azul sells a standalone contract. Adoptium sells none, Amazon covers Corretto under an AWS Support Plan, and Microsoft supports its build only for Java running on Azure under an Azure Support Plan.
- Patch lag is mostly yours. Vendors publish the quarterly security builds within hours to days of upstream, and the weeks after that belong to your own pipeline.
- Standardize on a specification. Name the version, platform, conformance evidence and build availability commitment, so any qualifying build can replace another.
- Aim for two builds. One primary covering 80 percent or more of your Java workloads, and one named exception for legacy versions, unusual platforms or cryptography constraints.
What is the difference between Corretto, Temurin and Zulu?
The code is close to identical. Amazon Corretto, Eclipse Temurin, Azul Zulu and the Microsoft Build of OpenJDK are all compiled from the same upstream OpenJDK source, all free to run in production, and all run your code. None of them charges a license fee, so the price of the runtime cannot separate them.
Four things do differ, and they are the ones to decide on: the support window on the version you run, who is contractually obliged when the virtual machine misbehaves, how fast the security build appears, and whether a certified binary exists for your platform. The rest of this page takes them in that order.
| Build | Published by | How you get a support contract | Java 8 builds |
|---|---|---|---|
| Amazon Corretto | Amazon | Inside an existing AWS Support Plan | Yes |
| Eclipse Temurin | Adoptium, under Eclipse Foundation governance | From a third party such as Azul, Red Hat or IBM | Yes |
| Azul Zulu | Azul | Directly from Azul, as Azul Platform Core | Yes, and older releases too |
| Microsoft Build of OpenJDK | Microsoft | Through an Azure Support Plan, for Java running on Azure only | No, Microsoft points to Temurin |
Most teams reach this choice while leaving the Oracle Java SE Universal Subscription, which Oracle prices from $15 per employee per month at list. If you have not yet settled whether to leave Oracle at all, start with our Oracle Java versus OpenJDK decision guide. This page assumes you have.
For a narrower comparison of Amazon's build against the plain upstream project, see Amazon Corretto versus OpenJDK.
How to Negotiate the Oracle Java Employee Agreement: Honest Leverage in a Captive Deal
Why do LTS end dates differ for the same Java version?
Because long term support is a promise each vendor makes, and the Java release itself carries no end date. Every provider decides how long it will keep shipping updates for a version, and those decisions diverge most on the older releases that dominate a migration off Oracle.
This is the largest difference between the builds and the one most likely to cost you a second project. Pick a short window on your most entrenched version and you will migrate again years before a peer who picked differently.
| Build | Java 8 | Java 11 | Java 17 | Java 21 | Java 25 |
|---|---|---|---|---|---|
| Amazon Corretto | December 2030 | January 2032 | October 2029 | October 2030 | October 2032 |
| Azul Zulu | December 2030 | January 2032 | September 2029 | September 2031 | September 2033 |
| Eclipse Temurin | At least December 2030 | At least October 2027 | At least October 2027 | At least December 2029 | At least September 2031 |
| Microsoft Build of OpenJDK | Not built, defers to Temurin | September 2027 | September 2027 | September 2028 | September 2030 |
Each vendor frames its commitment differently, and each publishes it in a different place:
- Amazon Corretto. Long windows on the versions that matter in a migration. Confirm them in Amazon's Corretto support calendar.
- Azul Zulu, free builds. The broadest version range, including releases older than Java 8. Azul's published support roadmap also lists optional Legacy Production Support for Java 6 and 7 through December 2029.
- Eclipse Temurin. At least four years per long term support release, and builds for as long as the upstream source is maintained. The Adoptium support policy page carries the table.
- Microsoft Build of OpenJDK. Long term support releases only, under its lifecycle policy. Microsoft's OpenJDK documentation calls its dates initial targets that it may extend.
Treat every date above as a vendor statement to confirm on the day you decide. Vendors extend and occasionally shorten these windows. A decision recorded with a dated source holds up in front of an audit committee in a way that a decision recorded from an article does not.
How to read a vendor support window without being misled
- Read the floor. "At least four years" is a commitment to four years. Anything beyond it is goodwill, and goodwill does not belong in a plan.
- Check the version you are stuck on. The window that matters covers your oldest entrenched release. Your newest release will be upgraded anyway.
- Separate free from paid. Some vendors publish one window for community builds and a longer one behind a support contract. Confirm which column applies to you.
- Watch the platform footnotes. A window can apply to Linux on x64 and not to the architecture you actually run.
- Count the months left today. As of September 2026, Temurin 11 and 17 and Microsoft's builds of 11 and 17 have roughly 12 months of published cover remaining. A standard written now around those builds has a short shelf life.
Why the version tail sets your next migration date
Most migrations off Oracle carry a tail of Java 8 and Java 11 workloads that cannot move quickly. That tail should drive the distribution decision, because your modern applications will be refreshed on their own schedule.
If 30 percent of your applications sit on Java 11 and your chosen build commits to October 2027, you have set a date to migrate again whether you meant to or not. A build with a 2032 window on the same version buys four extra years for zero additional license cost.
| Item | Temurin 11 | Corretto 11 or Zulu 11 |
|---|---|---|
| Applications on Java 11 | 120 | 120 |
| Published end of support | At least October 2027 | January 2032 |
| Months of cover from October 2026 | 12 | 63 |
| License cost of the runtime | $0 | $0 |
| Effort to move again, at an assumed 8 person days per application | 960 person days, needed by late 2027 | 960 person days, needed by early 2032 |
The 8 person days for retesting and redeploying one application is illustrative, so replace it with your own figure. The effort is the same in both columns. What changes is whether you spend it next year or 51 months later.
Picking the shorter window costs nothing today and a full second project in a few years.
Workday vs Oracle HCM cost comparison
Licensing models, total cost of ownership and implementation realities for both HCM suites.
Get the white paper →What does TCK certified actually mean, and how do you verify it?
It means a specific build passed the Java SE Technology Compatibility Kit, the conformance test suite that decides whether an implementation may be described as compatible with the Java specification. The claim is real and checkable. It is also narrower than most buyers assume.
What the compatibility kit tests, and what it leaves out
For builds derived from the upstream project, access to the kit runs through the OpenJDK community conformance program and its OpenJDK Community TCK License Agreement. That route is how independent vendors are able to test and publish conformance for their own builds.
- It tests specification conformance. The build implements the Java SE specification for that version correctly.
- It does not test performance. Garbage collector behavior, startup time and memory footprint sit outside it entirely.
- It does not test your application. Conformance is no substitute for your own regression run.
- It does not cover packaging. Fonts, container base images, installers and bundled components sit outside the specification.
The three questions that turn a claim into evidence
A vendor page saying "TCK certified" is marketing until it is tied to the artifact you deploy. Ask these three questions in writing and keep the answers with your decision record.
- Which exact version? Conformance is claimed per feature release and per update, and a claim for the brand as a whole means little.
- Which exact platform? A statement covering Linux on x64 does not automatically cover Windows, macOS on Apple silicon, or a musl based container image.
- Which exact artifact? The certified build and the convenience container image are not always the same object. Confirm which one your pipeline pulls.
How to see which build you are actually running
Before comparing conformance statements, confirm what is deployed today. Most environments turn out to run more builds than the architecture diagram shows.
- Running JVMs. The command "java -XshowSettings:properties -version" prints the system properties. The java.vendor line reads Amazon.com Inc., Eclipse Adoptium, Azul Systems, Inc. or Microsoft, and on Java 11 and later java.vendor.version adds the distribution's own release string.
- Installed JDKs that are not running. The release file in each JDK home directory carries IMPLEMENTOR and JAVA_VERSION lines. An inventory script can collect them without starting Java.
- Container images. A software bill of materials generated at build time lists the JDK package and version in each base image. Scan again after every rebuild of an untagged image.
- Oracle binaries still in place. These need separating from the free builds before anything else, as set out in telling Oracle JDK apart from OpenJDK.
Why building OpenJDK yourself changes your position
If your team compiles the upstream source itself, the resulting binary carries no conformance statement from anyone. That is legal and technically fine, and it removes the evidence an auditor or a software vendor may ask for.
Do it only where you have a specific reason and a specific owner. For everyone else, a vendor build with a published conformance statement costs nothing and answers a question you would otherwise have to answer yourself.
Who is contractually obliged to fix your Java virtual machine?
Only Azul sells a standalone support contract for its own build that covers the JVM wherever it runs. Amazon and Microsoft fold support into their cloud support plans, and Adoptium sells none. The binaries are near identical, so this is the procurement variable that actually differs, and the one your risk function will ask about first.
Eclipse Temurin: an excellent binary with no first party contract
Adoptium publishes Eclipse Temurin under Eclipse Foundation governance, and it is the strongest vendor neutral default available. Adoptium does not sell support. Its own support page says so and points to a list of companies that do.
If you need a service level agreement, you buy it from a working group member such as Azul, Red Hat or IBM, on that supplier's own paper. The party producing your binary and the party obliged to you are then different organizations, which belongs in the risk register of any regulated company.
Amazon Corretto: support arrives inside the AWS relationship
There is no separate support product for Amazon Corretto. Amazon's FAQ says Corretto is covered by an AWS Support Plan on the same basis as its other services, and that it has no plans for a Corretto specific plan. That is efficient if you already hold a plan at a meaningful tier.
Two things decide whether it works for you: a response commitment at your plan tier that you can live with, and an entitlement that extends to Corretto running outside AWS compute. Amazon's FAQ is silent on the second, so get it confirmed in writing if any of your Java runs on premises or in another cloud.
Azul Zulu: first party terms with published units
Azul is the only one of the four selling its own support contract, Azul Platform Core, with publicly discussed per unit pricing. It is also the only one offering stabilized builds that carry security fixes with minimal other change. If you migrated specifically to reduce risk, price that stabilized option even if you end up not buying it.
Azul is also the only vendor of the four where the relationship is a real negotiation with terms to win. We work through those terms in the Azul Zulu versus Oracle Java comparison.
Microsoft Build of OpenJDK: long term support releases only
The Microsoft Build of OpenJDK covers long term support releases under Microsoft's lifecycle policy and does not build Java 8. For Java 8, Microsoft relies on Temurin, and it publishes Temurin based Java 8 container images in the Microsoft Container Registry.
Commercial support is limited to Azure customers with an active Azure Support Plan, for Java deployed to Azure services, Azure Stack and Azure Arc clusters. That makes it a clean fit for an Azure centric company on current releases, and a poor sole standard where a legacy tail or a large on premises footprint exists.
The clauses to read before you sign any support agreement
- The licensable unit. Core, virtual core, server or desktop. Agree the definition before the rate, because the definition is the multiplier.
- Build availability after a security release. A response time on tickets is a different promise from a commitment to publish a patched build.
- Version coverage on the tail. Confirm the contract covers the oldest release you actually run as well as the current one.
- Platform coverage. The contract should name the architectures and operating systems you run, including container base images.
- The liability cap. Usually limited to fees paid. Read it before anyone cites indemnity in a risk paper.
- A price hold. A multiyear term is only worth signing if the unit rate is fixed for all of it.
- A reduction right. Workloads retire. The contract should let you lower the count at each anniversary without a penalty.
What does commercial support cost when you buy it?
Low four figures per hundred cores at published starting points, which is a small fraction of a per employee subscription at the same scale. Because three of the four vendors either bundle support into another relationship or do not sell it, Azul's published units are the market reference point.
| Unit | Published starting point | What to check |
|---|---|---|
| Per virtual core, per year | About $20 | How virtual cores are counted on your hypervisor |
| Per physical core, per year | About $40 | Whether it maps to two virtual cores in your contract |
| Per desktop, per year | About $25 | Whether developer machines are in or out of scope |
Model these as a band and treat the published figures as a ceiling, because transacted pricing at scale sits meaningfully below list. The full cost comparison against the Oracle line, including internal effort, is in the three pattern cost model, and the version framed for finance is the CFO business case.
A worked example against the Oracle subscription
Say you employ 2,000 people and run Java in production on 20 virtual machines of 8 virtual cores each, with 150 developer desktops that need a supported JDK. Oracle's published tiers go as low as $5.25 per employee per month, so the table gives Oracle that lowest rate even though a company of 2,000 would not qualify for it.
| Line | Calculation | Annual cost |
|---|---|---|
| Oracle Java SE Universal Subscription at its lowest published tier | 2,000 employees x $5.25 x 12 months | $126,000 |
| Azul support, production servers | 160 virtual cores x $20 | $3,200 |
| Azul support, developer desktops | 150 desktops x $25 | $3,750 |
| Azul support in total, at published starting points | $3,200 + $3,750 | $6,950 |
The real gap is wider than the table shows, because the Oracle line uses a rate this company would not get. Even so, scope the Azul quote to the workloads that carry an external obligation. Servers with no such obligation are the first lines to cut, and the covered list is what the contract should name.
What the account teams will say, and how to answer
- "Cover the whole fleet so every JVM is supported." Answer that support is sized to the list of workloads with a contractual or regulatory obligation. Everything else runs the same binary on the free build.
- "Our rate is per physical core." Ask for the quote in both units, and have the order form state whether a hyperthreaded physical core counts as two virtual cores.
- "Corretto is already covered by your support plan." Ask AWS to confirm in writing the response time at your tier and whether coverage extends to Corretto outside AWS.
- "The Microsoft build is supported under your Azure plan." Correct for Java deployed to Azure, Azure Stack or Azure Arc. Ask what covers the same build on your own servers, because Microsoft's support terms do not.
- "Sign for three years and the rate drops." Accept only with the price hold and reduction right from the clause list above.
How fast does each build ship the quarterly security update?
All four publish within hours to days of the upstream release. OpenJDK security updates follow the same quarterly calendar as Oracle's Critical Patch Updates, in January, April, July and October, so the difference between vendors is small. The difference between any vendor and your own pipeline is enormous.
The three components of patch lag, and which one is yours
| Stage | Typical elapsed time | Who owns it |
|---|---|---|
| Upstream fix to vendor build published | Hours to a few days | Your distribution vendor |
| Vendor build to your approved base image | Days to weeks | Your platform team |
| Approved image to production everywhere | Weeks to a quarter | Application owners and change governance |
Read the ownership column. A distribution choice shortens the first row and nothing else, which is why an eight year support window is worthless on a server fleet two quarters behind on updates.
What to put in the standard so cadence is measured
- A named owner for patch currency, with a reporting date each quarter instead of a shared inbox.
- A measured metric. The percentage of running JVMs within one quarter of the current security build, reported alongside your other operational controls.
- Explicit image tags. Container base images change their underlying operating system between releases, so untagged references move underneath you.
- A blocked path back. If the old binary is still reachable internally, it returns. The CI/CD and workstation cleanup guide covers how to close it.
Which builds cover the platforms you actually run?
Zulu has the broadest platform and version matrix, Corretto and Temurin cover the mainstream platforms well, and Microsoft builds only long term support releases from Java 11 onward. Standardize on a build that does not ship for one of your target platforms and you force a second distribution back in, which defeats the purpose of standardizing.
| Build | Mainstream coverage | Alpine and musl | Legacy versions |
|---|---|---|---|
| Amazon Corretto | Linux on x64 and aarch64, Windows, macOS including Apple silicon | Yes | Java 8 and 11 covered, nothing older |
| Azul Zulu | Broadest matrix of the four across Linux, Windows and macOS | Yes | Builds available for releases older than Java 8 |
| Eclipse Temurin | Strong mainstream coverage across the common platforms | Yes, on current releases | Java 8 and 11 covered |
| Microsoft Build of OpenJDK | Cross platform on the releases it supports | Limited: Java 11 and 17 only, on x64 and aarch64 | Does not build Java 8 |
The coverage questions to ask before you standardize
- Architectures. Does a build exist for every architecture you run, including the ARM instances someone adopted for cost reasons last year?
- Containers. Is there a musl based image for the container platform your applications actually deploy into?
- Desktops. Does the desktop story work, including any application that still needs a browser plugin replacement or a Java Web Start substitute?
- Operating system versions. Is anything running on an operating system version your candidate build no longer publishes for?
How do you choose one primary build and one fallback?
Decide once, at program level, and publish it as a standard. The target is one primary build covering 80 percent or more of your Java workloads, plus one named exception build for what the primary cannot cover: legacy versions, unusual platforms or cryptography constraints.
| If your company is | Primary | Fallback | The reason |
|---|---|---|---|
| Heavily on AWS with an active support plan | Corretto | Zulu | Support inside a relationship you already pay for, long windows on Java 8 and 11 |
| Azure centric, current releases only | Microsoft Build | Temurin | Aligned lifecycle, with Temurin covering the Java 8 gap Microsoft does not build |
| Running long lived applications, or bound by a rule requiring one accountable supplier | Zulu | Temurin | Longest published windows, broadest platform matrix, first party contract available |
| Cloud neutral with disciplined version refresh | Temurin | Corretto | Vendor neutral governance, with Corretto covering the longer version tail |
| Carrying a large Java 8 footprint that cannot move yet | Zulu or Corretto | Temurin | The version tail decides it, and the tail is where the risk sits |
Write the standard as a specification rather than a brand
The reason to standardize is governance. Write the standard so that any build qualifies by meeting criteria, and you stay portable between suppliers at the same feature release.
- Named feature releases the standard covers, with the support window each requires.
- Named platforms and architectures, including container base images.
- A published conformance statement for each version and platform combination in use.
- A stated commitment on build availability after each quarterly security release.
- One named exception build, with the specific reason it exists written next to it.
How the choice changes with company size
A 500 person company on one cloud, running a few dozen Java services on current releases, can usually take its cloud provider's build as primary, skip paid support and spend its effort on patch currency. The exception build may never be needed.
A 20,000 person group with on premises data centers, two clouds and a Java 8 tail has a different problem. Platform coverage and the legacy window dominate, a first party contract often becomes a requirement from the risk function, and the exception build is certain to be used.
Why matching your cloud provider should break the tie, and only that
The usual guidance is to pick the build that matches your cloud provider and treat that as decisive. We disagree, because your Java applications will outlive your cloud strategy, your support plan tier and quite possibly your current cloud vendor.
What strands a company is the version tail and the support window attached to it, because that sets the date you do all of this again. Rank the criteria in this order:
- The support window covering your oldest entrenched release.
- Who is contractually obliged when the virtual machine misbehaves.
- Platform coverage across everything you run.
- Cloud alignment, used only to settle a tie.
A choice made in that order usually survives a change of cloud provider or support tier. A choice made on cloud alignment alone tends to be reopened at the next platform review.
What have we seen in OpenJDK distribution decisions in 2024 and 2025?
Across roughly 30 to 45 Oracle Java engagements I ran or reviewed in 2024 and 2025, the distribution decision was made badly far more often than it was made wrongly. The build itself was rarely the problem. The process around it usually was, and three patterns came up again and again.
- Teams chose for themselves. The decision was delegated to individual teams, and the company ended with three builds in production and no single vendor accountable for anything.
- The oldest version was ignored. No one checked the support window on the oldest Java release in use, which is the version that decides when the work has to be done again.
- Support was bought without scope. Procurement asked for a support contract and got one, without ever writing down which workloads the contract was supposed to cover.
Each of these is cheap to prevent at the start and expensive to unwind later. A one page standard, a version inventory and a written list of covered workloads would have avoided all three.
How far ahead should you plan a switch between OpenJDK builds?
Start at least 12 months before the published end date on the build you run today. Anyone standardized on Temurin 11 or 17, or on Microsoft's builds of those versions, is already inside that window, unless the vendor extends its date.
| Time before the end date | What to have done |
|---|---|
| 12 months | Inventory by feature release and platform complete, successor build chosen against the published windows |
| 6 months | Successor build in approved base images and provisioning templates, support contract signed if one is needed |
| 3 months | Most applications retested and redeployed, exceptions listed with named owners |
| 1 month | Old build blocked in repositories and pipelines, remaining exceptions formally accepted by the risk owner |
What to do next
- Map your versions. List your Java feature releases with the share of applications on each, and identify the oldest release you cannot move within two years.
- Map your platforms. List every target platform, including architectures, container base images, desktop operating systems and anything unusual.
- Check the windows. Compare the published support window for that oldest release across each candidate build, and record the date and source for each.
- Collect conformance evidence. Ask each candidate for a conformance statement covering the exact version and platform you will deploy, and file it with the decision record.
- Scope any support contract. Decide which workloads carry an external obligation that requires a contract, and size support to that list.
- Publish the standard. Choose one primary and one named exception build, and publish them as a specification with criteria.
- Own patch currency. Appoint a named owner and start reporting the percentage of JVMs within one quarter of the current security build.
- Wire it in. Build the standard into base images, provisioning templates and pipelines, and confirm the rollback path using the support and rollback risk analysis.
Has Oracle contacted you about Java? Talk to us before you reply. Our Oracle Java audit defense is led by former Oracle insiders and runs on a fixed fee.
Frequently asked questions
Corretto, Temurin or Zulu: which should we standardize on?
Start from the oldest Java release you cannot move. On Java 8 and 11, Corretto and Zulu publish materially longer windows than Temurin, so a company with a large legacy tail should shortlist those two. Temurin suits a cloud neutral company that upgrades versions on a disciplined cadence and has no need for a contract from the binary's publisher.
Why do vendors publish different end dates for the same Java version?
Each provider sets its own commitment to keep producing updates, and a Java release has no end date of its own. The spread is widest on Java 11. Your effective end date is whatever the vendor behind your binary has committed to, so record that date with its source and a check date in your standard.
What does TCK certified mean in practice?
One build passed the Java SE compatibility test suite for one version on one platform. The certification says nothing about performance, installers or container packaging, or whether your application works. Treat it as evidence only once the vendor ties it to the exact version, platform and artifact your pipeline deploys.
Does Adoptium sell support for Temurin?
No. Adoptium publishes the binaries and maintains a list of companies that sell support, including working group members such as Azul, Red Hat and IBM, each on its own paper. Your binary publisher and your contracted supplier are then different parties, which a regulator or auditor may ask you to explain.
How is Amazon Corretto supported commercially?
Through an AWS Support Plan, on the same basis as other AWS services, and Amazon has no Corretto specific plan. If you already pay for a plan at a meaningful tier, the support costs nothing extra. Get written confirmation of whether the plan covers Corretto on premises or in another cloud before you rely on it there.
Does the Microsoft Build of OpenJDK cover Java 8?
No. Microsoft builds long term support releases from Java 11 onward and relies on Eclipse Temurin for Java 8, including in the Java 8 container images it publishes. A company with Java 8 workloads that standardizes on Microsoft's build therefore runs two distributions from the first day, and pays for Java 8 support elsewhere if it needs any.
How quickly do these builds ship the quarterly security update?
All four publish within hours to a few days of the upstream release, so choosing between them barely changes your exposure. What matters is how long your base images, change approvals and application owners take afterwards. Measure how many running JVMs are more than one quarter behind, and report that number as a control.
How do we avoid the distribution becoming the next lock in?
Write the standard around criteria: feature releases, platforms, conformance evidence and a build availability commitment. Any build meeting them can replace another at the same feature release, so a future switch becomes a procurement decision instead of an engineering project. Keep support terms short enough to exit when a support window changes.