Skip to content

Instantly share code, notes, and snippets.

@headius
Created September 22, 2011 14:38
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save headius/1234935 to your computer and use it in GitHub Desktop.
Save headius/1234935 to your computer and use it in GitHub Desktop.
OS X 'pickjdk' command with single-command selection and updated JDK location
#!/bin/bash
#
# Provides a function that allows you to choose a JDK. Just set the environment
# variable JDKS_ROOT to the directory containing multiple versions of the JDK
# and the function will prompt you to select one. JAVA_HOME and PATH will be cleaned
# up and set appropriately.
_macosx()
{
if [ $(uname -s) = Darwin ]; then
return 0
else
return 1
fi
}
JDKS_ROOT=
if _macosx; then
JDKS_ROOT=/Library/Java/JavaVirtualMachines
fi
pickjdk()
{
if [ -z "$JDKS_ROOT" ]; then
return 1
fi
declare -a JDKS
local n=1 jdk total_jdks choice=0 currjdk=$JAVA_HOME explicit_jdk
for jdk in $JDKS_ROOT/*; do
if [ -d $jdk ]; then
JDKNAMES[$n]="$(basename $jdk)"
if _macosx; then
jdk=$jdk/Contents/Home
fi
if [ -z "$1" ]; then
echo -n " $n) ${JDKNAMES[$n]}"
if [ $jdk = "$currjdk" ]; then
echo " < CURRENT"
else
echo
fi
fi
JDKS[$n]=$jdk
total_jdks=$n
n=$[ $n + 1 ]
fi
done
if [ -z "$1" ]; then
echo " $n) None"
fi
JDKS[$n]=None
total_jdks=$n
if [ $total_jdks -gt 1 ]; then
if [ -z "$1" ]; then
while [ -z "${JDKS[$choice]}" ]; do
echo -n "Choose one of the above [1-$total_jdks]: "
read choice
done
else
choice=$1
fi
fi
if [ -z "$currjdk" ]; then
currjdk=$(dirname $(dirname $(type -path java)))
fi
if [ ${JDKS[$choice]} != None ]; then
export JAVA_HOME=${JDKS[$choice]}
else
unset JAVA_HOME
fi
explicit_jdk=
for jdk in ${JDKS[*]}; do
if [ "$currjdk" = "$jdk" ]; then
explicit_jdk=$jdk
break
fi
done
if [ "$explicit_jdk" ]; then
if [ -z "$JAVA_HOME" ]; then
PATH=$(echo $PATH | sed "s|$explicit_jdk/bin:*||g")
else
PATH=$(echo $PATH | sed "s|$explicit_jdk|$JAVA_HOME|g")
fi
elif [ "$JAVA_HOME" ]; then
PATH="$JAVA_HOME/bin:$PATH"
fi
echo "New JDK: ${JDKNAMES[$choice]}"
hash -r
unset JDKS
}
@iconara
Copy link

iconara commented Dec 19, 2011

On Mac OS X you can get a list of the installed JVM's with /usr/libexec/java_home -V

@headius
Copy link
Author

headius commented Dec 19, 2011

Very nice...that's a bit more elegant than scanning a dir. I'll try to update.

@spullara
Copy link

It would also make it possible to choose 1.6 if you need to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment