Qual è il target corretto per la variabile d'ambiente JAVA_HOME per una distribuzione Linux OpenJDK basata su Debian?


91

In Windows, JAVA_HOMEdeve puntare alla cartella di installazione JDK (in modo che JAVA_HOME/bincontenga tutti gli eseguibili e JAVA_HOME/libscontenga tutte le jarlibrerie predefinite ).

Se scarico il pacchetto JDK di Sun e lo installo su Linux, la procedura è la stessa.

Tuttavia, ho bisogno di usare il pacchetto OpenJDK predefinito di Kubuntu. Il problema è che tutti gli eseguibili sono inseriti in /usr/bin. Ma i barattoli vengono messi dentro /usr/share/java. Dato che non si trovano nella stessa JAVA_HOMEcartella, ho problemi con Grails e forse ci saranno problemi con altre applicazioni che prevedono la struttura Java standard.

  1. Se uso:

    JAVA_HOME=/usr
    

    Tutte le applicazioni e gli script che desiderano utilizzare qualsiasi eseguibile Java possono utilizzare la procedura standard call $JAVA_HOME/bin/executable. Tuttavia, dal momento che i vasi sono in un posto diverso, non sono sempre trovato (esempio: nel graal mi sto ClassDefNotFoundper native2ascii).

  2. D'altra parte, se uso:

    JAVA_HOME=/usr/share/java
    

    Nessuno degli eseguibili Java ( java, javac, ecc) può essere trovato.

Allora, qual è il modo corretto di gestire la JAVA_HOMEvariabile in un Linux basato su Debian?

Grazie per il tuo aiuto, Luis

Risposte:


98

Quello che alla fine ha funzionato per me (Grails ora funziona senza problemi) sta andando quasi come ha sottolineato Steve B.

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

In questo modo, se l'utente modifica il JDK predefinito per il sistema, JAVA_HOMEfunziona ancora.

default-java è un collegamento simbolico alla JVM corrente.


6
Sembra che non ci sia un collegamento simile su Debian 7
a1an

3
Su RHEL5.10, è / usr / lib / jvm / java
Brian

1
Ho usato / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn

Per Oracle Linux 7 (questo dovrebbe applicarsi a CentOS e RHEL), ho creato un file chiamato /etc/profile.d/java.sh e l'ho popolato con quanto segue: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME dopo il re-sourcing di / etc / profile (eseguendo source / etc / profile) JAVA_HOME è stato popolato come previsto.
darnold0714

80

Se si utilizzano alternative per gestire più versioni di java, è possibile impostare il JAVA_HOMEbasato sul java (o javac) con collegamento simbolico in questo modo:

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

3
Questo funziona per me: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan

4
Soluzione brillante, risolve i miei lunghi mal di testa con JAVA_HOME, che tende a puntare a luoghi diversi su diversi sistemi operativi.
Datageek

3
notare che questa soluzione intelligente non funzionerà su distribuzioni come Gentoo che /usr/bin/javapuntano a uno script ( /usr/libexec/eselect-java/run-java-tool.bash). comunque, è un bel approccio. l'unica cosa che cambierei è usare la sostituzione incorporata di Bash per evitare la sedJAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
deposizione delle

Funziona bene :) Potrebbe essere necessario passare javaca javaperché non tutti hanno installato JDK; solo il JRE
Hanxue

1
@AlexisWilke ora java invece di javac
bbaassssiiee

7

L'installazione standard di Ubuntu sembra includere le varie versioni di Java /usr/lib/jvm. Il javacjava che trovi nel tuo percorso sarà softlink a questo.

Non c'è problema con l'installazione della tua versione di Java ovunque tu voglia, purché imposti la JAVA_HOMEvariabile d'ambiente e assicurati di avere il nuovo Java binsul tuo percorso.

Un modo semplice per farlo è fare in modo che la home Java esista come softlink, in modo che se vuoi aggiornare o cambiare versione devi solo cambiare la directory a cui punta - ad esempio:

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

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

è pericoloso consigliare soluzioni Ubuntu con Debian. Possono e variano.
RichieHH

4
Nota che il richiedente ha detto di aver usato Kubuntu, quindi le soluzioni Ubuntu dovrebbero andare bene.
Joseph Holsten

0

Di solito non ho alcuna variabile d'ambiente JAVA_HOME. Java può configurarlo da solo. All'interno di java dovrebbe essere disponibile la proprietà di sistema java.home.


Di solito non ce l'ho neanche io. Tuttavia, se non lo configuro, Grails si lamenta del fatto che JAVA_HOME non è presente e si interrompe.
Luis Soeiro

1
anche ant ne ha bisogno in Debian che è il contesto
RichieHH


0

Se hai problemi con i file JAR che non vengono trovati, mi assicurerei anche che il tuo CLASSPATH sia impostato per includere la posizione di quei file. Trovo tuttavia che CLASSPATH spesso debba essere impostato in modo diverso per programmi diversi e spesso finisce per essere qualcosa da impostare in modo univoco per i singoli programmi.



0

Ho scoperto problemi simili con i pacchetti openjdk-6-jre e openjdk-6-jre-headless in Ubuntu.

Il mio problema è stato risolto eliminando i pacchetti openjdk-6-jre e openjdk-6-jre-headless e reinstallandoli. Le alternative vengono aggiornate solo su una nuova installazione dei pacchetti openjdk-6-jre e openjdk-6-jre-headless.

Di seguito è riportato un esempio di installazione dopo l'eliminazione:

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

Puoi vedere sopra che update-alternativesviene eseguito per impostare i collegamenti per i vari binari Java.

Dopo questa installazione, ci sono anche collegamenti /usr/bin, collegamenti /etc/alternativese file per ogni file binario 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

Confrontiamolo con l'installazione senza spurgare.

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

Come vedi, update-alternativesnon viene attivato.

Dopo questa installazione, non ci sono file per i binari Java in /var/lib/dpkg/alternatives, nessun link in /etc/alternativese nessun link in /usr/bin.

Anche la rimozione dei file /var/lib/dpkg/alternativessi interrompe update-java-alternatives.


0

Ubuntu 12.04 funziona ...

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


0

Come aggiornamento per l'utente fedora, le alternative impostano la directory java corrente su / usr / java / default

quindi devi impostare il tuo JAVA_HOME su / usr / java / default per avere sempre la selezione corrente delle alternative nel tuo classpath

HTH!


0

Tendo sempre a impostare JAVA_HOME in base a /usr/bin/java.

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

In questo modo, entrambe le alternative puntano alla stessa posizione


-1

Per quanto ricordo, ho usato lo script update-java-alternatives invece di update-alternatives. E ha impostato correttamente JAVA_HOME per me.


Non in Ubuntu 20.4
Martin Schröder

-1

Si prega di vedere cosa fa il comando update-alternatives (ha un uomo simpatico ...).

In breve, cosa succede quando hai java-sun-1.4 e java-opensouce-1.0 ... quale prende "java"? Debian "/ usr / bin / java" è un collegamento simbolico e "/usr/bin/java-sun-1.4" è un'alternativa a "/ usr / bin / java"

Modifica: come ha detto Richard, update-alternativesnon è abbastanza. Hai davvero bisogno di usare update-java-alternatives. Maggiori informazioni su:

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


update-alternatives non è sufficiente. Deve essere update-java-alternatives
RichieHH

@Richard: sì, notato. La prima volta che ci penso, ho cercato su Google e ho trovato la documentazione di Ubuntu. Grazie!
elcuco

-2

Il mio obiettivo corretto è sempre stato quello di scaricarlo da Sun e installarlo in questo modo. Quindi sai esattamente in quale directory va tutto.

Ma se preferisci restare con lo strano modo in cui Debian lo installa, la mia ipotesi migliore sarebbe la directory genitore appena sopra dove si trovano i binari java e javac.

(da quando lo specifichi nel tuo percorso è $ JAVA_HOME / bin) (Quindi nel tuo caso sarebbe ... $ JAVA_HOME / share e $ JAVA_HOME sarebbe / usr?)

Eh, non suona bene ...

Anche a questo mi interessa sentire la risposta!


Quando si usa Debian è davvero necessario rimanere con le strutture Debian o gli aggiornamenti successivi del sistema ti lasceranno con un sistema guasto.
RichieHH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.