Skip to content

Instantly share code, notes, and snippets.

@happygiraffe
Forked from headius/pickjdk.sh
Created July 16, 2009 08:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save happygiraffe/148320 to your computer and use it in GitHub Desktop.
Save happygiraffe/148320 to your computer and use it in GitHub Desktop.
#!/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.
# Usage:
# Include in .profile or .bashrc or source at login to get 'pickjdk' command.
# 'pickjdk' alone to bring up a menu of installed JDKs on OS X. Select one.
# 'pickjdk <jdk number>' to immediately switch to one of those JDKs.
_macosx()
{
[[ $(uname -s) = Darwin ]]
}
JDKS_ROOT=
if _macosx; then
JDKS_ROOT=/System/Library/Frameworks/JavaVM.framework/Versions
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/[0-9osdM]*; do
if [[ -d $jdk && ! -L $jdk ]]; then
JDKNAMES[$n]="${jdk##*/}"
if _macosx; then
jdk=$jdk/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=$(which java)
currjdk=${currjdk%/*/*}
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 [[ -n $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 [[ -n $JAVA_HOME ]]; then
PATH="$JAVA_HOME/bin:$PATH"
fi
echo "New JDK: ${JDKNAMES[$choice]}"
hash -r
unset JDKS
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment