Skip to main content

Trying Scala Script - Script to Create a Symbolic Link to JDK on Mac OS X

· 4 min read

I used to use Ubuntu Linux most of the time, yet I'm using Mac OS X more these days. I'm quite satisfied with it, but there's one thing inconvenient. That's installing JDK. On Ubuntu, installing Java 8 (technically what I want to install is JDK 8 but since Java has really terrible versioning history, I'll just call it Java 8) is not supported by Canonical, but it can be done easily by the PPA provided by Web Upd8 (Thanks Web Upd8).

On OS X, as we all know, PPA-like solution is Homebrew (hereinafter referred to as 'brew'). I use brew to install Scala and SBT but there's no brew formula for Java. So I need to download the JDK from Oracle's Java website and install it manually or there is a brew-friendly alternative that is 'Homebrew Cask'.

So I can simply do

$ brew install caskroom/cask/brew-cask 
$ brew cask install java

There is still an issue though. Whenever a new version of JDK is installed, JAVA_HOME changes. Thus I need to change the location of JDK set in my IDE which is IntelliJ IDEA in my case. This is so annoying. The reason for using brew is to make things automated, yet in terms of JDK installation, it's still so cumbersome. I partially solved it by creating a symbolic link to the JDK so that I don't need to change the location set in IDEA when a new version of JDK is installed. Although it got rid of unnecessary JDK setup in IDEA, I do still need to change the link to the JDK. Still annoying. So I was thinking about writing a shell script to create a symbolic link to the JDK. Then, all of a sudden, I came up with writing Scala script. I can do it using Scala as a script language. I can simply add #!/usr/bin/env scala to the beginning of the shell script file which actually contains Scala code. Or installing scalas using Conscript might be another more powerful way as it gives me a way to use sbt in the script file (This case, #!/usr/bin/env scalas should be used instead of #!/usr/bin/env scala). I ended up using #!/usr/bin/env scala to avoid any extra installation.

It might be easier and better if some changes are made on brew cask Java formula to create the link. However, I've been working as a Scala developer for about three/four months so wanted to try Scala as a script language. Besides, I'm not a Ruby programmer. 🙂 So here is the code.

See it on GitHub Gist

Click here to get the instructions to use it. <<==

I could have done a few things here using just Scala. For example, getting the list of directories, removing folder and so on. Yet, instead, I used ProcessBuilder as I wanted to use Scala to run OS processes. Just to try something I don't usually do although I've done it before in Java in order to manipulate images using ImageMagick and to render HTML info PDF using wkhtmltopdf.

When running it, a result would be like this. (For more details, Click here!)

$ ln-s-jdk 8 

Version(s) found:

[0] jdk1.8.0_40.jdk
[1] jdk1.8.0_31.jdk
[2] jdk1.8.0_25.jdk
[c] Cancel

Please enter a number on the list: 0

You chose 'jdk1.8.0_40.jdk'.
It will create a symbolic link to 'jdk1.8.0_40.jdk' (i.e. jdk8 -> jdk1.8.0_40.jdk) and may ask you to enter your password.
Would you like to proceed? (Yes / No) or (Y / N) y

/Library/Java/JavaVirtualMachines/jdk8: It is found so will be removed and recreated.

/Library/Java/JavaVirtualMachines $ sudo rm jdk8
/Library/Java/JavaVirtualMachines $ sudo ln -s jdk1.8.0_40.jdk jdk8
Password:

Done!

# Before
--------------------------------------
total 16
drwxr-xr-x 3 root wheel 102 5 Nov 20:18 jdk1.7.0_71.jdk
drwxr-xr-x 2 root wheel 68 3 Apr 22:20 jdk1.8.0_25.jdk
drwxr-xr-x 2 root wheel 68 3 Apr 22:37 jdk1.8.0_31.jdk
drwxr-xr-x 3 root wheel 102 7 Mar 01:30 jdk1.8.0_40.jdk
lrwxr-xr-x 1 root wheel 15 3 Apr 18:08 jdk7 -> jdk1.7.0_71.jdk
lrwxr-xr-x 1 root wheel 15 3 Apr 22:38 jdk8 -> jdk1.8.0_31.jdk

======================================

# After
--------------------------------------
total 16
drwxr-xr-x 3 root wheel 102 5 Nov 20:18 jdk1.7.0_71.jdk
drwxr-xr-x 2 root wheel 68 3 Apr 22:20 jdk1.8.0_25.jdk
drwxr-xr-x 2 root wheel 68 3 Apr 22:37 jdk1.8.0_31.jdk
drwxr-xr-x 3 root wheel 102 7 Mar 01:30 jdk1.8.0_40.jdk
lrwxr-xr-x 1 root wheel 15 3 Apr 18:08 jdk7 -> jdk1.7.0_71.jdk
lrwxr-xr-x 1 root wheel 15 3 Apr 22:44 jdk8 -> jdk1.8.0_40.jdk

======================================