Qual è la destinazione corretta per la variabile d'ambiente JAVA_HOME per una distribuzione Linux basata su Debian OpenJDK?
-
20-08-2019 - |
Domanda
In Windows, JAVA_HOME
deve puntare alla cartella di installazione JDK (in modo che JAVA_HOME/bin
contenga tutti gli eseguibili e JAVA_HOME/libs
contenga tutte le jar
librerie predefinite).
Se scarico il bundle JDK di Sun e lo installo in Linux, è la stessa procedura.
Tuttavia, devo usare il pacchetto OpenJDK predefinito di Kubuntu. Il problema è che tutti gli eseguibili sono collocati in /usr/bin
. Ma i barattoli vengono posizionati in /usr/share/java
. Dato che non si trovano nella stessa call $JAVA_HOME/bin/executable
cartella, ho problemi con Grails e forse ci saranno problemi con altre applicazioni che prevedono la struttura Java standard.
-
Se uso:
JAVA_HOME=/usr
Tutte le applicazioni e gli script che desiderano utilizzare qualsiasi eseguibile Java possono utilizzare la procedura standard
ClassDefNotFound
. Tuttavia, poiché i barattoli si trovano in un posto diverso, non vengono sempre trovati (esempio: nei graal ottengonative2ascii
perjava
). -
D'altra parte, se uso:
JAVA_HOME=/usr/share/java
Nessuno degli eseguibili Java (
javac
, <=>, ecc.) può essere trovato.
Quindi, qual è il modo corretto di gestire la variabile <=> in un Linux basato su Debian?
Grazie per l'aiuto, Luis
Soluzione
Quello che alla fine ha funzionato per me (Grails ora funziona senza intoppi) sta facendo quasi come Steve B. ha sottolineato:
JAVA_HOME=/usr/lib/jvm/default-java
In questo modo se l'utente modifica il JDK predefinito per il sistema, JAVA_HOME
funziona ancora.
default-java
è un collegamento simbolico alla JVM corrente.
Altri suggerimenti
Se si utilizzano alternative per gestire più versioni java, è possibile impostare JAVA_HOME
in base al java (o javac) con collegamento simbolico in questo modo:
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
L'installazione standard di Ubuntu sembra mettere le varie versioni di Java in /usr/lib/jvm
. Il javac
, java che trovi nel tuo percorso sarà collegato a questo.
Non ci sono problemi con l'installazione della tua versione Java ovunque tu voglia, purché tu imposti la JAVA_HOME
variabile d'ambiente e assicurati di avere la nuova Java bin
sul tuo percorso.
Un modo semplice per farlo è far sì che Java home esista come softlink, in modo che se si desidera aggiornare o cambiare versione, è necessario modificare la directory a cui punta - ad es.
/usr/bin/java --> /opt/jdk/bin/java,
/opt/jdk --> /opt/jdk1.6.011
Di solito non ho alcuna variabile d'ambiente JAVA_HOME. Java può configurarlo da solo. All'interno della proprietà di sistema java java.home dovrebbe essere disponibile.
Prova a impostare anche la variabile JAVA_LIB.
Per quanto mi ricordo, ho usato lo script update-java-alternatives invece di update-alternatives. E ha impostato correttamente JAVA_HOME per me.
In caso di problemi con i file JAR non rilevati, assicurerei anche che CLASSPATH sia impostato per includere la posizione di tali file. Trovo tuttavia che CLASSPATH debba spesso essere impostato in modo diverso per programmi diversi e spesso finisce per essere qualcosa da impostare in modo univoco per i singoli programmi.
La risposta aggiornata che risolverà il tuo problema e anche solo una buona guida generale per l'installazione di Oracle Java 7 su Ubuntu è disponibile qui: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux
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-alternatives
viene eseguito per impostare collegamenti per i vari binari Java.
Dopo questa installazione, ci sono anche collegamenti in /usr/bin
, collegamenti in /etc/alternatives
e file per ogni 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
Contattiamo questo con l'installazione senza eliminazione.
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-java-alternatives
non è attivato.
Dopo questa installazione, non ci sono file per i binari Java in <=>, nessun collegamento in <=> e nessun collegamento in <=>.
La rimozione dei file in <=> interrompe anche <=>.
Ubuntu 12.04 funziona ...
JAVA_HOME = / usr / lib / jvm / java-6-openjdk-i386 / jre
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 una selezione corrente alternativa nel tuo percorso di classe
HTH!
Il mio obiettivo corretto è sempre stato quello di scaricarlo da Sun e installarlo in quel modo. Quindi sai esattamente in quale directory va tutto.
Ma se preferireste attenervi allo strano modo in cui Debian lo installa, la mia ipotesi migliore sarebbe la directory padre 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 sarebbero / usr?)
Eh, non suona bene ...
Sono interessato a sentire la risposta anche a questo!
Guarda cosa fa il comando update-alternatives (ha un bell'uomo ...).
In breve: cosa succede quando hai java-sun-1.4 e java-opensouce-1.0 ... quale si prende " java " ;? Debian & Quot; / usr / bin / java & Quot; è il collegamento simbolico e " /usr/bin/java-sun-1.4 " è un'alternativa a " / usr / bin / java "
Modifica:
Come ha detto Richard, update-alternatives
non è abbastanza. In realtà è necessario utilizzare update-java-alternatives
. Maggiori informazioni su: