What each field means

An Eliya 25.0.4 first GA reports:

$ java -version
openjdk version "25.0.4" 2026-08-04
OpenJDK Runtime Environment Eliya-25.0.4 (build 25.0.4+7-r1)
OpenJDK 64-Bit Server VM Eliya-25.0.4 (build 25.0.4+7-r1, mixed mode, sharing)

The canonical Eliya version is 25.0.4+7-r1. It composes four pieces:

FieldValueMeaning
$VNUM 25.0.4 JEP 322 dotted version: the upstream OpenJDK quarterly CPU identifier.
$BUILD +7 Upstream OpenJDK's GA promoted-build number. Read once per quarterly cycle from openjdk/jdk25u tags; the integer N such that jdk-25.0.4+N and jdk-25.0.4-ga point at the same commit. Identifies the upstream source base Eliya patched and rebuilt.
$OPT r1 Eliya's revision ordinal within this $VNUM. Increments 1, 2, 3, … per Eliya-promoted build (the first GA, then each respin if any). Resets to 1 when $VNUM advances at the next CPU.
vendor.version (the banner prefix) Eliya-25.0.4 Brand identification. Stays byte-identical across respins of the same $VNUM; per-build identity is in the (build …) portion above.

A respin (r2, r3, …) keeps the upstream +7 and advances the r counter:

OpenJDK Runtime Environment Eliya-25.0.4 (build 25.0.4+7-r2)

The dedicated brand-identity system properties (java.vendor = Asymm Systems; java.vendor.version = Eliya-25.0.4) and the release file ($JAVA_HOME/release) carry the same information in structured fields for machines that parse it; the version string is for humans.

Four pin patterns

Pins divide into two layers. Machine-grade pins are cryptographic and byte-exact, and build tools, signature verifiers, and container runtimes consume them. Human-grade pins are the ones a person can read off a banner and type into a Dockerfile or a support ticket. The two are not interchangeable, and each audience reaches for the one it can actually use.

Four patterns cover how operators pin Eliya, two mutable (the tag moves under you) and two immutable (the bits never change once pinned). Pick by how much you want the deployment to follow the published cadence versus stay byte-frozen until you advance it yourself.

Pattern 1: LTS-track moving tag (mutable)

:25-lts advances on every quarterly CPU and every out-of-cycle CVE respin. With imagePullPolicy: Always in Kubernetes (or equivalent), each pod restart picks up the latest published build. Best for teams that trust the published cadence and want automatic uptake of every build without operator action.

docker pull ghcr.io/asymmsystems/eliya-jdk:25-lts

Pattern 2: CPU-track moving tag (mutable within a CPU window)

:25.0.4 stays on the 25.0.4 quarterly window; it advances only when a respin (out-of-cycle CVE rebuild) lands within that window, never to the next CPU. You explicitly bump the tag string at each quarterly CPU (:25.0.4:25.0.5). Best for environments that require change-management sign-off per quarter but want respins inside the quarter picked up automatically.

docker pull ghcr.io/asymmsystems/eliya-jdk:25.0.4

Pattern 3: Per-build immutable handle (immutable, 25.0.4 onwards)

From 25.0.4, every Eliya build carries a revision ordinal r<N>: the first build of 25.0.4 is r1, the first respin is r2, and so on. The Docker tag :25.0.4-r1 and the archive filename eliya-jdk-25.0.4+7-r1-linux-x64.tar.gz (where +7 is upstream OpenJDK's GA promoted-build coordinate) point at one specific build and never advance. Best for change-management sign-off per build, reproducible CI pipelines, and any environment where "the exact same build" matters but a SHA digest is too unwieldy to type or remember.

docker pull ghcr.io/asymmsystems/eliya-jdk:25.0.4-r1
curl -LO https://github.com/asymmsystems/eliya-jdk/releases/download/eliya-jdk-25.0.4+7-r1/eliya-jdk-25.0.4+7-r1-linux-x64.tar.gz

Pattern 4: Cryptographic content pin (immutable, byte-exact)

The only pin that cryptographically guarantees byte-identical bits. For containers, the OCI image digest @sha256:<digest>; for archives, the SHA-256 from the signed SHA256SUMS.txt.asc on each GitHub Release. Required by compliance buyers and supply-chain auditors; recommended for any regulated environment. See verify your download for the SHA-256 + GPG ceremony.

docker pull ghcr.io/asymmsystems/eliya-jdk@sha256:<digest>
sha256sum -c SHA256SUMS.txt && gpg --verify SHA256SUMS.txt.asc

Summary table

The four patterns at a glance, with the operational scenario each fits:

PatternMutabilityScenarioExample
Pattern 1: LTS-track moving tag mutable (every CPU + respin) Automatic uptake of every published build :25-lts
Pattern 2: CPU-track moving tag mutable within CPU window (respins only) Per-quarter change-management sign-off, respins automatic :25.0.4
Pattern 3: Per-build immutable handle immutable Per-build sign-off; reproducible CI; recognisable handle :25.0.4-r1
Pattern 4: Cryptographic content pin immutable, byte-exact Compliance buyers, supply-chain auditors, regulated environments @sha256:<digest>

A common operational practice layered on top: stay on a specific version indefinitely (e.g., remain on :25.0.4-r1 beyond the next quarterly CPU), applying only respins for actively-exploited CVEs. That's Pattern 3 or Pattern 4 with deferred quarterly bumps, not a separate pin mechanism.

Which pin matches which audit framework?

Most compliance frameworks (PCI DSS, HIPAA, SOX, FedRAMP, EU CRA) call for signed artefacts plus SBOMs plus vendor attestation. The SHA-256 + GPG chain is what they ask for; the human-readable handles are operational ergonomics on top of that. If you only record one identifier in your audit trail, record the SHA-256 of the bytes you installed. Everything else is supporting context.

Where each piece of identity lives

The version string carries per-build technical identity. Brand identity lives in dedicated OpenJDK fields. Cryptographic identity lives in the signed checksums file and the OCI manifest. Each surface has the field it actually uses.

In the version string (banner / JAVA_RUNTIME_VERSION)

  • $VNUM (25.0.4): JDK version
  • Upstream $BUILD (+7): source-base coordinate
  • Eliya revision (r1): per-build identity in $OPT

In dedicated brand-identity fields

  • java.vendor = Asymm Systems
  • java.vendor.version = Eliya-25.0.4
  • release file IMPLEMENTOR = Asymm Systems
  • release file IMPLEMENTOR_VERSION = r1

In machine-grade pin channels (not in the version string)

  • Artefact SHA-256: signed SHA256SUMS.txt.asc on each GitHub Release
  • Docker image digest: OCI manifest, addressable via @sha256:
  • Mirror commit SHA, upstream tag, upstream promoted-build number: release file (SOURCE, ELIYA_MIRROR_COMMIT, ELIYA_UPSTREAM_TAG, ELIYA_UPSTREAM_BUILD)

Four exceptions to the canonical form

The canonical Eliya version 25.0.4+7-r1 renders verbatim in most surfaces. Four exceptions exist, each forced by an external standard. Listed for completeness; you do not need to memorise them unless you write tooling that parses Eliya identifiers across package formats.

ExceptionSurfaceDeviationForced by
RPM RPM filename + internal Version: / Release: Drops +7. Filename eliya-jdk-25.0.4-r1.x86_64.rpm; metadata Version: 25.0.4 / Release: r1. RPM Version charset [A-Za-z0-9.] excludes +
Docker tag Per-build immutable + per-arch shadow Drops +7. :25.0.4-r1, :25.0.4-r1-amd64, :25.0.4-r1-arm64. OCI tag charset [A-Za-z0-9_][A-Za-z0-9_.-]* excludes +
SDKMAN ID Vendor identifier Strips +7 and r1. 25.0.4-eliya. SDKMAN cross-vendor convention ${VERSION}-${vendor-tag}
DEB filename Filename field separators Uses _ as field separator. eliya-jdk_25.0.4+7-r1_amd64.deb. DEB internal Version: field is canonical (25.0.4+7-r1); + is legal in DEB upstream_version per Debian Policy §5.6.12. Debian filename convention <name>_<version>_<arch>.deb

The 25.0.3 historical note

Eliya 25.0.3 (published 2026-06-10) shipped with java.runtime.version = 25.0.3+24-Eliya. The +24 is the count of commits on the Eliya source mirror since the upstream jdk-25.0.3-ga tag, a per-commit quantity, not a per-promoted-build counter. This is a JEP 322 grammar-valid string but a non-canonical derivation: a reader of the spec would expect +24 to indicate 24 promoted builds, when it actually indicates 24 commits past upstream GA.

The 25.0.3 release stays frozen as published. The scheme described on this page is effective from 25.0.4 onward. The SECURITY.md documents both schemes; the SHA-256 + GPG verification chain is unchanged across the transition.

The cryptographic pin is the only authoritative pin

Anything in the version string is a human-readable identity readout, useful for recognition, navigation, and audit annotation. The cryptographic chain (SHA-256 of the archive byte-matched against the signed SHA256SUMS.txt.asc, plus the GPG signature verified against the cross-channel-confirmed key fingerprint) is the only authoritative authenticity claim Eliya makes. No string in java -version adds anti-forgery guarantees the cryptographic chain does not already provide.

See verify your download for the full verification ceremony.

[ } Eliya Eliya Dial Dial
Privacy
[ }
[ }
// PRODUCTS Eliya Eliya Dial Dial