L’extension de l’incohérence concernant les chemins d’installation de Java dans Unix?

J’ai installé Java dans mon système environ 6 mois. J’ai suivi aveuglément l’ instruction de ce document ici. J’ai téléchargé le jdk, l’ai décompressé, défini les chemins Java_Home, Path conformément aux instructions de la doc.

Aujourd’hui, je voulais savoir quel Java est installé sur mon système et où. Donc, je l’ai cherché en ligne et a exécuté cette commande

readlink -f $ (quel Java)

Ça dit

/usr/local/java/jre1.7.0_40/bin/java

Mais quand je vérifie la variable Java_Home, cela dit

/usr/lib/jvm/jdk1.7.0_40

Ici, les deux chemins se réfèrent à jdk 1.7, mais ils sont différents. L’un est dans / usr / lib / jvm et l’autre dans / user / local / java.

Je pense que, en raison d’une certaine confusion, j’ai mal défini le java_home. Je dois avoir dégainé jdk à deux endroits. Et, lors de la configuration de java_home, j’ai pris un chemin incorrect. Soit ça, soit il y a un lien entre deux endroits, ce qui est dû à une commande que je ne connaissais pas.

Quoi qu’il en soit, je peux lancer des programmes java correctement et exécuter eclipse, donc tout va bien et pour cette raison je ne l’ai jamais remarqué.

Mais, je voudrais savoir si je dois corriger la variable java_home pour garantir que les deux commandes ci-dessus renvoient la même valeur. Et, si ce n’est pas nécessaire, pourquoi est-ce que cela fonctionne correctement lorsque «readlink -f $ (quel java)» et «java_home» retournent un chemin différent.

readlink -f $(which java) indique simplement quel fichier est exécuté lorsque vous tapez java dans votre shell. JAVA_HOME est une variable d’environnement utilisée par certains programmes pour localiser Java. Puisque les deux variables désignent un jre / jdk de 1.7 jr, cela ne devrait pas avoir beaucoup d’importance. Les programmes utilisant JAVA_HOME utiliseront le JDK java et les programmes utilisant simplement la ligne de commande java utiliseront la version JRE.

Si vous avez vraiment besoin de les changer pour pointer vers le même Java, alors vous ne devez PAS changer votre JAVA_HOME mais votre java , car il est préférable de pointer vers un JDK, car certains programmes JAVA_HOME pointer sur un JDK (par exemple, parce que ces programmes ont besoin de javac qui n’est pas inclus dans le JRE).

Votre JAVA_HOME doit correspondre à la version de Java choisie. J’ai défini mon JAVA_HOME avec les éléments suivants:

 export JAVA_HOME=`readlink -f /usr/bin/javac | sed 's|/bin/javac||g'` 

J’utilise la commande Debain / Ubuntu update-java-alternatives pour choisir la version de Java que j’utilise. Il s’assure de ne pas simplement mettre à jour /usr/bin/java , mais aussi toutes les autres commandes Java comme javac et javadoc .

 sudo update-java-alternatives --set java-7-oracle 

Vous pouvez obtenir une liste des dissortingbutions Java installées sur votre système:

 update-java-alternatives -l 

La plupart des programmes ne dépendent pas à la fois de JAVA_HOME et de java . Généralement, ils s’appuient sur l’un ou l’autre, mais pas les deux. Donc, pour une application donnée, elle fonctionnera probablement, mais différentes applications peuvent être exécutées avec des versions différentes de Java. D’après mon expérience, la plupart des applications Java installées utiliseront /usr/bin/java et la plupart des environnements de développement utiliseront JAVA_HOME.

Si vous spécifiez JAVA_HOME et /usr/bin/java correctement, assurez-vous que presque toutes les applications Java fonctionnent avec votre version préférée (et la dernière) de Java.

Il existe toutefois des exceptions notables à cette règle. Certains programmes qui utilisent l’exécution sous Java ont leur propre configuration pour choisir la version de Java qu’ils utilisent.

Par exemple, je lance le serveur tomcat7 et je dois avoir le fichier de configuration /usr/share/tomcat7/bin/setenv.sh qui définit le répertoire JAVA_HOME pour cette application uniquement:

 JAVA_HOME=`readlink -f /usr/bin/javac | sed 's|/bin/javac||g'` JAVA_OPTS="-Xms256m -Xmx2048m -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512M -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" 

D’autres programmes comme Eclipse ignorent complètement JAVA_HOME . Il possède son propre algorithme pour déterminer sous quelle version de Java il sera exécuté et une option de ligne de commande -vm qui vous permet de spécifier vos préférences.

C’est deux choses différentes.

Le premier vous indique où se trouve le JRE (Java Runtime Environment), le binary java. Vous en avez besoin pour exécuter des fichiers JAR.

JAVA_HOME vous indique où se trouve le JDK (Java Development Kit), le binary javac. Vous en avez besoin pour comstackr et comstackr les fichiers JAR.