Qual è la destinazione corretta per la variabile d'ambiente JAVA_HOME per una distribuzione Linux basata su Debian OpenJDK?

StackOverflow https://stackoverflow.com/questions/663658

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.

  1. 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 ottengo native2ascii per java).

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

È stato utile?

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:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top