Sunday, October 4, 2015

#webdev - OS X El Capitan and Java

OS X El Capitan and Java: No Fun (till now!)

There's been a bunch of stuff on the interwebs lately about El Capitan and Java issues... here's the simple simple, condensed version of the fix:

Quick prereq to the post:

I have, for some time, had the following line in ~/.bash_profile under my login on my machine:
export JAVA_HOME=/Library/Java/Home
I see it this way... /System/Library/Frameworks/JavaVM.framework/ relies on a set of symlinks that, in turn, rely on /Library/Java/Home being another symlink that points to the Home directory of an installed JVM. Changing the /Library/Java/Home symlink ensures that all of that other machinery (legacy or otherwise) continues to work correctly.

At the very least with this setup typing "java -version" at the command line gives me the version I'm looking for. And swapping symlinks to point to real disk locations is fairly easy... it makes it MUCH easier to change JVM versions. Just repoint the symlink to
and Bob's your uncle... it's done. And no other changes necessary.

So I selected to base this all on /Library/Java/Home being The Correct Location For The Current JVM.

As I said... the above line is in a file called .bash_profile under /Users/{username}. If you have to create it be sure that afterward you open terminal and run
cd ~
chmod u+x .bash_profile
and then restart terminal. That will ensure that JAVA_HOME is always set when you hit Terminal. This makes many things lots easier, but most of all, since most Java packages will check for JAVA_HOME and only go looking for a JVM if not set, it gives you control over the Java version being used to run whatever it is you are trying to run.


That's why I chose to set JAVA_HOME to /Library/Java/Home and proceed as I have.

Download and install Legacy Java 6SE from Apple:

Download and install Java 8 JDK from Oracle:

Change a system symlink to make the Java 8 JVM the command line default:

cd `echo $JAVA_HOME`
sudo rm Home
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home

Once done, test with the following command on the command line:

java -version
If you've done the above correctly your Java apps will launch and your command-line tools (oh, like launching Tomcat) will automatically use the latest JVM.

OH, also... once you've installed the Java 8 JDK you may have to do two other things:

Edit the Java JDK PLIST 

Edit the file at /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Info.plist to be:

Add a symlink to point to libserver.dylib

It seems the Oracle installer doesn't create a necessary symlink for the JDK, so you'll need to copy/paste the following commands (there's 2 of them, btw):
sudo mkdir -p /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bundle/Libraries
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bundle/Libraries/libserver.dylib

Give thanks to Oliver from Australia!

Dude is my hero and this wouldn't have happened without his blog post. However he's missing the J2SE 6 install and download and has a bunch of other stuff in there that isn't really relevant anymore.
So, dude... here's your linkback: