Using SDKMAN on Windows
What is SDKMAN?
SDKMAN is a tool to manage multiple Software Development Kits in parallel on most Unix-based systems. It includes an easy-to-use Command Line Interface (CLI) and API for installing, switching, removing, and listing Candidates. Having used it on Mac machine to develop and maintain microservices written in different versions of Java, I am amazed by the ease of switching JDKs on the fly.
SDKMAN is built for unix systems. Installing it on Windows is not impossible, but it can be quite cumbersome. There are several ways to do it and you can refer to the references section to see how others do it. Below are the steps that I find work best for my setup. If you are using an unix-based machine, you can check out the quick guide over here.
- Install Chocolatey
- Install Git for Windows
choco install git
- Install Zip
choco install git
- Install SDKMAN in a custom project folder in C drive.
export SDKMAN_DIR="/c/project/lib/sdkman" && curl -s "https://get.sdkman.io" | bash curl -s "https://get.sdkman.io" | bash
- Update current shell environment
- Install my commonly used JDK versions
sdk install java 8.0.302-open sdk install java 11.0.2-open sdk install java 17.0.1-open
- Install my commonly used Gradle versions
sdk install gradle 4.2.1 sdk install gradle 6.9.1
- Install maven
sdk install maven
- Uninstall the JDKs in old locations and remove the environment variables accordingly since we can use SDKMAN to handle the SDKs from now on.
- Change your IDEs like Intellij, VSCode to use Git Bash by default
- Change Windows Terminal to use Git Bash by default
SDKMAN supports the
use command to switch the candidate version for the current shell only. In my circumstances, the command is the least useful to me as I like things to be configured nicely once and for all.
Default Version and Auto-Switching
For example, most of my projects are written in Java 11 and only a couple of them is written in Java 8.
I would set up my environment as such:
- Set my default Java and Gradle versions:
sdk default java 11.0.12-open sdk default gradle 6.9.1
- Navigate to the config file of your SDKMAN installation. If you are following the same installation command as I did,
the location of the config file is
- Open the file and set
- Navigate to one of the projects that is using Java 8 and set up the environment using
# creates a .sdkmanrc config file in the base directory sdk env init
- In the
.sdkmanrcfile, I add the following:
# Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below java=8.0.302-open gradle=4.2.1
- Repeat for other Java 8 projects. Or you could group your projects by java versions and set the environment for multiple projects
- Whenever I navigate to my Java 8 project, I will see the SDKs switch automatically.
$ cd my-java-8-project Using java version 8.0.302-open in this shell. Using gradle version 4.2.1 in this shell.
Alternatives and Other Programming Languages
SDKMAN can cover most of your needs if you are solely working with Java, or related languages like Kotlin. Alternatively, you can also try jenv. For other programming languages, check out this awesome list of version managers.