ScriptsMay 13, 2026·3 min read

SDKMAN — Software Development Kit Manager for the JVM

SDKMAN is a tool for managing parallel versions of multiple Software Development Kits on Unix-based systems. It provides a convenient CLI to install, switch, remove, and list candidates such as Java, Kotlin, Gradle, Maven, and dozens of other JVM-related tools.

Introduction

SDKMAN (formerly GVM) simplifies managing multiple JVM ecosystem tools. Java developers often need to switch between JDK versions for different projects or test against multiple distributions (Temurin, GraalVM, Corretto, Zulu). SDKMAN handles this with a single command, managing downloads, symlinks, and PATH configuration automatically.

What SDKMAN Does

  • Installs and manages multiple versions of JDKs from various vendors (Temurin, GraalVM, Amazon Corretto, and more)
  • Switches between installed SDK versions globally or per-shell session
  • Manages build tools and languages including Gradle, Maven, Kotlin, Groovy, Scala, and Spring Boot CLI
  • Provides a .sdkmanrc file for project-level SDK version pinning
  • Supports offline mode using previously cached installations

Architecture Overview

SDKMAN is implemented as a set of Bash scripts installed into ~/.sdkman. It maintains a candidates directory where each SDK version is stored in its own folder. A current symlink points to the active version, and SDKMAN prepends these paths to your shell PATH. Version metadata and download URLs are fetched from the SDKMAN API at api.sdkman.io. The .sdkmanrc file in a project root triggers automatic version switching via a shell hook when you cd into the directory.

Self-Hosting & Configuration

  • Install with a single curl command; requires bash, curl, and zip
  • Works on Linux, macOS, Windows (via WSL, Cygwin, or Git Bash)
  • Configure auto-answer and auto-selfupdate in ~/.sdkman/etc/config
  • Use .sdkmanrc files in project roots to pin SDK versions for team consistency
  • Run sdk env init to generate a .sdkmanrc from your current active versions

Key Features

  • Supports dozens of JVM ecosystem candidates from multiple vendors
  • Per-project version pinning with .sdkmanrc and automatic switching
  • Vendor-neutral Java distribution management in one place
  • Tab completion for candidate names, versions, and commands
  • Self-updating with sdk selfupdate to stay on the latest release

Comparison with Similar Tools

  • asdf — plugin-based multi-language version manager; SDKMAN specializes in JVM tools with better JDK vendor coverage
  • mise (rtx) — modern polyglot version manager; strong for general use but fewer JVM distribution choices
  • jabba — Go-based JDK manager; simpler but supports fewer SDKs beyond Java
  • jEnv — manages JAVA_HOME for pre-installed JDKs but does not download or install them
  • Nix — reproducible package management but more complex setup for quick JDK switching

FAQ

Q: Does SDKMAN work on Windows? A: SDKMAN runs on Windows through WSL, Git Bash, or Cygwin. Native Windows support is not available.

Q: Can I use SDKMAN in CI pipelines? A: Yes. Install it in your CI script and use sdk install with a specific version. The auto-answer config avoids interactive prompts.

Q: How do I switch between JDK vendors? A: Run sdk list java to see all available distributions and versions, then sdk install java - to install the one you need.

Q: Does .sdkmanrc support multiple SDKs? A: Yes. The file can specify versions for java, gradle, maven, kotlin, and any other SDKMAN candidate, one per line.

Sources

Discussion

Sign in to join the discussion.
No comments yet. Be the first to share your thoughts.

Related Assets