Jaki jest prawidłowy cel zmiennej środowiskowej JAVA_HOME dla dystrybucji Linux OpenJDK opartej na Debianie?

91

W systemie Windows JAVA_HOMEmusi wskazywać folder instalacyjny JDK (tak, aby JAVA_HOME/binzawierał wszystkie pliki wykonywalne i JAVA_HOME/libswszystkie domyślne jarbiblioteki).

Jeśli pobiorę pakiet Sun JDK i zainstaluję go w systemie Linux, będzie to ta sama procedura.

Muszę jednak użyć domyślnego pakietu OpenJDK Kubuntu. Problem polega na tym, że wszystkie pliki wykonywalne są umieszczone w plikach /usr/bin. Ale słoiki są włożone /usr/share/java. Ponieważ nie znajdują się w tym samym JAVA_HOMEfolderze, mam problem z Grails i być może będą problemy z innymi aplikacjami, które oczekują standardowej struktury Java.

  1. Jeśli używam:

    JAVA_HOME=/usr
    

    Wszystkie aplikacje i skrypty, które chcą używać dowolnego pliku wykonywalnego Java, mogą korzystać ze standardowej procedury call $JAVA_HOME/bin/executable. Jednakże, ponieważ słoje są w innym miejscu, nie są one zawsze znaleźć (przykład: w Grails Dostaję ClassDefNotFoundza native2ascii).

  2. Z drugiej strony, jeśli używam:

    JAVA_HOME=/usr/share/java
    

    Żaden z plików wykonywalnych (Java java, javacitp) można znaleźć.

Jaki jest więc prawidłowy sposób obsługi JAVA_HOMEzmiennej w systemie Linux opartym na Debianie?

Dzięki za pomoc, Luis

Luis Soeiro
źródło

Odpowiedzi:

98

To, co w końcu zadziałało (Grails działa teraz płynnie), działa prawie tak, jak zauważył Steve B.:

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

W ten sposób, jeśli użytkownik zmieni domyślny JDK dla systemu, JAVA_HOMEnadal działa.

default-java jest dowiązaniem symbolicznym do aktualnej maszyny JVM.

Luis Soeiro
źródło
6
Wygląda na to, że nie ma takiego łącza w Debianie 7
a1an,
3
Na RHEL5.10 jest / usr / lib / jvm / java
Brian
1
Użyłem / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn
W przypadku Oracle Linux 7 ( powinno to dotyczyć CentOS i RHEL) utworzyłem plik o nazwie /etc/profile.d/java.sh i zapełniłem go następującymi elementami: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME po ponownym pozyskaniu / etc / profile (przez uruchomienie źródła / etc / profile) JAVA_HOME został wypełniony zgodnie z oczekiwaniami.
darnold0714
80

Jeśli używasz alternatyw do zarządzania wieloma wersjami Java, możesz ustawić JAVA_HOMEoparte na dowiązaniu symbolicznym java (lub javac) w następujący sposób:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
źródło
3
U mnie to działa: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan
4
Genialne rozwiązanie, rozwiązuje moje wieloletnie bóle głowy dzięki JAVA_HOME, który wskazuje różne miejsca na różnych systemach operacyjnych.
Datageek
3
zwróć uwagę, że to sprytne rozwiązanie nie będzie działać na dystrybucjach takich jak Gentoo, które mają /usr/bin/javawskazanie skryptu ( /usr/libexec/eselect-java/run-java-tool.bash). nadal jest to miłe podejście. jedyne, co bym zmienił, to użycie wbudowanej zamiany Basha, aby uniknąć sedJAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
spawnowania
To działa dobrze :) Może chcieć zmienić javacna, javaponieważ nie każdy ma zainstalowany pakiet JDK; tylko JRE
Hanxue
1
@AlexisWilke teraz java zamiast javac
bbaassssiiee
7

Wydaje się, że standardowa instalacja Ubuntu zawiera różne wersje Javy /usr/lib/jvm. javac, Java można znaleźć na swojej drodze będzie dowiązanie do tego.

Nie ma problemu z zainstalowaniem własnej wersji Java w dowolnym miejscu, o ile ustawisz JAVA_HOMEzmienną środowiskową i upewnij się, że nowa Java jest binna swojej ścieżce.

Prostym sposobem na to jest stworzenie strony głównej Java jako miękkiego łącza, więc jeśli chcesz zaktualizować lub zmienić wersje, musisz tylko zmienić katalog, na który wskazuje - np:

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

/opt/jdk --> /opt/jdk1.6.011
Steve B.
źródło
rekomendowanie rozwiązań Ubuntu z Debianem jest niebezpieczne. Mogą się różnić.
RichieHH
4
Zwróć uwagę, że żądający powiedział, że użył Kubuntu, więc rozwiązania Ubuntu powinny być w porządku.
Joseph Holsten
0

Zwykle nie mam żadnej zmiennej środowiskowej JAVA_HOME. Java może to skonfigurować samodzielnie. Wewnątrz java powinna być dostępna właściwość systemowa java.home.

iny
źródło
Ja też go zwykle nie mam. Jeśli jednak tego nie skonfiguruję, grails narzeka, że ​​nie ma JAVA_HOME i przerywa pracę.
Luis Soeiro,
1
ant potrzebuje tego również w debianie, który jest kontekstem
RichieHH
0

Spróbuj ustawić również zmienną JAVA_LIB.

Cantillon
źródło
0

Jeśli masz problemy z nie znalezieniem plików JAR, upewnię się również, że CLASSPATH jest ustawione tak, aby zawierało lokalizację tych plików. Uważam jednak, że CLASSPATH często musi być ustawione inaczej dla różnych programów i często kończy się tym, że jest czymś, co można ustawić indywidualnie dla poszczególnych programów.

MVang
źródło
0

Odkryłem podobne problemy z pakietami openjdk-6-jre i openjdk-6-jre-headless w Ubuntu.

Mój problem został rozwiązany przez wyczyszczenie pakietów openjdk-6-jre i openjdk-6-jre-headless i ponowne zainstalowanie. Alternatywy są aktualizowane tylko podczas nowej instalacji pakietów openjdk-6-jre i openjdk-6-jre-headless.

Poniżej znajduje się przykład instalacji po oczyszczeniu:

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.
...

Możesz zobaczyć powyżej, że update-alternativesjest uruchamiany, aby ustawić łącza do różnych plików binarnych Java.

Po tej instalacji dostępne są również łącza w /usr/bin, łącza w /etc/alternativesi pliki dla każdego pliku binarnego w /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

Porównajmy to z instalacją bez czyszczenia.

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) ...
...

Jak widać, update-alternativesnie jest wyzwalany.

Po tej instalacji nie ma żadnych plików dla plików binarnych Java w programie /var/lib/dpkg/alternatives, żadnych łączy /etc/alternativesani łączy w /usr/bin.

Usuwanie plików /var/lib/dpkg/alternativesrównież się psuje update-java-alternatives.

Saturn Junction
źródło
0

Ubuntu 12.04 to działa ...

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

Alex
źródło
0

Jako aktualizacja dla użytkownika Fedory, alternatywą jest ustawienie bieżącego katalogu java na / usr / java / default

więc musisz ustawić JAVA_HOME na / usr / java / default, aby zawsze mieć alternatywy aktualnie wybrane w ścieżce klas

HTH!

Greg Henry
źródło
0

Zawsze ustawiam JAVA_HOME zgodnie z /usr/bin/java.

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

W ten sposób obie alternatywy wskazują tę samą lokalizację

Ivo
źródło
-1

O ile pamiętam, zamiast skryptu update-alternatives użyłem skryptu update-java-alternatives. I ustawił poprawnie JAVA_HOME.

Tobias Schulte
źródło
Tak nie jest w Ubuntu 20.4
Martin Schröder
-1

Zobacz, co robi polecenie update-alternatives (ma miłego człowieka ...).

Krótko - co się dzieje, gdy masz java-sun-1.4 i java-opensouce-1.0 ... która z nich bierze "java"? Debian „/ usr / bin / java” jest dowiązaniem symbolicznym, a „/usr/bin/java-sun-1.4” jest alternatywą dla „/ usr / bin / java”

Edycja: Jak powiedział Richard, update-alternativesnie wystarczy. Właściwie musisz użyć update-java-alternatives. Więcej informacji na:

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

elcuco
źródło
update-alternatives to za mało. Musi to być update-java-alternatives
RichieHH
@Richard: tak, zauważyłem. Pierwszy raz o tym myślę, więc przeszukałem go i znalazłem dokumentację Ubuntu. Dzięki!
elcuco
-2

Moim właściwym celem zawsze było pobranie go z Sun i zainstalowanie w ten sposób. Wtedy wiesz dokładnie, w którym katalogu wszystko się znajduje.

Ale jeśli wolisz trzymać się dziwnego sposobu, w jaki Debian instaluje go, moim najlepszym przypuszczeniem byłby katalog nadrzędny tuż nad miejscem, w którym znajdują się pliki binarne java i javac.

(od kiedy podasz to w swojej ścieżce to $ JAVA_HOME / bin) (Więc w twoim przypadku byłoby to ... $ JAVA_HOME / share a $ JAVA_HOME byłoby / usr?)

Ech, to nie brzmi dobrze ...

Jestem również zainteresowany odpowiedzią na to pytanie!

leeand00
źródło
Używając Debiana, naprawdę musisz trzymać się struktur Debiana, bo inaczej późniejsze aktualizacje systemu spowodują uszkodzenie systemu.
RichieHH