<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Atem Nkengasong</title>
    <description>The latest articles on DEV Community by Atem Nkengasong (@nkengasong_atem).</description>
    <link>https://dev.to/nkengasong_atem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F158141%2F6d4c08a6-e37c-4641-908d-ec840aa77996.jpg</url>
      <title>DEV Community: Atem Nkengasong</title>
      <link>https://dev.to/nkengasong_atem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nkengasong_atem"/>
    <language>en</language>
    <item>
      <title>Manage multiple Java versions on Linux</title>
      <dc:creator>Atem Nkengasong</dc:creator>
      <pubDate>Thu, 11 Jun 2020 10:54:22 +0000</pubDate>
      <link>https://dev.to/nkengasong_atem/manage-multiple-java-versions-on-linux-nfc</link>
      <guid>https://dev.to/nkengasong_atem/manage-multiple-java-versions-on-linux-nfc</guid>
      <description>&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;In 2017 Oracle announced Java's (then new) six months release cadence. This was a significant change from Java’s previous cycle of one large release every two to three years. With more releases, Java is providing developers with more innovations and making the platform even more attractive. This also means that it is more complicated to manage the different versions if you want to keep up with the new features or if your different projects require different versions. In this blog post, we'll see how to manage multiple Java versions on &lt;code&gt;Linux&lt;/code&gt; using &lt;a href="https://www.jenv.be/"&gt;&lt;strong&gt;jEnv&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is jEnv ?
&lt;/h2&gt;

&lt;p&gt;jEnv is a command line tool that helps to manage several Java installations. This way developers can hopefully forget how to set the JAVA_HOME environment variable. With jEnv you can setup local Java installations on &lt;code&gt;global&lt;/code&gt;, &lt;code&gt;directory&lt;/code&gt; and even &lt;code&gt;shell level&lt;/code&gt;. This is possible because jEnv stores the local Java version in a &lt;code&gt;.java-version&lt;/code&gt; file and depending on the context, will simply direct to the corresponding installation file.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Installation
&lt;/h2&gt;

&lt;p&gt;We will start by installing some JDK versions so that we have versions to manage. We will also need &lt;a href="https://git-scm.com/"&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/a&gt; to be able to install jEnv. &lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;Java SE 8&lt;/code&gt; and &lt;code&gt;Java SE 11&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-8-jdk &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-11-jdk 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Install &lt;code&gt;Git&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To install &lt;code&gt;jEnv&lt;/code&gt; we start by cloning its git repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git clone https://github.com/gcuisinier/jenv.git ~/.jenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next we add it to our &lt;code&gt;Bash Shell&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.jenv/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bash_profile
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(jenv init -)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bash_profile
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .bash_profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If the above commands do not work for you don't worry, just use &lt;code&gt;.bashrc&lt;/code&gt; instead&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.jenv/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(jenv init -)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; .bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The first command above adds jEnv to your &lt;code&gt;PATH&lt;/code&gt; so that its binaries can be found. The second simply initializes jEnv once your shell loads and &lt;code&gt;source&lt;/code&gt; is a bash shell built-in command that executes the content of the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Usage
&lt;/h2&gt;

&lt;p&gt;If you run &lt;code&gt;jenv&lt;/code&gt; you should get the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv
&lt;span class="go"&gt; jenv 0.5.2-28-g3f3e517
&lt;/span&gt;&lt;span class="gp"&gt; Usage: jenv &amp;lt;command&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;args&amp;gt;]
&lt;span class="go"&gt;
 Some useful jenv commands are:
    commands    List all available jenv commands
    local       Set or show the local application-specific Java version
    global      Set or show the global Java version
    shell       Set or show the shell-specific Java version
    rehash      Rehash jenv shims (run this after installing executables)
    version     Show the current Java version and its origin
    versions    List all Java versions available to jenv
    which       Display the full path to an executable
    whence      List all Java versions that contain the given executable
    add         Add JDK into jenv. A alias name will be generated by parsing "java -version"

&lt;/span&gt;&lt;span class="gp"&gt; See `jenv help &amp;lt;command&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;' for information on a specific command.
&lt;/span&gt;&lt;span class="go"&gt; For full documentation, see: https://github.com/jenv/jenv/blob/master/README.md
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now let's add the different JDK versions we installed to our command line tool&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv add /usr/lib/jvm/java-1.8.0-openjdk-amd64    
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv add /usr/lib/jvm/java-11-openjdk-amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To see which versions our tool can manage, execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv versions
&lt;span class="go"&gt; system
 11
 11.0
 11.0.4
*1.8 (set by /home/nkengasong/.jenv/version)
 1.8.0.222
 openjdk64-11.0.4
 openjdk64-1.8.0.222
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Hopefully you can see something similar too. Also notice the different 11s and 1.8.0s, they are just aliases referring to the same version - so you actually have two versions being managed.&lt;/p&gt;

&lt;p&gt;Now you can specify which version you want to use. For example, if you want to use Java 11 globally use the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv global 11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can work on a JDK 8 project, without changing your global version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-jdk-8-project
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-jdk-8-project
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv &lt;span class="nb"&gt;local &lt;/span&gt;1.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you check the Java version in your &lt;code&gt;my-jdk-8-project&lt;/code&gt; directory you will obtain the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;span class="go"&gt; openjdk version "1.8.0_222"
 OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
 OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Finally we have to set the &lt;code&gt;$JAVA_HOME&lt;/code&gt; because jEnv won't do that for us unfortunately. This is very important given that several tools like IDEs depend on this variable. To do so, we enable the export plugin as follows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv enable-plugin &lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We can now verify that the &lt;code&gt;$JAVA_HOME&lt;/code&gt; variable is set to the global Java version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;
&lt;span class="go"&gt; /home/nkengasong/.jenv/versions/1.8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can also enable other plugins like the maven and gradle plugins&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv enable-plugin maven
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jenv enable-plugin gradle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Conclusion
&lt;/h2&gt;

&lt;p&gt;In this blog post, we saw how to manage multiple Java versions on Linux using jEnv - a command line tool to help you forget how to set the JAVA_HOME environment variable.&lt;/p&gt;

</description>
      <category>java</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
