website/blog/2026-07-23_proto-v0.59.mdx
In this release, we're shipping one of our most requested tools to date, Java, alongside a ground-up rewrite of our version parsing layer that makes it possible.
<!--truncate-->Java has been requested since proto's early days, but between the sheer number of vendors,
distributions, and packaging formats, it was never a simple plugin to write. Until now, the closest
workaround was the asdf backend, which doesn't work on Windows. That changes today, as proto now
ships with a built-in Java plugin, powered by the foojay.io Disco API!
The plugin is available through 3 tool identifiers: java or jdk for the full development kit,
and jre for the slimmer runtime-only package.
$ proto install java
$ proto install jre 21
On top of installing Java itself (with shims for java, javac, and jar), the plugin will
detect versions from .java-version and .sdkmanrc files (easing migration from other version
managers), and will export JAVA_HOME for
activated shells.
Java isn't a single tool with a single publisher — it's an ecosystem of vendors, each shipping
their own builds. By default, the plugin installs the openjdk distribution (Oracle OpenJDK
builds), but you can choose another by prefixing the version with a scope:
jdk = "temurin-21"
Over 30 distributions are supported through the Disco API, including Temurin, Zulu, Corretto,
Liberica, GraalVM, Microsoft, SapMachine, Semeru, Kona, Dragonwell, and more. Common
SDKMAN! shorthands (tem, amzn, librca, etc) are also accepted, both in
version specifications and in .sdkmanrc files.
And lastly, if you need early access builds instead of general availability, or want to route through a self-hosted Disco API, the plugin supports both:
[tools.java]
api-url = "https://custom-foojay.hosted.com/disco/v3.0"
release-type = "ea"
Since its inception, proto has parsed versions with the semver
crate, wrapped in layers of regex and string munging to squeeze in everything that crate wasn't
designed for — calendar versions, partial versions, and tool-specific quirks. This approach has
been a constant source of edge cases, so in this release, we threw it all away and wrote a custom
grammar-based parser designed for how proto actually consumes versions.
What does this unlock? For starters, first-class
version scopes: a named prefix attached to a version or
requirement, such as openjdk-21.0.2, zulu-26, or pypy-2.1. Scopes are what power
Java distributions above, are passed through the WASM plugin API for any plugin to consume, and
remote version lists are now cached per scope.
Beyond scopes, the new parser brings consistency to both versioning schemes:
+123), leading v prefixes, and
requirements and ranges (^, ~, comparison
operators, wildcards, &&, ||).24.12
are always treated as semantic versions.semver errors.We introduced OpenTelemetry support in the last release, with traces, metrics, and logs exported over gRPC. In this release, we've expanded the implementation:
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.OTEL_SERVICE_NAME, OTEL_*_EXPORTER,
OTEL_EXPORTER_OTLP_*_PROTOCOL, and OTEL_EXPORTER_OTLP_*_ENDPOINT environment variables
(including their signal-specific variants).If your environment already configures OTEL exporters through these variables, proto will now respect them out of the box.
PATH handling in shimsThis release fixes two long-standing PATH issues in proto run and shim executions:
npm run scripts that execute
npm would resolve node's bundled npm, instead of the npm version managed by proto. The tool
being ran now takes precedence.PATH, proto could recursively execute forever if
that executable was itself a proto shim from another store (typically caused by HOME or
PROTO_HOME changing, or symlinked paths). We now skip shims from foreign stores during the
lookup, and detect and error on the loop instead of hanging.As part of the new parser, the proto-specific "micro" build segment (dot or underscore separated) has been removed from calendar versions. Use standard build metadata instead.
2024-02-26.123 -> 2024-02-26+123
2024-02-26_123-alpha.0 -> 2024-02-26-alpha.0+123
View the official release for a full list of changes.
bzip2, xz, and z codec support for self-compressed binaries (not packed with tar or
zip), as well as .tar.Z (LZW) archive support.proto clean would not recursively clean certain directories.