(Je ne savais pas si cela devait continuer avec SU ... la migration est certainement une option, mais plus de programmeurs lisent les questions ici, alors voici).
J'utilise Mac OS X 10.8.4 et le JDK 1.6.0_51 d'Apple est installé ainsi que le JDK 1.7.0_25 d'Oracle. J'ai récemment installé le JDK d'aperçu 1.8 d'Oracle pour certains logiciels en pré-version qui en ont besoin. Maintenant, quand je lance / usr / libexec / java_home, j'obtiens ceci:
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
1.7.0_25, x86_64: "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
1.6.0_51-b11-457, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Génial.
Cependant, en cours d'exécution:
$ java -version
Retour:
java version "1.8.0-ea"
Cela signifie que la version par défaut de Java est actuellement la version pré-version, qui casse certains packages "normaux" (dans mon cas, VisualVM).
Je ne peux pas définir JAVA_HOME
car le lancement d'applications ignore les variables d'environnement, même lors du lancement à partir de la ligne de commande (par exemple $ open /Applications/VisualVM.app
).
Alors, y a-t-il un fichier que je peux modifier dans lequel je peux définir mes préférences de commande JVM globalement ?
(Veuillez ne pas me dire de lancer le panneau de préférences Java car cela ne fonctionne tout simplement pas: il ne contient rien d'utile et ne répertorie qu'une des 4 JVM que j'ai installées.)
Mise à jour :
Les JVM Oracle vivent dans /Library/Java/JavaVirtualMachines
. Renommer le répertoire JDK 1.8 en jdk1.8.0.jvm.xyz
ne change rien: le java_home
trouve toujours au bon endroit, et l'exécution de / usr / bin / java exécute toujours la JVM 1.8. Ce n'est pas un problème avec les liens de synchronisation, etc.
Réponses à des questions similaires
Bien que cette réponse offre ce qui équivaut à un hack qui supprimera les versions de Java de la capture par java_home, elle ne répond toujours pas à cette question de savoir comment java_home choisit sa valeur par défaut et si les utilisateurs peuvent ou non le définir de manière non destructive .
/usr/bin/java
est juste un lien symbolique/usr/bin/java
pointe vers/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. LeVersions
répertoire ne contient pas de lien symbolique vers le JDK 1.8.0. Au lieu de cela, il contient un répertoire appelé utilementA
quiCurrent
pointe vers.A
n'est pas un "JAVA_HOME. Il a un sous-répertoire appeléCommands
qui a unejava
commande, mais c'est un binaire universel opaque qui fait qui-sait-quoi. Je soupçonne qu'il utilisejava_home
, etc. pour décider quelle JVM utiliser.Réponses:
Je pense que
JAVA_HOME
c'est le mieux que vous puissiez faire. Les outils de ligne de commande aimentjava
etjavac
respecteront cette variable d'environnement, que vous pouvez utiliser/usr/libexec/java_home -v '1.7*'
pour vous donner une valeur appropriée à insérerJAVA_HOME
afin que les outils de ligne de commande utilisent Java 7.Mais les bundles d'applications standard double-cliquables n'utilisent pas du tout les JDK installés sous
/Library/Java
. Les.app
bundles à l' ancienne utilisant AppleJavaApplicationStub
utiliseront Apple Java 6 à partir de/System/Library/Frameworks
, et ceux de style nouveau construits avec AppBundler sans JRE groupé utiliseront le JRE "public" dans/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- qui est codé en dur dans le code stub et ne peut pas être modifié, et vous ne pouvez pas installer deux JRE publics différents en même temps.Edit: J'ai jeté un coup d'œil à VisualVM en particulier, en supposant que vous utilisez la version "application bundle" de la page de téléchargement , et que cette application particulière n'est pas une application AppBundler, à la place son exécutable principal est un script shell qui appelle un numéro d'autres scripts shell et lit divers fichiers de configuration. Par défaut, il sélectionne le JDK le plus récent à partir
/Library/Java
de 7u10 ou version ultérieure, ou utilise Java 6 si votre installation Java 7 est la mise à jour 9 ou antérieure. Mais pour démêler la logique des scripts shell, il me semble que vous pouvez spécifier un JDK particulier à l'aide d'un fichier de configuration.Créez un fichier texte
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(remplacez la 1.3.6 par la version de VisualVM que vous utilisez) contenant la ligneet cela le forcera à choisir Java 7 au lieu de 8.
la source
JAVA_HOME
c'est la voie à suivre et en général, votre meilleur pari est de spécifier la version mineure dont vous avez besoin dans les autres cas. Sur la base du désassemblage, il s'avère que vous pouvezexport JAVA_VERSION=1.7
utiliserjava_home
par défaut JKD7 au lieu de JDK8, mais cela se romptjava_home -v 1.6
car l'java-home
interprète comme une contrainte supplémentaire et abandonne en raison de contraintes mutuellement insatisfaisables, puis va simplement avec la valeur par défaut 1.8 même avec l'--failfast
option.J'y suis allé aussi et j'ai cherché partout comment
/usr/libexec/java_home
fonctionne mais je n'ai trouvé aucune information sur la façon dont il détermine les machines virtuelles Java disponibles qu'il répertorie.J'ai expérimenté un peu et je pense qu'il exécute simplement un
ls /Library/Java/JavaVirtualMachines
, puis inspecte./<version>/Contents/Info.plist
tous les runtimes qu'il y trouve.Il les trie ensuite par ordre décroissant de la clé
JVMVersion
contenue dans Info.plist et utilise par défaut la première entrée comme JVM par défaut.Je pense que la seule chose que nous pourrions faire est de changer le plist:
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
puis de modifier la JVMVersion de1.8.0
à quelque chose d'autre qui la fait trier vers le bas au lieu du haut, comme!1.8.0
.Quelque chose comme:
puis il disparaît comme par magie du haut de la liste:
Vous devrez maintenant vous déconnecter / vous connecter, puis:
:-)
Bien sûr, je n'ai aucune idée si quelque chose d'autre casse maintenant ou si la version 1.8.0-ea de java fonctionne toujours correctement.
Vous ne devriez probablement rien faire de cela, mais simplement désinstaller 1.8.0.
Cependant, jusqu'à présent, cela a fonctionné pour moi.
la source
/usr/libexec/java_home -v 1.7
. Je pense que je vais faire de même pour JAVA_HOME .../usr/bin/java
trouvera le dernier JDK installé et l'utilisera pour tous les outils de ligne de commande liés à Java dans/usr/bin
.C'est en fait assez simple. Disons que nous avons ceci dans notre dossier JavaVirtualMachines:
Imaginez que 1.8 soit notre valeur par défaut, puis nous ajoutons simplement un nouveau dossier (par exemple «ancien») et déplaçons le dossier jdk par défaut vers ce nouveau dossier. Faites à
java -version
nouveau et voila, 1.7!la source
C'est assez simple, si cela ne vous dérange pas de retrousser vos manches ... / Library / Java / Home est la valeur par défaut pour JAVA_HOME, et c'est juste un lien qui pointe vers l'un des:
J'ai donc voulu changer ma version JVM / JDK par défaut sans changer le contenu de JAVA_HOME ... / Library / Java / Home est l'emplacement standard de la JVM / JDK actuelle et c'est ce que je voulais préserver ... il me semble être le moyen le plus simple de changer les choses avec le moins d'effets secondaires.
C'est en fait très simple. Pour changer la version de java que vous voyez avec java -version, tout ce que vous avez à faire est une version de ceci:
Je n'ai pas pris le temps mais un script shell très simple qui utilise / usr / libexec / java_home et ln pour rediriger le lien symbolique ci-dessus devrait être stupide et facile à créer ...
Une fois que vous avez changé l'endroit où / Library / Java / Home est pointé ... vous obtenez le résultat correct:
la source
/Library/Java/Home
c'est en effet un lien symbolique, mais il pointe vers/System/Library/Frameworks/JavaVM.framework/Home
lequel se trouve un gros fouillis de liens symboliques qui vous amène finalement à ... une commande magique qui détermine le bon JRE à lancer. Notez que cela est/usr/libexec/java_home
également lié à cette magie. Ainsi, vous pouvez tout interrompre en remplaçant simplement les liens symboliques et en pointant vers un seul JRE, mais vous devrez le mettre à jour à chaque fois. Il n'y a évidemment pas de commande similaireset_preferred_jvm_version
ou quelque chose de similaire.JAVA_HOME
n'importe où. Je vais jouer avec cette technique pour voir si elle aboutira au lancement de programmes basés sur Java avec la machine virtuelle Java "préférée". Je soupçonne que ce sera le cas, mais c'est assez fragile..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
Les instructions de désinstallation d'Oracle pour Java 7 ont fonctionné pour moi.
Extrait:
la source
Un peu tard mais comme il s'agit d'un problème persistant avec Mac OSX ...
La solution la plus simple que j'ai trouvée était de simplement supprimer les éléments OpenJDK qu'Apple installe. Chaque fois qu'une mise à jour de Mac OSX arrive, elle est installée et vous devrez la supprimer à nouveau.
Cela fonctionne très bien si vous développez des applications pour Google App Engine sur votre Mac à l'aide de Java. L'OpenJDK ne fonctionne pas bien et la version Java fournie avec la mise à niveau de Mac OSX Yosemite fera planter le plug-in Eclipse pour App Engine à chaque déploiement avec l'erreur utile: «Délai de lecture écoulé».
la source
J'ai testé "jenv" et d'autres choses comme la configuration de "JAVA_HOME" sans succès. Maintenant je et finis avec la solution suivante
(ajouté à ~ / .bashrc ou ~ / .bash.profile ou ~ / .zshrc)
Et en appelant comme ça:
java_home gérera la mauvaise entrée. donc vous ne pouvez pas faire quelque chose de mal. Maven et d'autres choses prendront la bonne version maintenant.
la source
En fait, j'ai un peu regardé cela dans le désassembleur, car la source n'est pas disponible.
/ usr / bin / java et / usr / libexec / java_home utilisent tous deux JavaLaunching.framework. La variable d'environnement JAVA_HOME est en effet vérifiée d'abord par / usr / bin / java et ses amis (mais pas par / usr / libexec / java_home.) Le framework utilise les variables d'environnement JAVA_VERSION et JAVA_ARCH pour filtrer les JVM disponibles. Donc, par défaut:
Mais la configuration, disons, JAVA_VERSION peut remplacer la valeur par défaut:
Vous pouvez également définir JAVA_LAUNCHER_VERBOSE = 1 pour afficher une journalisation de débogage supplémentaire en ce qui concerne les chemins de recherche, les JVM trouvées, etc., avec à la fois / usr / bin / java et / usr / libexec / java_home.
Dans le passé, JavaLaunching.framework utilisait en fait le système de préférences (sous le domaine com.apple.java.JavaPreferences) pour définir l'ordre JVM préféré, permettant à la JVM par défaut d'être définie avec PlistBuddy - mais pour autant que je sache , cela le code a été supprimé dans les versions récentes de macOS. Les variables d'environnement semblent être le seul moyen (mis à part la modification du fichier Info.plist dans les ensembles JDK eux-mêmes).
La définition des variables d'environnement par défaut peut bien sûr être effectuée via votre .profile ou via launchd , si vous avez besoin qu'elles soient définies au niveau de la session.
la source
.profile
n'est pas utile pour mon cas d'utilisation (lancer une application à partir, par exemple, du tableau de bord), mais le conseillaunchd
est bon. Je vais devoir essayer, car la folie récente de la gestion des versions de Java signifie que plusieurs générations de Java sont installées simultanément, avec différents niveaux de confiance (personnelle).Edit: ces informations sont pour visualvm spécifiquement, pas pour toute autre application java
Comme mentionné par d'autres, vous devez modifier le visualvm.conf
Pour la dernière version de JvisualVM 1.3.6 sur Mac, les répertoires d'installation ont changé.
Il se trouve actuellement dans /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
Cependant, cela peut dépendre de l'endroit où vous avez installé VisualVM. Le moyen le plus simple de trouver où votre VisualVM est de le démarrer, puis d'examiner le processus en utilisant:
ps -ef | grep VisualVM
Vous verrez quelque chose comme:
... -Dnetbeans.dirs = / Applications / VisualVM.app / Contenu / Ressources / visualvm / visualvm ...
Vous voulez prendre la propriété netbeans.dir et rechercher un répertoire et vous trouverez le dossier etc.
Décommentez cette ligne dans le visualvm.conf et modifiez le chemin vers le jdk
De plus, si vous avez de la lenteur avec votre visualvm et que vous avez beaucoup de mémoire, je suggère d'augmenter considérablement la quantité de mémoire disponible et de l'exécuter en mode serveur:
la source
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.J'ai eu une situation similaire et le processus suivant a fonctionné pour moi:
Dans le terminal, tapez
Ajoutez ensuite cette ligne dans le fichier et enregistrez
où la version est celle de votre ordinateur, par exemple 1.7.0_25
Quittez l'éditeur, puis tapez la commande suivante pour qu'elle devienne effective
Tapez ensuite java -version pour vérifier le résultat
Qu'est-ce que .profile? De: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
la source
MacOS utilise / usr / libexec / java_home pour trouver la version Java actuelle. Une façon de contourner est de changer le fichier plist comme expliqué par @ void256 ci-dessus. Une autre façon est de prendre la sauvegarde de java_home et de le remplacer par votre propre script java_home ayant le code
echo $ JAVA_HOME
Exportez maintenant le JAVA_HOME vers la version souhaitée du SDK en ajoutant les commandes suivantes au ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Rendre la variable d'environnement globale
Exécutez la commande source ~ / .bash_profile pour exécuter les commandes ci-dessus.
Chaque fois que l'on a besoin de changer JAVA_HOME, il peut réinitialiser la valeur JAVA_HOME dans le fichier ~ / .bash_profile.
la source
Je voulais changer le formulaire de version Java par défaut 1.6 * en 1.7 *. J'ai essayé les étapes suivantes et cela a fonctionné pour moi:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
Java version "1.7.0_51"
Java (TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot (TM) 64 bits Server VM (build 24.51-b03, mode mixte)
la source
/usr/libexec/java_home
.