How to change the default Java version on Ubuntu 18.04 LTS

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwfys200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值