Apa target yang benar untuk variabel lingkungan JAVA_HOME untuk distribusi berbasis Linux OpenJDK Debian?

91

Di Windows, JAVA_HOMEharus mengarah ke folder instalasi JDK (sehingga JAVA_HOME/binberisi semua executable dan JAVA_HOME/libsberisi semua jarpustaka default ).

Jika saya mengunduh bundel JDK Sun dan menginstalnya di Linux, prosedurnya sama.

Namun, saya perlu menggunakan paket OpenJDK default Kubuntu. Masalahnya adalah semua executable ditempatkan di /usr/bin. Tapi toples itu ditempatkan /usr/share/java. Karena mereka tidak berada dalam JAVA_HOMEfolder yang sama, saya mengalami masalah dengan Grails dan mungkin akan ada masalah dengan aplikasi lain yang mengharapkan struktur Java standar.

  1. Jika saya menggunakan:

    JAVA_HOME=/usr
    

    Semua aplikasi dan skrip yang ingin menggunakan Java apa pun yang dapat dieksekusi dapat menggunakan prosedur standar call $JAVA_HOME/bin/executable. Namun, sejak guci berada di tempat yang berbeda, mereka tidak selalu ditemukan (contoh: di Grails saya mendapatkan ClassDefNotFounduntuk native2ascii).

  2. Di sisi lain, jika saya menggunakan:

    JAVA_HOME=/usr/share/java
    

    Tak satu pun dari executable Java ( java, javac, dll) dapat ditemukan.

Jadi, bagaimana cara yang benar untuk menangani JAVA_HOMEvariabel di Linux berbasis Debian?

Terima kasih atas bantuan Anda, Luis

Luis Soeiro
sumber

Jawaban:

98

Apa yang akhirnya berhasil untuk saya (Grails sekarang bekerja dengan lancar) hampir seperti yang Steve B. tunjukkan:

JAVA_HOME=/usr/lib/jvm/default-java

Dengan cara ini jika pengguna mengubah JDK default untuk sistem, JAVA_HOMEmasih berfungsi.

default-java adalah symlink ke JVM saat ini.

Luis Soeiro
sumber
6
Tampaknya tidak ada tautan seperti itu pada Debian 7
a1an
3
Pada RHEL5.10, ini adalah / usr / lib / jvm / java
Brian
1
Saya menggunakan / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn
Untuk Oracle Linux 7 (ini seharusnya berlaku untuk CentOS dan RHEL), saya membuat file bernama /etc/profile.d/java.sh dan mengisinya dengan yang berikut: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME setelah re-sourcing / etc / profile (dengan menjalankan source / etc / profile) JAVA_HOME telah diisi seperti yang diharapkan.
darnold0714
80

Jika Anda menggunakan alternatif untuk mengelola beberapa versi java, Anda dapat mengaturnya JAVA_HOMEberdasarkan java (atau javac) yang terhubung seperti ini:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
sumber
3
Ini berfungsi untuk saya: JAVA_HOME = $ (tautan baca -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan
4
Solusi brilian, mengatasi sakit kepala saya selama bertahun-tahun dengan JAVA_HOME, yang cenderung mengarah ke tempat berbeda di sistem operasi berbeda.
Datageek
3
perhatikan bahwa solusi pintar ini tidak akan berfungsi pada distro seperti Gentoo yang /usr/bin/javamengarah ke script ( /usr/libexec/eselect-java/run-java-tool.bash). tetap saja, itu pendekatan yang bagus. satu-satunya hal yang saya ubah adalah menggunakan substitusi bawaan Bash untuk menghindari pemijahan sed, misalnya:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO
Ini berfungsi dengan baik :) Mungkin ingin mengubah javacke javakarena tidak semua orang memiliki JDK terinstal; hanya JRE
Hanxue
1
@AlexisWilke sekarang java bukannya javac
bbaassssiiee
7

Instalasi standar Ubuntu tampaknya memasukkan berbagai versi Java /usr/lib/jvm. The javac, java Anda temukan di jalan Anda akan softlink ini.

Tidak ada masalah dengan menginstal versi Java Anda sendiri di mana pun Anda suka, selama Anda menyetel JAVA_HOMEvariabel lingkungan dan memastikan Java baru bindi jalur Anda.

Cara sederhana untuk melakukannya adalah dengan memiliki Java home sebagai softlink, sehingga jika Anda ingin meningkatkan atau mengganti versi, Anda hanya perlu mengubah direktori yang dituju - misalnya:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011
Steve B.
sumber
berbahaya untuk merekomendasikan solusi Ubuntu dengan Debian. Mereka bisa dan memang berbeda.
RichieHH
4
Perhatikan pemohon mengatakan dia menggunakan Kubuntu, jadi solusi Ubuntu seharusnya baik-baik saja.
Joseph Holsten
0

Saya biasanya tidak memiliki variabel lingkungan JAVA_HOME. Java dapat mengaturnya sendiri. Di dalam properti java java.home system harus tersedia.

iny
sumber
Saya biasanya juga tidak memilikinya. Namun, jika saya tidak mengaturnya, grails mengeluh bahwa JAVA_HOME tidak ada dan dibatalkan.
Luis Soeiro
1
semut membutuhkannya juga di debian yang konteksnya
RichieHH
0

Coba atur juga variabel JAVA_LIB.

Cantillon
sumber
0

Jika Anda memiliki masalah dengan file JAR yang tidak ditemukan, saya juga akan memastikan CLASSPATH Anda diatur untuk menyertakan lokasi file tersebut. Namun saya menemukan bahwa CLASSPATH sering kali perlu diatur secara berbeda untuk program yang berbeda dan seringkali berakhir dengan sesuatu yang diatur secara unik untuk program individu.

MVang
sumber
0

Saya telah menemukan masalah serupa dengan paket openjdk-6-jre dan openjdk-6-jre-headless di Ubuntu.

Masalah saya diselesaikan dengan membersihkan paket openjdk-6-jre dan openjdk-6-jre-headless dan menginstal ulang. Alternatif hanya diperbarui pada penginstalan baru paket openjdk-6-jre dan openjdk-6-jre-headless.

Di bawah ini adalah contoh pemasangan setelah pembersihan:

aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...

Anda dapat melihat di atas yang update-alternativesdijalankan untuk mengatur tautan untuk berbagai binari Java.

Setelah pemasangan ini, ada juga tautan masuk /usr/bin, tautan masuk /etc/alternatives, dan file untuk setiap biner masuk /var/lib/dpkg/alternatives.

ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java

Mari kontraskan ini dengan menginstal tanpa menghapus.

aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...

Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...

Seperti yang Anda lihat, update-alternativestidak dipicu.

Setelah pemasangan ini, tidak ada file untuk binari Java di /var/lib/dpkg/alternatives, tidak ada tautan masuk /etc/alternatives, dan tidak ada tautan masuk /usr/bin.

Penghapusan file /var/lib/dpkg/alternativesjuga rusak update-java-alternatives.

Saturn Junction
sumber
0

Ubuntu 12.04 ini berfungsi ...

JAVA_HOME = / usr / lib / jvm / java-6-openjdk-i386 / jre

Alex
sumber
0

Sebagai pembaruan untuk pengguna fedora, alternatif mengatur direktori java saat ini ke / usr / java / default

jadi Anda harus menyetel JAVA_HOME Anda ke / usr / java / default agar selalu memiliki alternatif pilihan saat ini di jalur kelas Anda

HTH!

Greg Henry
sumber
0

Saya selalu cenderung untuk mengatur JAVA_HOME sesuai dengan /usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

Dengan cara ini, kedua alternatif menunjuk ke lokasi yang sama

Ivo
sumber
-1

Sejauh yang saya ingat, saya menggunakan skrip update-java-alternatif daripada update-alternatif. Dan itu mengatur JAVA_HOME untuk saya dengan benar.

Tobias Schulte
sumber
Tidak ada di Ubuntu 20.4
Martin Schröder
-1

Silakan lihat apa yang dilakukan oleh perintah update-alternatif (ini orang yang baik ...).

Singkatnya - apa yang terjadi jika Anda memiliki java-sun-1.4 dan java-opensouce-1.0 ... yang mana yang menggunakan "java"? Itu debian "/ usr / bin / java" adalah tautan simbolik dan "/usr/bin/java-sun-1.4" adalah alternatif dari "/ usr / bin / java"

Edit: Seperti yang dikatakan Richard, update-alternativestidak cukup. Anda benar-benar perlu menggunakan update-java-alternatives. Info lebih lanjut di:

https://help.ubuntu.com/community/Java

elcuco
sumber
pembaruan-alternatif tidak cukup. Ini perlu diperbarui-java-alternatif
RichieHH
@ Richard: ya, dicatat. Pertama kali saya membahasnya jadi saya mencari di Google, dan menemukan dokumentasi Ubuntu. Terima kasih!
elcuco
-2

Target saya yang benar adalah mendownloadnya dari Sun dan menginstalnya seperti itu. Kemudian Anda tahu persis di direktori apa semuanya masuk.

Tetapi jika Anda lebih suka tetap menggunakan cara aneh Debian menginstalnya, tebakan terbaik saya adalah direktori induk tepat di atas tempat biner java dan javac berada.

(karena ketika Anda menentukannya di jalur Anda, itu adalah $ JAVA_HOME / bin) (Jadi dalam kasus Anda itu akan menjadi ... $ JAVA_HOME / share dan $ JAVA_HOME akan menjadi / usr?)

Eh, kedengarannya tidak benar ...

Saya tertarik untuk mendengar jawabannya juga!

leeand00
sumber
Saat menggunakan debian, Anda benar-benar perlu mengikuti struktur debian atau pembaruan sistem yang lebih baru akan membuat Anda mengalami sistem yang rusak.
RichieHH