95 votes

Quelle est la cible correcte de la variable d'environnement JAVA_HOME pour une distribution Linux OpenJDK basée sur Debian ?

Dans Windows, JAVA_HOME doit pointer vers le dossier d'installation du JDK (de manière à ce que JAVA_HOME/bin contient tous les exécutables et JAVA_HOME/libs contient toutes les valeurs par défaut jar bibliothèques).

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

Cependant, j'ai besoin d'utiliser le paquetage OpenJDK par défaut de Kubuntu. Le problème est que tous les exécutables sont placés dans le répertoire /usr/bin . Mais les pots sont placés dans /usr/share/java . Comme ils ne sont pas sous le même JAVA_HOME dossier J'ai des problèmes avec Grails et il y aura peut-être des problèmes avec d'autres applications qui s'attendent à la structure standard de Java.

  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 suivante call $JAVA_HOME/bin/executable . Cependant, comme les bocaux se trouvent à un endroit différent, ils ne sont pas toujours trouvés (exemple : dans grails, j'obtiens ClassDefNotFound para native2ascii ).

  2. D'autre part, si j'utilise :

    JAVA_HOME=/usr/share/java

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

Alors, quelle est la façon correcte de traiter le JAVA_HOME variable dans un Linux basé sur Debian ?

Merci pour votre aide, Luis

103voto

Luis Soeiro Points 1878

Ce qui a finalement fonctionné pour moi (Grails fonctionne maintenant sans problème) est de faire presque comme Steve B. l'a indiqué :

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

De cette façon, si l'utilisateur change le JDK par défaut pour le système, JAVA_HOME fonctionne toujours.

default-java est un lien symbolique vers la JVM actuelle.

6 votes

Il semble qu'il n'y ait pas de tel lien sur Debian 7

3 votes

Sur RHEL5.10, c'est /usr/lib/jvm/java.

1 votes

J'ai utilisé /usr/lib/jvm/java-7-openjdk-amd64

86voto

datasmid Points 1664

Si vous utilisez des alternatives pour gérer plusieurs versions de java, vous pouvez définir le paramètre JAVA_HOME basé sur le lien symbolique java (ou javac) comme ceci :

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

3 votes

Cela fonctionne pour moi : JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/jre/bin/java: :")

4 votes

Une solution brillante, qui résout le casse-tête que j'ai eu pendant des années avec JAVA_HOME, qui a tendance à pointer à différents endroits sur différents systèmes d'exploitation.

3 votes

Notez que cette solution astucieuse ne fonctionnera pas sur des distros comme Gentoo qui disposent de /usr/bin/java pointant vers un script ( /usr/libexec/eselect-java/run-java-tool.bash La seule chose que je changerais est l'utilisation de la substitution intégrée de Bash pour éviter de faire apparaître sed par exemple : JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )

7voto

Steve B. Points 23227

L'installation standard d'Ubuntu semble mettre les différentes versions de Java dans /usr/lib/jvm . Le site javac La java que vous trouverez dans votre chemin sera liée à celle-ci.

Il n'y a aucun problème à installer votre propre version de Java où vous le souhaitez, tant que vous définissez la valeur de l'attribut JAVA_HOME et assurez-vous d'avoir la nouvelle variable d'environnement Java bin sur votre chemin.

Un moyen simple d'y parvenir est de faire en sorte que la base de données Java existe sous forme de lien logiciel, de sorte que si vous souhaitez mettre à niveau ou changer de version, il vous suffit de modifier le répertoire vers lequel elle pointe, par exemple :

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

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

0 votes

Il est dangereux de recommander des solutions Ubuntu avec Debian. Elles peuvent varier et varient effectivement.

4 votes

Notez que le demandeur a dit qu'il utilisait Kubuntu, donc les solutions Ubuntu devraient convenir.

0voto

MVang Points 11

Si vous avez des problèmes avec les fichiers JAR qui ne sont pas trouvés, assurez-vous également que votre CLASSPATH est configuré pour inclure l'emplacement de ces fichiers. Je trouve cependant que le CLASSPATH doit souvent être configuré différemment pour différents programmes et qu'il s'agit souvent d'un paramètre unique pour chaque programme.

0voto

Saturn Junction Points 21

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 réinstallant. Les alternatives ne sont mises à jour que lors d'une nouvelle installation des paquets openjdk-6-jre et openjdk-6-jre-headless.

Vous trouverez ci-dessous un exemple d'installation après 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-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.
...

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

Après cette installation, il y a aussi des liens dans /usr/bin liens dans /etc/alternatives et des fichiers pour chaque binaire 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

Comparons cela avec l'installation sans purge.

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

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

Après cette installation, il n'y a pas de fichiers pour les binaires Java dans le dossier de l'utilisateur. /var/lib/dpkg/alternatives aucun lien dans /etc/alternatives et aucun lien dans /usr/bin .

La suppression des fichiers dans /var/lib/dpkg/alternatives casse aussi update-java-alternatives .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X