มีวิธีอัปเดตทางเลือกที่เกี่ยวข้องกับ Java ทั้งหมดหรือไม่


51

มีวิธีสลับอย่างรวดเร็วเหนือทางเลือกทั้งหมดที่เกี่ยวข้องกับ Java update-alternativesหรือไม่?

ตัวอย่างเช่นหากต้องการสลับ Java ไปเป็น 7 ฉันจะเรียกใช้sudo update-alternatives --config javaและเลือก Java 7 OpenJdk แต่ถ้าฉันวิ่งupdate-alternatives --get-selections | grep javaฉันจะได้รับสิ่งต่อไปนี้

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

อย่างที่คุณเห็น, ทางเลือก Java ของฉันถูกสลับไปที่ 7, แต่ทางเลือกอื่น ๆ ทั้งหมดที่ใช้ OpenJDK 6 ไม่ได้ถูกสลับไป แน่ใจว่าฉันสามารถสลับแต่ละคนด้วยตนเองหรือเขียนสคริปต์เพื่อทำเช่นนั้น แต่ฉันคิดว่ามีวิธีที่ดีกว่าเพื่อให้บรรลุนี้

คำตอบ:


70

เคล็ดลับคือการใช้update-java-alternatives(จากjava-commonแพคเกจ)

ดังนั้นสำหรับ OpenJDK 6 ถึง 7 ฉันเคยupdate-java-alternatives -lได้รับรายการทางเลือก Java แล้วใช้sudo update-java-alternatives -s java-1.7.0-openjdk-amd64กับ JDK

หมายเหตุ: คำสั่งด้านบนแสดงข้อผิดพลาดต่อไปนี้

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

นี่เป็นเพราะปลั๊กอิน openjdk ไม่ได้ติดตั้งตามค่าเริ่มต้น เพื่อแก้ไขปัญหาการวิ่ง

sudo apt-get install icedtea-7-plugin

update-java-alternativesและวิ่ง


8
คุณไม่ต้องติดตั้งปลั๊กอิน (และคุณไม่ควรถ้าคุณไม่ต้องการเนื่องจากข้อควรพิจารณาด้านความปลอดภัย) update-java-alternativesเปลี่ยนทางเลือก java อื่นทั้งหมดแม้ว่าการตั้งค่าปลั๊กอินจะเกิดข้อผิดพลาดก็ตาม
daniel kullmann

Oracles JVM คืออะไร ฉันจะใช้สิ่งนั้นได้อย่างไร และไฟล์เฉพาะของ JDK?
keiki

2
เล่นฉันยังคงมีupdate-java-alternatives --set java-1.8.0-openjdk-amd64 default-java -> /usr/lib/jvm/java-7-oracleสิ่งนี้เกิดจากno alternatives for mozilla-javaplugin.soข้อผิดพลาดหรือไม่? ฉันจะเปลี่ยนสิ่งนี้ได้เช่นกัน?
lony

3

jbro ถามคำถามเดียวกันที่http://ubuntuforums.org/showthread.php?t=1817528และเขียนสคริปต์สำหรับปัญหานี้

#!/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

หากไม่มีคำตอบที่ดีกว่านี้ดูเหมือนว่าจะเป็นวิธีแก้ปัญหาที่มั่นคง แต่ฉันคิดว่าจะต้องมีวิธีที่ดีกว่าในupdate-alternativesการจัดการกับเรื่องนี้

ฉันแก้ไขโค้ดเล็กน้อยเนื่องจากไม่อนุญาตให้คุณทำการเปลี่ยนแปลงก่อนที่จะติดตั้ง ฉันเพิ่มสองบรรทัดเพิ่มเติมดังนี้ ...

#!/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


0

<TL; DR> ปรับปรุง Java-ทางเลือกใช้แฟ้ม .jinfo เพื่อตรวจสอบซึ่งทางเลือกในการสลับข้าม แต่ยังคาดว่าพวกเขาจะได้รับการกำหนดค่าแยกต่างหาก

สร้างไฟล์. Jinfo ใหม่และรายการอัพเดตทางเลือกหาก JRE / JDK ที่คุณดาวน์โหลดไม่สลับกับupdate-java-alternatives

[รายละเอียด]

ในการกำหนดค่าด้วยตนเอง:

  1. ขยาย jdk ใหม่ของคุณไปพร้อมกับ jdk ที่มีอยู่ /usr/lib/jvm/

  2. สร้างไฟล์. jdkname.jinfoด้วยการทำซ้ำไฟล์. Jinfo อื่นในโฟลเดอร์ (หรือคว้าไฟล์หนึ่งจากการติดตั้ง Ubuntu อื่น: คุณอยู่หลังเทมเพลตเท่าที่อื่น)

    ชื่อไฟล์ jdkname .jinfo ต้องตรงกับ jdk foldername

    แก้ไขเนื้อหาเพื่อตั้งค่าส่วนหัว (ชื่อ) และพา ธ ไฟล์ (รายการโปรแกรม) เพื่อให้ตรงกับการติดตั้งใหม่ของคุณ

    ลบบรรทัดใด ๆ ที่อ้างถึงโปรแกรมที่ละเว้นในรุ่นของคุณและเพิ่มบรรทัดสำหรับโปรแกรมใหม่ใน /bin

  3. สร้างทางเลือกสำหรับโปรแกรมทั้งหมดในตอนนี้ในแพ็คเกจ. Jinfo ของคุณด้วยเทมเพลตนี้:

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

    (คำตอบที่เกี่ยวข้องจำนวนมากมีสคริปต์นี้จากเนื้อหาของ / bin หรือคุณสามารถทำการค้นหา / แทนที่ regexp บนไฟล์. Jinfo ของคุณเพื่อสร้างคำสั่งสคริปต์)

    โปรดสังเกตว่า 100 เป็นเพียงลำดับความสำคัญซึ่งจะถูกพิจารณาเมื่อตั้งค่าเวอร์ชัน jdk โดยใช้แฟล็กอัตโนมัติ

  4. ตรวจสอบทางเลือก java และเปลี่ยนเป็นใช้ JDK

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

    โปรดทราบว่า JDK บางตัวไม่มี JRE ดังนั้นให้เพิ่มหรือลบรายการ jinfo เหล่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.