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


91

Sous Windows, JAVA_HOMEdoit pointer vers le dossier d'installation JDK (afin qu'il JAVA_HOME/bincontienne tous les exécutables et JAVA_HOME/libscontienne toutes les jarbibliothèques par défaut ).

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

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 bocaux sont placés dedans /usr/share/java. Comme ils ne sont pas dans le même JAVA_HOMEdossier, j'ai des problèmes avec Grails et peut-être qu'il y aura des problèmes avec d'autres applications qui 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, étant donné que les pots sont dans un endroit différent, ils ne sont pas toujours trouvés ( par exemple: dans Grails je deviens ClassDefNotFoundpour native2ascii).

  2. Par contre, si j'utilise:

    JAVA_HOME=/usr/share/java
    

    Aucun des exécutables Java ( java, javac, etc.) se trouve.

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

Merci pour votre aide, Luis

Réponses:


98

Ce qui a finalement fonctionné pour moi (Grails fonctionne maintenant bien), c'est presque comme Steve B. l'a souligné:

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

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

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


6
Il semble qu'il n'y ait pas de lien de ce type sur Debian 7
a1an

3
Sur RHEL5.10, il s'agit de / usr / lib / jvm / java
Brian

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

Pour Oracle Linux 7 (cela devrait s'appliquer à CentOS et RHEL), j'ai créé un fichier appelé /etc/profile.d/java.sh et l'ai rempli avec ce qui suit: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME après avoir réapprovisionné / etc / profile (en exécutant source / etc / profile), JAVA_HOME a été rempli comme prévu.
darnold0714

80

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

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

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

4
Solution brillante, résout mes maux de tête de longues années avec JAVA_HOME, qui a tendance à pointer vers différents endroits sur différents systèmes d'exploitation.
Datageek

3
notez que cette solution intelligente ne fonctionnera pas sur les distributions comme Gentoo qui ont /usr/bin/javapointé vers un script ( /usr/libexec/eselect-java/run-java-tool.bash). encore, c'est une belle approche. la seule chose que je changerais est d'utiliser la substitution intégrée de Bash pour éviter l'apparition sed, par exemple:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO

Cela fonctionne bien :) Vous pouvez vouloir modifier javacà javacar tout le monde a le JDK installé; only the JRE
Hanxue

1
@AlexisWilke maintenant java au lieu de javac
bbaassssiiee

7

L'installation standard d'Ubuntu semble intégrer les différentes versions de Java /usr/lib/jvm. Le javacjava que vous trouverez dans votre chemin sera lié à celui-ci.

Il n'y a aucun problème avec l'installation de votre propre version de Java où vous le souhaitez, tant que vous définissez la JAVA_HOMEvariable d'environnement et assurez-vous d'avoir le nouveau Javabin sur votre chemin.

Un moyen simple de le faire est de faire exister le home Java en tant que lien souple, de sorte que si vous souhaitez mettre à niveau ou changer de version, vous n'avez qu'à changer le répertoire vers lequel cela pointe - par exemple:

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

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

il est dangereux de recommander des solutions Ubuntu avec Debian. Ils peuvent varier et varient.
RichieHH

4
Notez que le demandeur a déclaré qu'il utilisait Kubuntu, les solutions Ubuntu devraient donc convenir.
Joseph Holsten

0

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


Je ne l'ai généralement pas non plus. Cependant, si je ne le configure pas, Grails se plaint que JAVA_HOME n'est pas là et abandonne.
Luis Soeiro

1
fourmi en a besoin aussi dans debian qui est le contexte
RichieHH


0

Si vous rencontrez des problèmes avec les fichiers JAR introuvables, je vous assurerais également que votre CLASSPATH est configuré pour inclure l'emplacement de ces fichiers. Je trouve cependant que le CLASSPATH doit souvent être réglé différemment pour différents programmes et finit souvent par être quelque chose à définir uniquement pour des programmes individuels.



0

J'ai découvert des problèmes similaires avec les packages 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 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 qui update-alternativesest exécuté pour configurer des liens pour les différents binaires Java.

Après cette installation, il existe également des liens dans /usr/bin, des liens dans /etc/alternativeset 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

Contestons 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-alternativesn'est pas déclenché.

Après cette installation, il n'y a aucun fichier pour les binaires Java dans /var/lib/dpkg/alternatives, aucun lien dans /etc/alternativeset aucun lien dans /usr/bin.

La suppression des fichiers est /var/lib/dpkg/alternativeségalement interrompue update-java-alternatives.


0

Ubuntu 12.04 cela fonctionne ...

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


0

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 actuelle dans votre chemin de classe

HTH!


0

J'ai toujours tendance à définir JAVA_HOME selon le /usr/bin/java.

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

De cette façon, les deux alternatives pointent vers le même emplacement


-1

Autant que je me souvienne, j'ai utilisé le script update-java-alternatives au lieu des update-alternatives. Et il a défini le JAVA_HOME pour moi correctement.


Ce n'est pas le cas dans Ubuntu 20.4
Martin Schröder

-1

Veuillez voir ce que fait la commande update-alternatives (elle a un homme sympa ...).

En bref - que se passe-t-il lorsque vous avez java-sun-1.4 et java-opensouce-1.0 ... lequel prend "java"? Il debian "/ usr / bin / java" est un lien symbolique et "/usr/bin/java-sun-1.4" est une alternative à "/ usr / bin / java"

Edit: Comme l'a dit Richard, ce update-alternativesn'est pas suffisant. Vous devez en fait utiliser update-java-alternatives. Plus d'infos sur:

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


update-alternatives ne suffit pas. Il doit être update-java-alternatives
RichieHH

@Richard: oui, noté. La première fois que j'y suis allé, j'ai cherché sur Google et trouvé la documentation d'Ubuntu. Merci!
elcuco

-2

Ma bonne cible a toujours été de le télécharger à partir de Sun et de l'installer de cette façon. Ensuite, vous savez exactement dans quel répertoire tout se trouve.

Mais si vous préférez vous en tenir à la manière étrange dont Debian l'installe, ma meilleure estimation serait le répertoire parent juste au-dessus de l'emplacement des binaires java et javac.

(puisque lorsque 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?)

Eh, ça ne sonne pas bien ...

Je suis également intéressé d'entendre la réponse à cela!


Lorsque vous utilisez Debian, vous devez vraiment vous en tenir aux structures Debian, sinon les mises à jour du système ultérieures vous laisseront avec un système défectueux.
RichieHH
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.