Was ist das richtige Ziel für die Umgebungsvariable JAVA_HOME für eine Linux OpenJDK Debian-basierte Distribution?

89

JAVA_HOMEMuss in Windows auf den JDK-Installationsordner verweisen ( JAVA_HOME/binder alle ausführbaren Dateien und JAVA_HOME/libsalle Standardbibliotheken enthält jar).

Wenn ich das JDK-Bundle von Sun herunterlade und unter Linux installiere, ist es das gleiche Verfahren.

Ich muss jedoch Kubuntus Standard-OpenJDK-Paket verwenden. Das Problem ist, dass alle ausführbaren Dateien in platziert werden /usr/bin. Aber die Gläser werden hineingelegt /usr/share/java. Da sie sich nicht im selben JAVA_HOMEOrdner befinden, habe ich Probleme mit Grails und möglicherweise Probleme mit anderen Anwendungen, die die Standard-Java-Struktur erwarten.

  1. Wenn ich benutze:

    JAVA_HOME=/usr

    Alle Anwendungen und Skripte, die eine ausführbare Java-Datei verwenden möchten, können das Standardverfahren verwenden call $JAVA_HOME/bin/executable. Da jedoch die Gläser an einem anderen Ort sind, sind sie nicht immer gefunden (Beispiel: in Grails Ich bin immer ClassDefNotFoundfür native2ascii).

  2. Auf der anderen Seite, wenn ich benutze:

    JAVA_HOME=/usr/share/java

    Keiner der Java ausführbaren Dateien ( java, javacusw.) gefunden werden kann.

Wie geht man also mit der JAVA_HOMEVariablen in einem Debian-basierten Linux richtig um ?

Danke für deine Hilfe, Luis

Luis Soeiro
quelle

Antworten:

97

Was für mich endlich funktioniert hat (Grails funktioniert jetzt reibungslos), ist fast so, wie Steve B. darauf hingewiesen hat:

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

Auf diese Weise funktioniert es JAVA_HOMEimmer noch , wenn der Benutzer das Standard-JDK für das System ändert .

default-java ist ein Symlink zur aktuellen JVM.

Luis Soeiro
quelle
6
Es scheint, dass es keinen solchen Link auf Debian 7 gibt
a1an
3
Auf RHEL5.10 ist es / usr / lib / jvm / java
Brian
1
Ich habe / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn
Für Oracle Linux 7 (dies sollte für CentOS und RHEL gelten) habe ich eine Datei mit dem Namen /etc/profile.d/java.sh erstellt und mit folgendem Inhalt gefüllt: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME Nach dem erneuten Sourcing von / etc / profile (durch Ausführen von source / etc / profile) wurde JAVA_HOME wie erwartet gefüllt.
darnold0714
75

Wenn Sie Alternativen zum Verwalten mehrerer Java-Versionen verwenden, können Sie die JAVA_HOMEbasierend auf dem symlinked Java (oder Java) wie folgt festlegen:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
quelle
3
Dies funktioniert für mich: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan
4
Eine brillante Lösung löst meine jahrelangen Kopfschmerzen mit JAVA_HOME, das auf verschiedene Stellen auf verschiedenen Betriebssystemen verweist.
Datageek
3
Beachten Sie, dass diese clevere Lösung nicht auf Distributionen wie Gentoo funktioniert, die /usr/bin/javaauf ein Skript verweisen ( /usr/libexec/eselect-java/run-java-tool.bash). Trotzdem ist es ein schöner Ansatz. Das einzige, was ich ändern würde, ist die Verwendung von Bashs eingebauter Substitution, um das Laichen zu vermeiden sed, z. B.:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO
Das funktioniert gut :) Vielleicht möchten Sie zu ändern javac, javaweil nicht jeder das JDK installiert hat; nur die JRE
Hanxue
@AlexisWilke jetzt Java anstelle von
Javac
6

Die Standard-Ubuntu-Installation scheint die verschiedenen Java-Versionen einzufügen /usr/lib/jvm. Das javacJava, das Sie in Ihrem Pfad finden, wird mit diesem Softlink verknüpft.

Es ist kein Problem, Ihre eigene Java-Version an einem beliebigen Ort zu installieren, solange Sie die JAVA_HOMEUmgebungsvariable festlegen und sicherstellen, dass sich das neue Java binauf Ihrem Pfad befindet.

Eine einfache Möglichkeit, dies zu tun, besteht darin, dass das Java-Home als Softlink vorhanden ist. Wenn Sie also Versionen aktualisieren oder wechseln möchten, müssen Sie nur das Verzeichnis ändern, auf das dies verweist - z.

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

/opt/jdk --> /opt/jdk1.6.011
Steve B.
quelle
Es ist gefährlich, Ubuntu-Lösungen mit Debian zu empfehlen. Sie können und können variieren.
RichieHH
4
Beachten Sie, dass der Anforderer Kubuntu verwendet hat, sodass Ubuntu-Lösungen in Ordnung sein sollten.
Joseph Holsten
0

Normalerweise habe ich keine JAVA_HOME-Umgebungsvariable. Java kann es selbst einrichten. Innerhalb von Java sollte die Systemeigenschaft java.home verfügbar sein.

iny
quelle
Normalerweise habe ich es auch nicht. Wenn ich es jedoch nicht einrichte, beschwert sich grails, dass JAVA_HOME nicht da ist und bricht ab.
Luis Soeiro
Ameise braucht es auch in Debian, was der Kontext ist
RichieHH
0

Versuchen Sie auch, die Variable JAVA_LIB festzulegen.

Cantillon
quelle
0

Soweit ich mich erinnere, habe ich anstelle der Update-Alternativen das Skript update-java-alternatives verwendet. Und es hat das JAVA_HOME für mich richtig eingestellt.

Tobias Schulte
quelle
0

Wenn Sie Probleme mit nicht gefundenen JAR-Dateien haben, würde ich auch sicherstellen, dass Ihr CLASSPATH so eingestellt ist, dass er den Speicherort dieser Dateien enthält. Ich finde jedoch, dass der KLASSENPFAD für verschiedene Programme oft unterschiedlich eingestellt werden muss und häufig für einzelne Programme eindeutig festgelegt werden muss.

MVang
quelle
0

Ich habe ähnliche Probleme mit den Headless-Paketen openjdk-6-jre und openjdk-6-jre-headless in Ubuntu entdeckt.

Mein Problem wurde gelöst, indem die Pakete openjdk-6-jre und openjdk-6-jre-headless gelöscht und neu installiert wurden. Die Alternativen werden nur bei einer Neuinstallation der Pakete openjdk-6-jre und openjdk-6-jre-headless aktualisiert.

Unten finden Sie ein Beispiel für die Installation nach dem Löschen:

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

Oben sehen Sie, dass ausgeführt update-alternativeswird, um Links für die verschiedenen Java-Binärdateien einzurichten.

Nach dieser Installation gibt es auch Links in /usr/bin, Links in /etc/alternativesund Dateien für jede Binärdatei in /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

Lassen Sie uns dies mit der Installation ohne Löschen vergleichen.

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

Wie Sie sehen, update-alternativeswird nicht ausgelöst.

Nach dieser Installation gibt es keine Dateien für die Java-Binärdateien in /var/lib/dpkg/alternatives, keine Links in /etc/alternativesund keine Links in /usr/bin.

Das Entfernen der Dateien in /var/lib/dpkg/alternativesbricht auch update-java-alternatives.

Saturn Junction
quelle
0

Ubuntu 12.04 das funktioniert ...

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

Alex
quelle
0

Als Update für Fedora-Benutzer setzen Alternativen das aktuelle Java-Verzeichnis auf / usr / java / default

Daher müssen Sie JAVA_HOME auf / usr / java / default setzen, damit in Ihrem Klassenpfad immer alternative aktuelle Auswahlmöglichkeiten vorhanden sind

HTH!

Greg Henry
quelle
0

Ich neige immer dazu, das JAVA_HOME entsprechend dem einzustellen /usr/bin/java.

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

Auf diese Weise verweisen beide Alternativen auf denselben Ort

Ivo
quelle
-1

Mein richtiges Ziel war es immer, es von Sun herunterzuladen und einfach so zu installieren. Dann wissen Sie genau, in welches Verzeichnis alles geht.

Aber wenn Sie es vorziehen, bei der seltsamen Art und Weise zu bleiben, wie Debian es installiert, wäre meine beste Vermutung das übergeordnete Verzeichnis direkt über dem Ort, an dem sich die Java- und Java-Binärdateien befinden.

(seitdem, wenn Sie es in Ihrem Pfad angeben, ist es $ JAVA_HOME / bin) (In Ihrem Fall wäre es also ... $ JAVA_HOME / share und $ JAVA_HOME wäre / usr?)

Eh, das klingt nicht richtig ...

Ich bin auch daran interessiert, die Antwort darauf zu hören!

leeand00
quelle
Wenn Sie Debian verwenden, müssen Sie sich wirklich an die Debian-Strukturen halten. Spätere Systemaktualisierungen führen zu einem Systemausfall.
RichieHH
-1

Bitte sehen Sie, was der Befehl update-alternatives macht (er hat einen netten Mann ...).

Kurz - was passiert, wenn Sie Java-Sun-1.4 und Java-OpenSouce-1.0 haben ... welches nimmt "Java"? Das Debian "/ usr / bin / java" ist ein symbolischer Link und "/usr/bin/java-sun-1.4" ist eine Alternative zu "/ usr / bin / java".

Edit: Wie Richard sagte, update-alternativesist nicht genug. Sie müssen tatsächlich verwenden update-java-alternatives. Weitere Infos unter:

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

elcuco
quelle
Update-Alternativen reichen nicht aus. Es muss Update-Java-Alternativen sein
RichieHH
@ Richard: Ja, bemerkt. Als ich das erste Mal darüber nachdachte, googelte ich und fand Ubuntus Dokumentation. Vielen Dank!
Elcuco