116 votes

Comment modifier la machine virtuelle Java par défaut de Mac OS renvoyée à partir de / usr / libexec / java_home

(N'étais pas sûr si cela devrait aller SU... la migration est certainement une option, mais plus de programmeurs lire les questions ici, donc voilà).

Je suis sous Mac OS X 10.8.4, et j'ai d'Apple JDK 1.6.0_51 installé ainsi que d'Oracle JDK 1.7.0_25. J'ai récemment installé Oracle de 1,8 aperçu JDK pour certains pré-version du logiciel qui l'exige. 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

Grand.

Toutefois, en cours d'exécution:

$ java -version

Retourne:

java version "1.8.0-ea"

Cela signifie que la version par défaut de Java est actuellement la version pre-release, qui casse certains "normal" packages (dans mon cas, VisualVM).

Je ne peux pas définir JAVA_HOME parce que de lancer des applications ignore les variables d'environnement, même lors du lancement de la ligne de commande (par exemple, $ open /Applications/VisualVM.app).

Alors, est-il un fichier, je peux le modifier où je peux mettre mon JVM de la commande préférences à l'échelle mondiale?

(S'il vous plaît ne me dites pas de lancer le Java Panneau de Préférences parce que cela ne fonctionne tout simplement pas: il ne contient pas de quelque chose d'utile et que les listes de l'une des 4 machines virtuelles que j'ai installé.)

Mise à jour:

Oracle Jvm vivre en /Library/Java/JavaVirtualMachines. Re-nommer les JDK 1.8 répertoire jdk1.8.0.jvm.xyz ne change rien: java_home la trouve encore à la bonne place, et la course /usr/bin/java s'exécute encore le 1.8 de la JVM. Ce n'est pas un problème avec synlinks, etc.

89voto

Ian Roberts Points 59836

Je pense que JAVA_HOME est le meilleur que vous pouvez faire. Les outils en ligne de commande comme java et javac respecter variable d'environnement, vous pouvez utiliser /usr/libexec/java_home -v '1.7*' afin de vous donner une valeur appropriée pour mettre en JAVA_HOME afin de rendre les outils de ligne de commande utilisation de Java 7.

export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"

Mais standard double-cliquable ensembles d'application ne pas utiliser de Jdk installé sous /Library/Java . De style ancien .app faisceaux à l'aide d'Apple JavaApplicationStub va utiliser Apple Java 6 /System/Library/Frameworks, et le nouveau style de ceux qui sont intégrés avec AppBundler sans groupés JRE, utiliser le "public" JRE en /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home - c'est codé en dur dans le code stub et ne peut pas être changé, et vous ne pouvez pas avoir deux publics différents Jre installés en même temps.


Edit: j'ai eu un coup d'oeil à VisualVM plus précisément, en supposant que vous êtes à l'aide de l'application "bundle" version de la page de téléchargement, et cette appli n'est pas un AppBundler application, au lieu de son exécutable principal est un script shell qui appelle un certain nombre d'autres scripts shell et lit différents fichiers de configuration. La valeur par défaut est de ramasser le plus récent JDK à partir de /Library/Java tant que l'7u10 ou plus tard, ou utilise la version 6 de Java si votre installation de Java 7 est mise à jour 9 ou une version antérieure. Mais la disparition de la logique dans les scripts shell, il me semble que vous pouvez spécifier un JDK à l'aide d'un fichier de configuration.

Créer un fichier texte ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf (remplacer 1.3.6 avec n'importe quelle version de VisualVM que vous utilisez) contenant la ligne

visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"

et cela va l'obliger à choisir Java 7 au lieu de 8.

54voto

void256 Points 466

J'ai été là aussi, et cherché partout comment /usr/libexec/java_home fonctionne, mais je ne pouvais pas trouver toutes les informations sur la façon dont il détermine la disposition des Machines Virtuelles Java, il énumère.

J'ai testé un peu et je pense qu'il exécute simplement un ls /Library/Java/JavaVirtualMachines puis inspecte l' ./<version>/Contents/Info.plist de toutes les exécutions qu'il y trouve.

Puis, il les trie en descendant par la touche JVMVersion contenues dans l'Info.plist et par défaut, il utilise la première entrée de sa JVM par défaut.

Je pense que la seule chose que nous pourrions faire est de modifier le fichier plist: sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist puis de modifier la JVMVersion de 1.8.0 de quelque chose d'autre que le fait qu'il sorte vers le bas au lieu du haut, comme !1.8.0.

Quelque chose comme:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <dict>
            ...
            <key>JVMVersion</key>
            <string>!1.8.0</string>   <!-- changed from '1.8.0' to '!1.8.0' -->`

et puis, il disparaît comme par magie à partir du haut de la liste:

/usr/libexec/java_home -verbose
Matching Java Virtual Machines (3):
    1.7.0_45, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
    1.7.0_09, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home
    !1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

Maintenant, vous aurez besoin de logout/login:

java -version
java version "1.7.0_45"

:-)

Bien sûr, je n'ai aucune idée si quelque chose d'autre pauses ou si la version 1.8.0-ea version de java fonctionne toujours correctement.

Vous ne devriez probablement pas faire tout cela, mais simplement de désinstaller la version 1.8.0.

Cependant jusqu'à présent, cela a fonctionné pour moi.

9voto

User404 Points 645

C'est en fait assez facile. Disons que nous avons cela dans notre dossier JavaVirtualMachines: jdk1.7.0_51.jdk jdk1.8.0.jdk

Image que 1.8 est notre défaut, alors nous venons d'ajouter un nouveau dossier (par exemple 'ancien') et de déplacer le dossier jdk par défaut vers ce nouveau dossier. Ne java -version again et le tour est joué, 1.7!

3voto

moin Points 688

Un peu en retard, mais comme c'est un problème en cours avec Mac OSX...

La solution la plus simple que j'ai trouvé était de tout simplement supprimer la OpenJDK trucs qu'Apple installe. Chaque fois qu'une mise à jour de Mac OSX arrive, il est installé et vous devez la supprimer à nouveau.

Cela fonctionne vraiment 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 de Java qui est livré avec le Mac OSX Yosemite mise à niveau permettra de faire le Plug-in Eclipse pour App Engine crash à chaque déploiement avec le utile d'erreur: "Read timed out".

3voto

duma Points 197

Oracle instructions de désinstallation de Java 7 a fonctionné pour moi.

Extrait:

Désinstallation du JDK Pour désinstaller le JDK, vous devez disposer des privilèges d'Administrateur et exécutez la commande de suppression, soit en tant que root ou en utilisant la commande sudo(8) de l'outil.

Allez dans /Library/Java/JavaVirtualMachines et supprimer le répertoire dont le nom correspond au format suivant:*

/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk

Par exemple, pour désinstaller 7u6:

% rm -rf jdk1.7.0_06.jdk

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