如何使用 update-alternatives 正確安裝 Temurin JDK

如何使用 update-alternatives 正確安裝 Temurin JDK

我想安裝 Temurin JDK 8 和 11,我透過以下步驟安裝了它們

wget https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u312-b07/OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz
tar xzf OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz

sudo mv jdk8u312-b07/  /usr/lib/jvm/temurinjdk-8-hotspot-amd64

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/temurinjdk-8-hotspot-amd64/bin/java" 1081
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/temurinjdk-8-hotspot-amd64/bin/javac" 1081

但我不確定這是否 100% 正確,以及如何產生 .jinfo 檔案是否需要?

答案1

您可以使用Adoptium Debian / Ubuntu 儲存庫

  1. 新增 Eclipse Adoptium GPG 金鑰

    wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add -
    
  2. 新增 Eclipse Adoptium apt 儲存庫

    echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
    
  3. 安裝您需要的 Temurin 版本

    sudo apt update # update if you haven't already
    sudo apt install temurin-8-jdk
    sudo apt install temurin-17-jdk
    
  4. 配置預設版本

    sudo update-alternatives --config java
    

答案2

我從原始 AdoptOpenJDK deb 套件中提取了腳本並修改了我使用的版本,例如:

wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.1%2B12/OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz

mkdir -p /usr/lib/jvm

sudo tar -xvvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.1_12.tar.gz -C /usr/lib/jvm/

sudo ./java-alternative install /usr/lib/jvm/jdk-17.0.1+12
sudo ./java-alternative set /usr/lib/jvm/jdk-17.0.1+12
sudo ./java-alternative remove /usr/lib/jvm/jdk-17.0.1+12

腳本原始碼:

#!/bin/sh

set -eu

priority=2222
#jdk_base_dir=/usr/lib/jvm/adoptopenjdk-11-hotspot-amd64
#jdk_base_dir=/usr/lib/jvm/jdk-17.0.1+12
jdk_base_dir="$2"

if [ ! -d "$jdk_base_dir" ]
then
    echo "Invalid java directory. Choose one of: ";
    ls -1d /usr/lib/jvm/*
    exit
fi

tools="jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jdeps jfr jhsdb jimage jinfo jjs jlink jmap jmod jps jrunscript jshell jstack jstat jstatd keytool pack200 rmic rmid rmiregistry serialver unpack200 jexec jspawnhelper"

case "$1" in
install)
    for tool in $tools ; do
        for tool_path in "$jdk_base_dir/bin/$tool" "$jdk_base_dir/lib/$tool" ; do
            if [ ! -e "$tool_path" ]; then
                continue
            fi

            slave=""
            tool_man_path="$jdk_base_dir/man/man1/$tool.1"
            if [ -e "$tool_man_path" ]; then
                slave="--slave /usr/share/man/man1/$tool.1 $tool.1 $tool_man_path"
            fi

            update-alternatives \
                --install \
                "/usr/bin/$tool" \
                "$tool" \
                "$tool_path" \
                "$priority" \
                $slave
        done
    done
;;
remove)
    for tool in $tools ; do
        for tool_path in "$jdk_base_dir/bin/$tool" "$jdk_base_dir/lib/$tool" ; do
            if [ ! -e "$tool_path" ]; then
                continue
            fi

            update-alternatives \
                --remove \
                "$tool" \
                "$tool_path"
        done
    done
;;
set)
    for tool in $tools ; do
        for tool_path in "$jdk_base_dir/bin/$tool" "$jdk_base_dir/lib/$tool" ; do
            if [ ! -e "$tool_path" ]; then
                continue
            fi

            update-alternatives \
                --set \
                "$tool" \
                "$tool_path"
        done
    done
;;
esac

相關內容