/ VERSION, JENV

Java environment management

Despite what a lot of conference talks might lead you to think, far from every Java developer uses Docker on a daily basis, if at all. However, chances are high they work with a couple of different Java versions. This can be for different reasons:

  • to check for version compatibility on the same app e.g. 7 vs 8
  • to check for provider compatibility on the same app e.g. OpenJDK vs Oracle
  • because different apps currently under development (or maintenance) require different Java versions
  • because you want to play with the latest JDK version, but are stuck with Java 1.7 at work

To handle that requirement, the easy approach is to set the JAVA_HOME environment variable when necessary, e.g.:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home

That works. But you have to remember the path to the required Java version every time you need to change. If there’s no such need, you must at least do it every time you open a new shell. Given the current faster release cycle of Java versions, the number of concurrent Java versions one is using is bound to increase even more in the next few years.

Other languages face the same issue. One of them is Ruby. To handle that, there’s a tool called rbenv. Wouldn’t it be nice if there was such a tool for Java? Well, there is.

jenv is exactly what you need if you need using different Java versions on the same machine.

Install it
brew install jenv
It can alternatively be installed via git clone. In that case, you should also manually update your system to point the PATH to the executable.
Register a JDK
jenv add /Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home

The output is something like:

oracle64-9.0.4 added
9.0.4 added
9.0 added

This is the only time when you’ll need to remember the path!

List available JDKs
jenv versions

The output might be akin to (depending on the current state of your system):

* system
  1.8
  1.8.0.92 (set by /usr/local/var/jenv/version)
  9.0
  9.0.4
  oracle64-1.8.0.92
  oracle64-9.0.4
The * points to the version in use in the current folder
Set the default JDK
jenv global 1.8
Override the JDK in use for the current folder
jenv local 9.0

This doesn’t stop here, though. Easier Java version handling is not useful, if it doesn’t integrate with tools used daily, such as Maven. jenv offers integration with those tools through plugins. For example, to force mvn to use the version defined through jenv:

jenv enable-plugin maven

Plugins are available for Ant, Groovy, Spring Boot, and even SBT (and some more)!

Conclusion

If you need to juggle through different Java versions, jenv is perhaps not a life-saver but for sure a time-saver.

Nicolas Fränkel

Nicolas Fränkel

Nicolas Fränkel is a technologist focusing on cloud-native technologies, DevOps, CI/CD pipelines, and system observability. His focus revolves around creating technical content, delivering talks, and engaging with developer communities to promote the adoption of modern software practices. With a strong background in software, he has worked extensively with the JVM, applying his expertise across various industries. In addition to his technical work, he is the author of several books and regularly shares insights through his blog and open-source contributions.

Read More
Java environment management
Share this