web-dev-qa-db-ja.com

update-alternatives --installを使用してjdk11をインストールできません

jdk11の新機能を試してみるには、/ opt /にインストールし、次のようにupdate-alternativesを使用して使用します。

Sudo update-alternatives --install /etc/alternatives/Java OpenJDK-11 /opt/jdk-11/bin/Java 1102

返されるもの:

update-alternatives: using /opt/jdk-11/bin/javac to provide /etc/alternatives/Java (OpenJDK-11) in auto mode

しかし、私がするとき

$ Sudo update-alternatives --config Java

インストールしたばかりのjdkが表示されません。代わりに、警告と既存の選択肢が表示されます。

update-alternatives: warning: /etc/alternatives/Java has been changed (manually or by a script); switching to manual updates only
There are 2 choices for the alternative Java (providing /usr/bin/Java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/Java-11-openjdk-AMD64/bin/Java      1101      auto mode
  1            /usr/lib/jvm/Java-11-openjdk-AMD64/bin/Java      1101      manual mode
  2            /usr/lib/jvm/Java-8-openjdk-AMD64/jre/bin/Java   1081      manual mode

警告は何を意味し、実際に自動モードと手動モードの両方のエントリを表示するのはなぜですか?そして、なぜjdk11がそこにないのですか?

4
Mr. Wrong

最初のコマンドが間違っていたと思います。次のようになっているはずです。

Sudo update-alternatives /usr/bin/Java java /opt/jdk-11/bin/Java 1102

jdkの他のすべての実行可能ファイルについても同じです。

どうやるか

Jdk-11をインストールします

最初に、/usr/lib/jvmのディレクトリ内にjdk-11をインストールします。ここではopenjdk-11+28-AMD64を使用します

代替を自動的に更新するシェルスクリプトを作成する

jdk-11.shと呼びます

#!/bin/bash
if [[ $# -eq 0 ]] ;then
    echo "Usage: jdk-11.sh [-i|-r]"
    echo "  -i install alternatives for jdk-11"
    echo "  -r remove alternatives for jdk-11"
    exit -1
fi

install_dir="openjdk-11+28-AMD64"

cmd=(Java jexec jjs keytool pack200 rmid rmiregistry unpack200 jaotc jarsigner jar javac javadoc javap jcmd jdb jdeprscan jdeps jhsdb jimage jinfo jlink jmap jmod jps jrunscript jshell jstack jstatd jstat rmic serialver jconsole)

if [[ "$1" == "-i" ]] ;then
    for c in ${cmd[@]}; do
        update-alternatives --install /usr/bin/$c $c /usr/lib/jvm/$install_dir/bin/$c 1102
    done
fi

if [[ "$1" == "-r" ]] ;then
    for c in ${cmd[@]}; do
        update-alternatives --remove $c /usr/lib/jvm/$install_dir/bin/$c
        update-alternatives --auto $c
    done
fi

次にjdk-11.shを実行可能にし、実行します

Sudo ./jdk-11.sh -i

新しいjdk-11の代替を追加するには

このjdk-11に切り替える

update-Java-alternativesの助けを借りてその代替に切り替える

.openjdk-11+28.jinfo内の/usr/lib/jvmというヘルパーファイルが必要です

name=openjdk-11+28-AMD64
alias=openjdk-11+28-AMD64
priority=1102
section=main

hl rmid /usr/lib/jvm/openjdk-11+28-AMD64/bin/rmid
hl Java /usr/lib/jvm/openjdk-11+28-AMD64/bin/Java
hl keytool /usr/lib/jvm/openjdk-11+28-AMD64/bin/keytool
hl jjs /usr/lib/jvm/openjdk-11+28-AMD64/bin/jjs
hl pack200 /usr/lib/jvm/openjdk-11+28-AMD64/bin/pack200
hl rmiregistry /usr/lib/jvm/openjdk-11+28-AMD64/bin/rmiregistry
hl unpack200 /usr/lib/jvm/openjdk-11+28-AMD64/bin/unpack200
hl jexec /usr/lib/jvm/openjdk-11+28-AMD64/lib/jexec
jdkhl jlink /usr/lib/jvm/openjdk-11+28-AMD64/bin/jlink
jdkhl jdeps /usr/lib/jvm/openjdk-11+28-AMD64/bin/jdeps
jdkhl rmic /usr/lib/jvm/openjdk-11+28-AMD64/bin/rmic
jdkhl jinfo /usr/lib/jvm/openjdk-11+28-AMD64/bin/jinfo
jdkhl jstat /usr/lib/jvm/openjdk-11+28-AMD64/bin/jstat
jdkhl javac /usr/lib/jvm/openjdk-11+28-AMD64/bin/javac
jdkhl jhsdb /usr/lib/jvm/openjdk-11+28-AMD64/bin/jhsdb
jdkhl jps /usr/lib/jvm/openjdk-11+28-AMD64/bin/jps
jdkhl jstack /usr/lib/jvm/openjdk-11+28-AMD64/bin/jstack
jdkhl jrunscript /usr/lib/jvm/openjdk-11+28-AMD64/bin/jrunscript
jdkhl javadoc /usr/lib/jvm/openjdk-11+28-AMD64/bin/javadoc
jdkhl jmod /usr/lib/jvm/openjdk-11+28-AMD64/bin/jmod
jdkhl javap /usr/lib/jvm/openjdk-11+28-AMD64/bin/javap
jdkhl jar /usr/lib/jvm/openjdk-11+28-AMD64/bin/jar
jdkhl jaotc /usr/lib/jvm/openjdk-11+28-AMD64/bin/jaotc
jdkhl jshell /usr/lib/jvm/openjdk-11+28-AMD64/bin/jshell
jdkhl jmap /usr/lib/jvm/openjdk-11+28-AMD64/bin/jmap
jdkhl jdeprscan /usr/lib/jvm/openjdk-11+28-AMD64/bin/jdeprscan
jdkhl jimage /usr/lib/jvm/openjdk-11+28-AMD64/bin/jimage
jdkhl jstatd /usr/lib/jvm/openjdk-11+28-AMD64/bin/jstatd
jdkhl jdb /usr/lib/jvm/openjdk-11+28-AMD64/bin/jdb
jdkhl serialver /usr/lib/jvm/openjdk-11+28-AMD64/bin/serialver
jdkhl jcmd /usr/lib/jvm/openjdk-11+28-AMD64/bin/jcmd
jdkhl jarsigner /usr/lib/jvm/openjdk-11+28-AMD64/bin/jarsigner
jdk jconsole /usr/lib/jvm/openjdk-11+28-AMD64/bin/jconsole

次に実行する

Sudo update-Java-alternatives -s openjdk-11+28-AMD64

Ubuntuパッケージにロールバックするには

Sudo update-Java-alternatives -s Java-1.11.0-openjdk-AMD64
Sudo ./jdk-11.sh -r # optionnal
Sudo rm -rf /usr/lib/jvm/openjdk-11+28-AMD64 # optionnal
4
solsTiCe