A command-line tool for installing and managing OpenJDK distributions.
Project description
jdkman
A command-line tool for installing and managing JVM distributions, and switching Java environments.
Why jdkman?
JDK Management — Simple by Design
How often do you actually need to pick between 21.0.3 and 21.0.5?
Probably never. "The latest Zulu 21" is almost always good enough.
jdkman manages JDKs at exactly that level — no more, no less.
jdk install zulu-21— just pick a vendor and a major versionjdk upgrade zulu-21— updates to the latest patch automatically- One installation per vendor + major version, always
No scrolling through minor version lists. No patch versions piling up.
On macOS, JDKs are installed under ~/Library/Java/JavaVirtualMachines/ — the standard
path where Gradle, IntelliJ, and most other tools automatically look for JDKs.
No extra configuration needed.
Per-Project Java Environment Switching — Like jenv, But Integrated
Beyond managing installations, jdkman also handles per-project Java environment switching, just like jenv.
- Set a Java version per directory with
jdk use zulu-21 - A
.java-versionfile is created in the current directory — fully compatible with jenv JAVA_HOMEis automatically switched as youcdbetween projects- Falls back to a global setting when no local
.java-versionis found - Create short aliases like
jdk alias 21 zulu-21for convenience
Since jdkman uses the same .java-version file format as jenv, you can adopt jdkman
in a team that already uses jenv — both tools will pick up the same file.
Installation
Homebrew (recommended):
brew install xunyss/tap/jdkman
pip:
pip install jdkman
Quick Start
# Browse available JDK distributions
jdk remote
# Install a distribution
jdk install zulu-21
# List installed distributions
jdk list
# Check for outdated installations
jdk outdated
Shell Integration (Auto Environment Switching)
To enable automatic JAVA_HOME switching when you change directories, add the following
to your shell configuration file.
zsh (~/.zshrc):
eval "$(jdk activate zsh)"
bash (~/.bashrc or ~/.bash_profile):
eval "$(jdk activate bash)"
fish (~/.config/fish/config.fish):
jdk activate fish | source
Once activated, jdkman reads the .java-version file in your current directory (or any
parent directory) and sets JAVA_HOME automatically. If no local file is found, it falls
back to the global setting configured with jdk use --global.
Commands
Management
jdk remote [DISTRO]
Browse JDK distributions available for download.
By default, shows only stable JDK builds. Use flags to include additional build types.
jdk remote # List all stable JDK builds
jdk remote zulu # Filter by vendor prefix
jdk remote --version 21 # Filter by major version
jdk remote --all # Include JRE and feature builds
jdk remote --with-jre # Include JRE builds
jdk remote --with-feat # Include feature builds (e.g. JavaFX, CRaC)
jdk remote --all zulu # Combined: all build types, zulu only
Options:
| Option | Short | Description |
|---|---|---|
--version |
-v |
Filter by major version number |
--all |
-a |
Include all build types |
--with-jre |
-R |
Include JRE builds |
--with-feat |
-F |
Include feature builds |
jdk install <DISTRO>
Download and install a JDK distribution.
jdk install zulu-21
jdk install temurin-17
jdk install zulu-jre-21 # JRE variant
jdk install zulu-javafx-21 # With JavaFX
jdk install zulu-crac-21 # With CRaC
jdk install zulu-javafx-jre-21 # JRE + JavaFX
The DISTRO name follows this pattern:
{vendor}[-{feature}][-jre]-{major_version}
Use jdk remote to find the exact distribution name.
jdk list
Show all installed JDK distributions managed by jdkman.
jdk list
jdk ls # alias
jdk uninstall <DISTRO>
Remove an installed JDK distribution.
jdk uninstall zulu-21
jdk rm zulu-21 # alias
jdk upgrade <DISTRO>
Upgrade an installed distribution to the latest patch version.
jdk upgrade zulu-21
jdk upd zulu-21 # alias
jdk outdated
List installed distributions that have newer versions available.
jdk outdated
jdk vendors
List all available JDK vendors.
jdk vendors
jdk vd # alias
jdk editions
List all available JDK editions (vendor + feature combinations).
jdk editions
jdk ed # alias
Environment
jdk use <DISTRO|ALIAS>
Set the Java environment for the current directory.
Creates a .java-version file in the current directory.
jdk use zulu-21 # Set local (current directory)
jdk use 21 # Use an alias
jdk use zulu-21 --global # Set global fallback (~/.config/jdkman/.java-version)
The .java-version file format is compatible with jenv.
jdk unuse
Clear the Java environment for the current directory or globally.
jdk unuse # Remove local .java-version
jdk unuse --global # Clear global setting
jdk env
Show the currently active Java environment and where it comes from.
jdk env
Displays the active distribution, version, scope (local/global), and the source .java-version file path.
jdk alias <ALIAS> <DISTRO>
Create a short alias for an installed distribution.
jdk alias 21 zulu-21 # Use "21" instead of "zulu-21"
jdk alias lts temurin-21
jdk unalias <ALIAS>
Remove an alias.
jdk unalias 21
jdk aliases
List all defined aliases and their status.
jdk aliases
jdk activate <SHELL>
Print the shell integration script that enables auto-switching.
eval "$(jdk activate zsh)" # Add to ~/.zshrc
eval "$(jdk activate bash)" # Add to ~/.bashrc
jdk activate fish | source # Add to ~/.config/fish/config.fish
jdk deactivate <SHELL>
Remove the shell integration (auto-switching).
jdk deactivate zsh
jdk deactivate bash
jdk deactivate fish
Tools
jdk cleanup
Remove cached data (downloaded archives and catalog cache).
jdk cleanup
jdk clean # alias
jdk clear # alias
jdk home (macOS only)
Show Java home paths for JVMs registered with the system.
jdk home # List registered Java installations
jdk home --json # Show detailed info in JSON format
jdk mise [DISTRO]
List or register JVM distributions as mise java tools.
jdk mise # List current mise java tools
jdk mise zulu-21 # Register a distribution as a mise java tool
About
jdk version
Show the jdkman version.
jdk version
jdk --version
jdk -v
How Per-Project Switching Works
- Add
eval "$(jdk activate zsh)"(or bash, orjdk activate fish | sourcefor fish) to your shell config. - Run
jdk use zulu-21in a project directory — this creates a.java-versionfile. - Every time you
cdinto that directory (or any subdirectory), jdkman reads the nearest.java-versionupward and setsJAVA_HOMEautomatically. - When you leave the directory, the global setting (or none) takes effect.
~/projects/
├── service-a/
│ └── .java-version → "zulu-21" → JAVA_HOME = zulu-21 path
└── legacy-app/
└── .java-version → "temurin-17" → JAVA_HOME = temurin-17 path
The .java-version file is a plain text file containing the distribution slug or alias.
Because it uses the same format as jenv, teams can mix jdkman and jenv users without conflict.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jdkman-0.3.7.tar.gz.
File metadata
- Download URL: jdkman-0.3.7.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
062b7ea8793dcf91e4d6c505e347e95ff96a2dcde7f3036143c1a3282cb9882e
|
|
| MD5 |
f2b542fb614e5c4851a4d978bda02816
|
|
| BLAKE2b-256 |
da9e85c32878f343a0d9921ab68f241f25847f49a9c1727c099c1467b20b27c3
|
File details
Details for the file jdkman-0.3.7-py3-none-any.whl.
File metadata
- Download URL: jdkman-0.3.7-py3-none-any.whl
- Upload date:
- Size: 40.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
637632f891cb23c087cd042809cac98b5e3a4f011293c3f7eaa08baecf3c9e9a
|
|
| MD5 |
092065351ebe3b823127d95c71a9abce
|
|
| BLAKE2b-256 |
bb23841de023b15a04bdda02894a99bc4f82d0a0807d48719809233d4ad72bbc
|