Apakah ada cara untuk memperbarui semua alternatif terkait Java?

52

Apakah ada cara untuk dengan cepat mengalihkan semua alternatif terkait Java menggunakan update-alternatives?

Sebagai contoh, jika ingin mengganti Java ke 7, saya menjalankan sudo update-alternatives --config javadan memilih Java 7 OpenJdk. Tetapi jika saya menjalankan update-alternatives --get-selections | grep javasaya mendapatkan yang berikut,

appletviewer                   auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/appletviewer
extcheck                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/extcheck
idlj                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/idlj
itweb-settings                 auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/itweb-settings
jar                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jar
jarsigner                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jarsigner
java                           manual   /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
javac                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javac
javadoc                        auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javadoc
javah                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javah
javap                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/javap
javaws                         auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws
jconsole                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jconsole
jdb                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jdb
jexec                          auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jexec
jhat                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jhat
jinfo                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jinfo
jmap                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jmap
jps                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jps
jrunscript                     auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jrunscript
jsadebugd                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jsadebugd
jstack                         auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstack
jstat                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstat
jstatd                         auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/jstatd
keytool                        auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/keytool
native2ascii                   auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/native2ascii
orbd                           auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/orbd
pack200                        auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/pack200
policytool                     auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/policytool
rmic                           auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/rmic
rmid                           auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmid
rmiregistry                    auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmiregistry
schemagen                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/schemagen
serialver                      auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/serialver
servertool                     auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/servertool
tnameserv                      auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/tnameserv
unpack200                      auto     /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/unpack200
wsgen                          auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/wsgen
wsimport                       auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/wsimport
xjc                            auto     /usr/lib/jvm/java-6-openjdk-amd64/bin/xjc

Seperti yang Anda lihat, alternatif Java saya dialihkan ke 7, tetapi setiap alternatif lain berdasarkan OpenJDK 6 tidak dialihkan. Tentu saya bisa beralih masing-masing secara manual atau menulis skrip untuk melakukannya, tetapi saya berasumsi ada cara yang lebih baik untuk mencapai ini.

James McMahon
sumber

Jawaban:

70

Caranya adalah dengan menggunakan update-java-alternatives(dari java-commonpaket).

Jadi untuk OpenJDK 6 sampai 7, saya biasa update-java-alternatives -lmendapatkan daftar alternatif Java dan kemudian menggunakan sudo update-java-alternatives -s java-1.7.0-openjdk-amd64JDK.

CATATAN: Perintah di atas melempar kesalahan berikut,

update-alternatives: error: no alternatives for mozilla-javaplugin.so.
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so

Ini karena plugin openjdk tidak diinstal secara default. Untuk memperbaiki proses

sudo apt-get install icedtea-7-plugin

dan jalankan kembali update-java-alternatives.

James McMahon
sumber
8
Anda tidak harus menginstal plugin (dan Anda seharusnya tidak melakukannya jika tidak memerlukannya, karena pertimbangan keamanan). update-java-alternativesmengubah semua alternatif java lainnya, bahkan ketika pengaturan plugin melempar kesalahan.
daniel kullmann
Ada apa dengan Oracles JVM? Bagaimana saya bisa menggunakannya? Dan executable spesifik JDK?
keiki
2
Menjalankan update-java-alternatives --set java-1.8.0-openjdk-amd64saya masih punya default-java -> /usr/lib/jvm/java-7-oracle. Apakah ini disebabkan oleh no alternatives for mozilla-javaplugin.sokesalahan? Bagaimana saya bisa mengubah ini juga?
lony
3

jbro mengajukan pertanyaan yang sama di http://ubuntuforums.org/showthread.php?t=1817528 dan menulis naskah untuk masalah ini,

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done

Jika tidak ada jawaban yang lebih baik, ini sepertinya solusi yang solid, tetapi saya berasumsi pasti ada cara yang lebih baik untuk update-alternativesmenangani ini.

Saya sedikit mengedit kode, karena tidak membiarkan Anda melakukan perubahan sebelum menginstalnya. Saya menambahkan dua baris lagi sebagai berikut ...

#!/bin/bash

update-alternatives --get-selections | grep -i openjdk |
while read line
do
    alternative=$(echo $line | awk '{print $1}')
    path=$(echo $line | awk '{print $3}')
    newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
    status=unchanged
    if [ -f $newpath ]
    then
    status=modified
echo "-> update-alternatives --install /usr/bin/$alternative $alternative $newpath 1"
update-alternatives --install /usr/bin/$alternative $alternative $newpath 1
    echo "-> update-alternatives --set $alternative $newpath"
    update-alternatives --set $alternative $newpath
    else
    echo "$alternative unchanged"
    fi
done
James McMahon
sumber
1

Untuk Oracle JVM, jalankan ini:

sudo update-java-alternatives -s java-7-oracle
SteveQian
sumber
1

<TL; DR> update-java-alternative menggunakan file .jinfo untuk menentukan alternatif mana yang akan digunakan tetapi juga mengharapkannya telah dikonfigurasi secara terpisah.

Buat file .jinfo baru dan perbarui-entri entri jika JRE / JDK Anda yang diunduh tidak beralih dengan pembaruan-java-alternatif

[Detail]

Untuk mengkonfigurasinya secara manual:

  1. Dekompresi jdk baru Anda di samping jdk yang ada di /usr/lib/jvm/

  2. Hasilkan file .jdkname.jinfo dengan menduplikasi file .jinfo lain di folder (atau ambil satu dari instalasi Ubuntu lain: Anda mengikuti template sebanyak yang lainnya).

    Nama file. jdkname .jinfo harus cocok dengan nama pengguna jdk.

    Ubah konten untuk mengatur tajuk (nama) dan jalur file (entri program) agar sesuai dengan pemasangan baru Anda.

    Hapus baris apa pun yang merujuk ke program yang dihilangkan dalam versi Anda dan tambahkan baris untuk program baru di /bin

  3. Hasilkan alternatif untuk semua program sekarang dalam paket .jinfo Anda dengan templat ini:

    sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/**jdkname**/bin/java 100

    (Beberapa jawaban terkait telah membuat skrip ini dari konten / bin atau Anda dapat melakukan pencarian / penggantian regexp pada file .jinfo Anda untuk menghasilkan perintah skrip.)

    Catatan 100 hanya prioritas yang dipertimbangkan ketika mengatur versi jdk menggunakan bendera otomatis.

  4. Periksa alternatif java dan beralih untuk menggunakan JDK.

    update-java-alternatives -l  
    update-java-alternatives -s jdkname  
    

    Perhatikan bahwa beberapa JDK tidak menyertakan JRE, jadi tambahkan atau hapus entri jinfo tersebut.

simon coleman
sumber