Có cách nào để cập nhật tất cả các lựa chọn thay thế liên quan đến Java không?


51

Có cách nào để nhanh chóng chuyển đổi tất cả các lựa chọn thay thế liên quan đến Java bằng cách sử dụng update-alternativeskhông?

Chẳng hạn, nếu muốn chuyển đổi Java thành 7, tôi chạy sudo update-alternatives --config javavà chọn OpenJdk Java 7. Nhưng nếu tôi chạy update-alternatives --get-selections | grep javatôi sẽ nhận được những điều sau đây,

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

Như bạn có thể thấy, thay thế Java của tôi đã được chuyển sang 7, nhưng mọi thay thế khác dựa trên OpenJDK 6 đều không được chuyển đổi. Chắc chắn tôi có thể chuyển đổi từng cái một cách thủ công hoặc viết một kịch bản để làm như vậy, nhưng tôi cho rằng có một cách tốt hơn để thực hiện điều này.

Câu trả lời:


70

Bí quyết là sử dụng update-java-alternatives(từ java-commongói).

Vì vậy, để mở OpenJDK 6 đến 7, tôi đã sử dụng update-java-alternatives -lđể có được một danh sách các lựa chọn thay thế Java và sau đó được sử dụng sudo update-java-alternatives -s java-1.7.0-openjdk-amd64cho JDK.

LƯU Ý: Lệnh trên đã ném các lỗi sau,

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

Điều này là do plugin openjdk không được cài đặt theo mặc định. Để sửa lỗi chạy

sudo apt-get install icedtea-7-plugin

và chạy lại update-java-alternatives.


8
Bạn không phải cài đặt plugin (và bạn không nên nếu bạn không cần nó, do những cân nhắc về bảo mật). update-java-alternativesthay đổi tất cả các lựa chọn thay thế java khác, ngay cả khi cài đặt plugin gây ra lỗi.
daniel kullmann

Điều gì với Oracles JVM? Làm thế nào tôi có thể sử dụng nó? Và các thực thi cụ thể JDK?
keiki

2
Chạy update-java-alternatives --set java-1.8.0-openjdk-amd64tôi vẫn có default-java -> /usr/lib/jvm/java-7-oracle. Đây có phải là do no alternatives for mozilla-javaplugin.solỗi? Làm thế nào tôi có thể thay đổi điều này là tốt?
lony

3

jbro đã hỏi câu hỏi tương tự tại http://ubuntuforums.org/showthread.php?t=1817528 và viết một kịch bản cho vấn đề này,

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

Nếu không có câu trả lời tốt hơn thì đây có vẻ là một cách giải quyết vững chắc, nhưng tôi cho rằng phải có cách tốt hơn update-alternativesđể xử lý việc này.

Tôi đã chỉnh sửa mã một chút, vì nó không cho phép bạn thực hiện các thay đổi trước khi cài đặt chúng. Tôi đã thêm hai dòng như sau ...

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

1

Đối với Oracle JVM, hãy chạy cái này:

sudo update-java-alternatives -s java-7-oracle

0

<TL; DR> update-java-alternatives sử dụng .jinfo tập tin để xác định thay thế cho công tắc trên nhưng cũng hy vọng họ đã được cấu hình riêng biệt.

Tạo một tệp .jinfo mới và các mục thay đổi cập nhật nếu JRE / JDK đã tải xuống của bạn không chuyển đổi với các lựa chọn thay thế update-java

[Chi tiết]

Để cấu hình thủ công:

  1. Giải nén jdk mới của bạn cùng với jdk hiện có trong /usr/lib/jvm/

  2. Tạo tệp .jdkname.jinfo bằng cách sao chép tệp .jinfo khác trong thư mục (hoặc lấy tệp từ cài đặt Ubuntu khác: bạn theo mẫu nhiều như mọi thứ khác).

    Tên tệp. jdkname .jinfo phải khớp với tên người dùng jdk.

    Sửa đổi nội dung để đặt tiêu đề (tên) và đường dẫn tệp (mục nhập chương trình) để phù hợp với cài đặt mới của bạn.

    Xóa mọi dòng đề cập đến các chương trình bị bỏ qua trong phiên bản của bạn và thêm dòng cho các chương trình mới trong /bin

  3. Tạo các lựa chọn thay thế cho tất cả các chương trình hiện có trong gói .jinfo của bạn với mẫu này:

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

    (Một số câu trả lời có liên quan đã viết kịch bản này từ nội dung của / bin hoặc bạn có thể thực hiện tìm kiếm / thay thế regrec trên tệp .jinfo của mình để tạo các lệnh script.)

    Lưu ý 100 chỉ là mức ưu tiên được xem xét khi cài đặt phiên bản jdk bằng cờ tự động.

  4. Kiểm tra các lựa chọn thay thế java và chuyển sang sử dụng JDK.

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

    Lưu ý rằng một số JDK không bao gồm JRE, vì vậy hãy thêm nó hoặc xóa các mục jinfo đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.