JDK picker for OS X.
#!/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() | |
{ | |
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/[0-9a-z]*; do | |
if [ -e $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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment