How to change the default Java version on Ubuntu 18.04 LTS
在Ubuntu环境下安装多个JDK版本也是很常见的,今天我们以Open JDK8与Open JDK11为例来介绍一下多JDK版本如何切换。
Script mode
- step 1
在目录/etc/jvm/中创建一个脚本文件,内容如下,并命名为switch-java-version.sh
sudo mkdir -p /etc/jvm
sudo tee /etc/jvm/switch-java-version.sh <<-'EOF'
#The set-default-java program is used to switch the Java version
process(){
echo "process started."
if [ $1 ]
then
sudo rm -rf /etc/profile.d/java.sh
case $1 in
0)
echo "You choose the java-1.8.0-openjdk-amd64."
sudo update-java-alternatives -s java-1.8.0-openjdk-amd64
echo $'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 ' |sudo tee /etc/profile.d/java.sh
;;
1)
echo "You choose the java-1.11.0-openjdk-amd64."
sudo update-java-alternatives -s java-1.11.0-openjdk-amd64
echo $'export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64 ' |sudo tee /etc/profile.d/java.sh
;;
2)
echo "You choose the bellsoft-java8-full-amd64."
sudo update-java-alternatives -s bellsoft-java8-full-amd64
echo $'export JAVA_HOME=/usr/lib/jvm/bellsoft-java8-full-amd64 ' |sudo tee /etc/profile.d/java.sh
;;
3)
echo "You choose the bellsoft-java11-full-amd64."
sudo update-java-alternatives -s bellsoft-java11-full-amd64
echo $'export JAVA_HOME=/usr/lib/jvm/bellsoft-java11-full-amd64 ' |sudo tee /etc/profile.d/java.sh
;;
*)
echo -n "unknown"
;;
esac
. /etc/profile.d/java.sh
else
echo "Null parameter."
fi
echo "process finished."
}
echo "Which version do you want to set the JDK for?"
echo "0 - java-1.8.0-openjdk-amd64."
echo "1 - java-1.11.0-openjdk-amd64."
echo "2 - bellsoft-java8-full-amd64."
echo "3 - bellsoft-java11-full-amd64."
read -p "Please enter the id of menu for jdk:[0 , 1, 2, 3] " version
process $version
EOF
- step 2
将如下内容追加到文件~/.bashrc文件中去。
tee -a ~/.bashrc <<-'EOF'
if [ -f /etc/profile.d/java.sh ]; then
. /etc/profile.d/java.sh
fi
EOF
如何使用呢?执行如下命令即可。
source /etc/jvm/switch-java-version.sh
接下来,我们给大家基于上面这个脚本做一个实际的演示。
- 切换为openjdk11
lwk@qwfys:~$ . /etc/jvm/switch-java-version.sh
Which version do you want to set the JDK for?
0 - java-1.8.0-openjdk-amd64.
1 - java-1.11.0-openjdk-amd64.
1
You choose the java-1.11.0-openjdk-amd64.
process started.
[sudo] password for lwk:
export JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64
process finished.
lwk@qwfys:~$ printenv JAVA_HOME
/usr/lib/jvm/java-1.11.0-openjdk-amd64
lwk@qwfys:~$
- 切换为openjdk8
lwk@qwfys:~$ . /etc/jvm/switch-java-version.sh
Which version do you want to set the JDK for?
0 - java-1.8.0-openjdk-amd64.
1 - java-1.11.0-openjdk-amd64.
0
You choose the java-1.8.0-openjdk-amd64.
process started.
[sudo] password for lwk:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
process finished.
lwk@qwfys:~$ printenv JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-amd64
lwk@qwfys:~$
到这里,有的小伙伴就会问了,上面的命令update-java-alternatives
究竟是做什么的呢,为什么有这么大的魔力呢?接下来,我们就一起看看update-java-alternatives
到底有什么神奇之处。
我们先来查找一下命令update-java-alternatives
在系统中什么位置,然后看看它是不是文本文件,如果是的话,那就看看它里面的内容是什么。基于上述思维,我们来一起一探究竟。
lwk@qwfys:~$ which update-java-alternatives
/usr/sbin/update-java-alternatives
lwk@qwfys:~$ ll /usr/sbin/update-java-alternatives
-rwxr-xr-x 1 root root 3166 Jan 6 2017 /usr/sbin/update-java-alternatives*
lwk@qwfys:~$ file /usr/sbin/update-java-alternatives
/usr/sbin/update-java-alternatives: Bourne-Again shell script, ASCII text executable
lwk@qwfys:~$ cat /usr/sbin/update-java-alternatives
#! /bin/bash
shopt -s dotglob
prog=$(basename $0)
usage()
{
rv=$1
cat >&2 <<-EOF
usage: $prog [--jre-headless] [--jre] [--plugin] [-v|--verbose]
-l|--list [<jname>]
-s|--set <jname>
-a|--auto
-h|-?|--help
EOF
exit $rv
}
action=
uaopts='--quiet'
while [ "$#" -gt 0 ]; do
case "$1" in
-a|--auto)
[ -z "$action" ] || usage 1
action=auto;;
-hl|--jre-headless)
hlonly=yes;;
-j|--jre)
jreonly=yes;;
--plugin)
pluginonly=yes;;
-l|--list)
[ -z "$action" ] || usage 1
action=list
if [ "$#" -gt 0 ]; then
shift
jname=$1
fi
;;
-s|--set)
[ -z "$action" ] || usage 1
action=set
shift
[ "$#" -gt 0 ] || usage 1
jname=$1
;;
-v|--verbose)
verbose=yes
uaopts="${uaopts/--quiet/}";;
-h|-?|--help)
usage 0;;
-*)
echo "X: $1"
usage 1;;
*)
break;;
esac
shift
done
[ "$#" -eq 0 ] || usage 1
[ -n "$action" ] || usage 1
which='^(hl|jre|jdk|jdkhl|plugin|DUMMY) '
if [ -n "$hlonly$jreonly$pluginonly" ]; then
which='^('
[ -n "$hlonly" ] && which="${which}hl|"
[ -n "$jreonly" ] && [ -n "$hlonly" ] && which="${which}jre|"
[ -n "$jreonly" ] && [ -z "$hlonly" ] && which="${which}hl|jre|"
[ -n "$pluginonly" ] && which="${which}plugin|"
which="${which}DUMMY) "
fi
top=/usr/lib/jvm
if [ -n "$jname" ]; then
arch=$(dpkg --print-architecture)
if [ ! -x $top/$jname/bin/java ] && [ -x $top/$jname-$arch/bin/java ]; then
echo >&2 "$prog: obsolete <jname>, please use $jname-$arch instead"
jname=$jname-$arch
fi
case "$jname" in
/*) jdir=$jname; jname=$(basename $jdir);;
*) jdir=$top/$jname
esac
if [ ! -d $jdir ]; then
echo >&2 "$prog: directory does not exist: $jdir"
exit 1
fi
if [ -f $top/.$jname.jinfo ]; then
jinfo=$top/.$jname.jinfo
elif [ -f $top/$jname.jinfo ]; then
jinfo=$top/$jname.jinfo
else
echo >&2 "$prog: file does not exist: $top/.$jname.jinfo"
exit 1
fi
fi
vecho()
{
[ -z "$verbose" ] || echo >&2 "$@"
}
jinfo_files=
do_auto()
{
vecho "resetting java alternatives"
awk "/$which/ {print \$2}" $top/*.jinfo | sort -u \
| \
while read name; do
update-alternatives $uaopts --auto $name
done
}
do_list()
{
vecho "listing java alternatives:"
for i in ${jinfo:-$top/*.jinfo}; do
alias=$(basename ${i%.jinfo})
alias=${alias#.}
prio=$(awk -F= '/priority=/ {print $2}' $i)
printf "%-30s %-10s %s\n" $alias "$prio " $top/$alias
[ -n "$verbose" ] && egrep "$which" $i
done
}
do_set()
{
do_auto
awk "/$which/ {print}" $jinfo | sort -u \
| \
while read type name location; do
if [ $type = jdk -a -z "$hlonly$jreonly$pluginonly" -a ! -f $location ]; then
echo >&2 "$prog: jdk alternative does not exist: $location"
continue
fi
if [ $type = plugin -a -z "$hlonly$jreonly" -a ! -f $location ]; then
echo >&2 "$prog: plugin alternative does not exist: $location"
continue
fi
update-alternatives $uaopts --set $name $location
done
}
if [ "$action" != list ] && [ "$(id -u)" -ne 0 ]; then
echo >&2 "$prog: no root privileges"
exit 1
fi
do_$action
lwk@qwfys:~$
接下来,抽空我会给大家解释上述脚本文件它主要做了哪些事情。
Command mode
- 切换到jdk11
sudo update-java-alternatives -s java-1.11.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
- 切换到jdk8
sudo update-java-alternatives -s java-1.8.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
Reference