Quelle est la bonne cible pour la variable d’environnement JAVA_HOME pour une dissortingbution Linux OpenJDK basée sur Debian?

Sous Windows, JAVA_HOME doit pointer vers le dossier d’installation de JDK (afin que JAVA_HOME/bin contienne tous les exécutables et que JAVA_HOME/libs contienne toutes les bibliothèques jar par défaut).

Si je télécharge le kit JDK de Sun et l’installe sous Linux, la procédure est la même.

Cependant, je dois utiliser le package OpenJDK par défaut de Kubuntu. Le problème est que tous les exécutables sont placés dans /usr/bin . Mais les jars sont placés dans /usr/share/java . Comme ils ne sont pas sous le même dossier JAVA_HOME , je rencontre des problèmes avec Grails et peut-être que d’autres applications attendent la structure Java standard.

  1. Si j’utilise:

     JAVA_HOME=/usr 

    Toutes les applications et tous les scripts qui souhaitent utiliser un exécutable Java peuvent utiliser la procédure standard call $JAVA_HOME/bin/executable . Cependant, les jars étant situés à un endroit différent, ils ne sont pas toujours trouvés (exemple: dans grails je reçois ClassDefNotFound pour native2ascii ).

  2. Par contre, si j’utilise:

     JAVA_HOME=/usr/share/java 

    Aucun des exécutables Java ( java , javac , etc.) ne peut être trouvé.

Alors, quelle est la manière correcte de gérer la variable JAVA_HOME dans un Linux basé sur Debian?

Merci pour votre aide, Luis

Ce qui a finalement fonctionné pour moi (Grails fonctionne désormais parfaitement) se déroule presque comme l’a fait remarquer Steve B.:

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

Ainsi, si l’utilisateur modifie le JDK par défaut du système, JAVA_HOME fonctionne toujours.

default-java est un lien symbolique vers la machine virtuelle default-java actuelle.

Si vous utilisez des alternatives, vous pouvez définir le JAVA_HOME basé sur le java symlinké comme ceci:

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

L’installation standard d’Ubuntu semble mettre les différentes versions de Java dans /usr/lib/jvm . Le javac , java que vous trouvez dans votre chemin va se lier à ceci.

L’installation de votre propre version Java ne pose aucun problème, à condition de définir la variable d’environnement JAVA_HOME et de vous assurer que le nouveau bin Java est sur votre chemin.

Un moyen simple de le faire est de faire en sorte que Java home existe en tant que softlink, de sorte que si vous souhaitez mettre à niveau ou changer de version, il vous suffit de modifier le répertoire indiqué – par exemple:

 /usr/bin/java --> /opt/jdk/bin/java, /opt/jdk --> /opt/jdk1.6.011 

Je n’ai généralement aucune variable d’environnement JAVA_HOME. Java peut le configurer lui-même. À l’intérieur de la propriété du système java java.home devrait être disponible.

Essayez également de définir la variable JAVA_LIB.

Pour autant que je m’en souvienne, j’ai utilisé le script update-java-alternatives au lieu des alternatives à la mise à jour. Et il a bien défini le JAVA_HOME pour moi.

Si vous rencontrez des problèmes avec les fichiers JAR qui ne sont pas trouvés, je m’assurerais également que votre CLASSPATH est configuré pour inclure l’emplacement de ces fichiers. Je trouve cependant que le CLASSPATH doit souvent être défini différemment pour différents programmes et finit souvent par être quelque chose à définir de manière unique pour des programmes individuels.

La réponse mise à jour qui résoudra votre problème et également une procédure générale pour installer Oracle Java 7 sur Ubuntu peut être trouvée ici: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

J’ai découvert des problèmes similaires avec les paquets openjdk-6-jre et openjdk-6-jre-headless dans Ubuntu.

Mon problème a été résolu en purgeant les paquets openjdk-6-jre et openjdk-6-jre-headless et en les réinstallant. Les alternatives ne sont mises à jour que sur une nouvelle installation des packages openjdk-6-jre et openjdk-6-jre-headless.

Voici un exemple d’installation après la purge:

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

Vous pouvez voir ci-dessus que update-alternatives est exécuté pour configurer des liens pour les différents binarys Java.

Après cette installation, il existe également des liens dans /usr/bin , des liens dans /etc/alternatives et des fichiers pour chaque fichier binary dans /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 

Nous allons contester cela avec l’installation sans purger.

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

Comme vous le voyez, update-alternatives n’est pas déclenché.

Après cette installation, il n’y a plus de fichiers pour les fichiers binarys Java dans /var/lib/dpkg/alternatives , pas de liens dans /etc/alternatives , ni de liens dans /usr/bin .

La suppression des fichiers dans /var/lib/dpkg/alternatives interrompt également les /var/lib/dpkg/alternatives update-java-alternatives .

Ubuntu 12.04 ça marche …

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

En tant que mise à jour pour l’utilisateur fedora, les alternatives définissent le répertoire java actuel sur / usr / java / default

vous devez donc définir votre JAVA_HOME sur / usr / java / default pour toujours avoir des alternatives de sélection dans votre classpath

HTH!

Ma cible correcte a toujours été de le télécharger depuis Sun et de l’installer de cette façon. Ensuite, vous savez exactement dans quel répertoire tout se passe.

Mais si vous préférez vous en tenir à la façon étrange dont Debian l’installe, ma meilleure hypothèse serait le répertoire parent juste au-dessus de l’emplacement des fichiers binarys java et javac.

(depuis quand vous le spécifiez dans votre chemin c’est $ JAVA_HOME / bin) (Donc dans votre cas ce serait … $ JAVA_HOME / share et $ JAVA_HOME serait / usr?)

Ça ne sonne pas bien …

Je suis intéressé à entendre la réponse à cela aussi!

S’il vous plaît voir ce que la commande update-alternatives fait (il a un homme gentil …).

Bientôt – que se passe-t-il quand vous avez java-sun-1.4 et java-opensouce-1.0 … lequel prend “java”? Debian “/ usr / bin / java” est un lien symbolique et “/usr/bin/java-sun-1.4” est une alternative à “/ usr / bin / java”

Edit: Comme Richard l’a dit, update-alternatives n’est pas suffisant. Vous devez réellement utiliser update-java-alternatives . Plus d’infos sur:

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