2009-03-19 13 views
71

W systemie Windows JAVA_HOME musi wskazywać folder instalacyjny JDK (tak, aby zawierał wszystkie pliki wykonywalne, a JAVA_HOME/libs zawiera wszystkie domyślne biblioteki jar).Jaki jest właściwy cel dla zmiennej środowiskowej JAVA_HOME dla dystrybucji opartej na systemie Linux OpenJDK opartej na Debianie?

Po pobraniu pakietu JDK Sun i zainstalowaniu go w systemie Linux, jest to ta sama procedura.

Potrzebuję jednak użyć domyślnego pakietu Kubuntu OpenJDK. Problem polega na tym, że wszystkie pliki wykonywalne są umieszczone w /usr/bin. Ale słoiki są umieszczone w /usr/share/java. Ponieważ nie znajdują się pod tym samym folderem JAVA_HOME, mam problem z Grails i być może wystąpią 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żyć dowolnego pliku wykonywalnego Javy można użyć standardowej procedury call $JAVA_HOME/bin/executable. Jednakże, ponieważ słoiki są w innym miejscu, nie zawsze są znalezione (przykład: w grails otrzymuję ClassDefNotFound dla native2ascii).

  2. Z drugiej strony, jeśli mogę użyć:

    JAVA_HOME=/usr/share/java 
    

    Żaden z plików wykonywalnych Java (java, javac, itd.) Można znaleźć.

Jaki jest poprawny sposób obsługi zmiennej JAVA_HOME w systemie Linux opartym na Debianie?

Dzięki za pomoc, Luis

+2

Nie mogę uwierzyć, że mody nie zamknęły tego użytecznego pytania jako "nie na temat"! – HDave

Odpowiedz

87

Co ostatecznie pracował dla mnie (Grails teraz działa płynnie) robi prawie jak Steve B. wskazał:

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

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

jest dowiązaniem symbolicznym do aktualnej maszyny JVM.

+5

Wygląda na to, że nie ma takiego odnośnika na Debianie 7 – a1an

+3

Na RHEL5.10 jest to/usr/lib/jvm/java – Brian

+1

Użyłem/usr/lib/jvm/java-7-openjdk-amd64 –

-1

Moja poprawny cel zawsze było go pobrać ze Słońcem i po prostu zainstalować go w ten sposób. Wtedy wiesz dokładnie, w którym katalogu wszystko się znajduje.

Ale jeśli wolisz pozostać w dziwny sposób, w jaki Debian go instaluje, moim najlepszym przypuszczeniem jest katalog nadrzędny tuż nad miejscem, w którym znajdują się pliki binarne java i javac.

(od kiedy podasz go na swojej drodze to $ JAVA_HOME/bin) (Więc w twoim przypadku będzie to ... $ JAVA_HOME/akcji i $ JAVA_HOME byłoby/usr?)

Eh, to nie brzmi dobrze ...

Chciałbym usłyszeć odpowiedź na to również!

+0

Korzystając z debiana, naprawdę powinieneś zachować struktury debian, a późniejsze aktualizacje systemu spowodują uszkodzenie systemu. – RichieHH

0

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

+0

Zwykle też tego nie mam. Jeśli jednak go nie ustawię, grails narzeka, że ​​JAVA_HOME nie istnieje i przerywa. –

+0

mrówka potrzebuje tego również w debian, co jest kontekstem: – RichieHH

6

Standardowa instalacja Ubuntu wydaje się zawierać różne wersje Java w wersji /usr/lib/jvm. javac, java, które znajdziesz na swojej ścieżce, będzie łagodnie linkować do tego.

Nie ma problemu z instalacją własnej wersji Java w dowolnym miejscu, o ile ustawisz zmienną środowiskową JAVA_HOME i upewnij się, że nowa ścieżka Java bin znajduje się na Twojej ścieżce.

Prostym sposobem na to jest mieć w domu Java istnieć jako dowiązanie, tak, że jeśli chcesz, aby uaktualnić lub przełączyć wersje trzeba tylko zmienić katalog, który to wskazuje - np

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

/opt/jdk --> /opt/jdk1.6.011 
+0

Niebezpiecznie jest zalecać rozwiązania Ubuntu z Debianem. Mogą i są różne. – RichieHH

+3

Uwaga, że ​​requester powiedział, że używał Kubuntu, więc rozwiązania Ubuntu powinny być w porządku. –

-1

Zobacz, co robi polecenie aktualizacji alternatywnych (ma miłego mężczyznę ...).

Krótko mówiąc - co się dzieje, gdy masz java-sun-1.4 i java-opensouce-1.0 ... który z nich przyjmuje "java"? To debian "/ usr/bin/java" jest linkiem symbolicznym i "/usr/bin/java-sun-1.4" jest alternatywą dla "/ usr/bin/java"

Edit: Jak powiedział Richard, update-alternatives nie wystarcza. W rzeczywistości musisz użyć update-java-alternatives. Więcej informacji na:

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

+0

update-alternatives is not dość. Musi to być aktualizacja-java-alternatywy – RichieHH

+0

@Richard: tak, zauważyć. Pierwszy raz o tym myślę, więc wybrałem go i znalazłem dokumentację Ubuntu. Dzięki! – elcuco

0

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

0

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

1

W razie problemów z nieodnalezieniem plików JAR zapewniam również, że zmienna CLASSPATH jest ustawiona tak, aby uwzględniała lokalizację tych plików. Uważam jednak, że CLASSPATH często musi być ustawiony inaczej dla różnych programów i często kończy się czymś, co można ustawić indywidualnie dla poszczególnych programów.

48

Jeśli używasz alternatywy, można ustawić JAVA_HOME w oparciu o dowiązane Java tak:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") 
+0

To działa, z wyjątkiem mam "java", a nie "javac". –

+3

To działa dla mnie: JAVA_HOME = $ (readlink -f/usr/bin/java | sed "s:/jre/bin/java ::") – dpnsan

+3

Doskonałe rozwiązanie, rozwiązuje moje wieloletnie bóle głowy za pomocą JAVA_HOME, które ma tendencję do wskazywania do różnych miejsc w różnych systemach operacyjnych. – Datageek

1

odkryłem podobne problemy z openjdk-6-jre i pakietów openjdk-6-jre-headless w Ubuntu.

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

Poniżej jest przykład instalacji po przepłukaniu:

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

widać powyżej tej update-alternatives prowadzony jest założyć linki do różnych plików binarnych Javy.

Po tej instalacji znajdują się również łącza w /usr/bin, linki w /etc/alternatives i 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 

Zróbmy to, instalując 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-alternatives nie jest wyzwalane.

Po tej instalacji nie ma plików dla plików binarnych Java w /var/lib/dpkg/alternatives, bez odnośników w /etc/alternatives i bez odnośników w /usr/bin.

Usunięcie plików w /var/lib/dpkg/alternatives powoduje również zerwanie update-java-alternatives.

0

Ubuntu 12.04 to działa ...

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

0

jako aktualizacja dla użytkowników Fedory alternatywy ustawić bieżący katalog Java /usr/java/default

więc trzeba ustawić JAVA_HOME do katalogu/usr/java/default zawsze mieć alternatywy curent wyboru w ścieżce klas

HTH!

Powiązane problemy