(Ich war mir nicht sicher, ob dies auf SU gehen sollte ... Migration ist sicherlich eine Option, aber mehr Programmierer lesen hier Fragen, also geht es weiter).
Ich verwende Mac OS X 10.8.4 und habe das JDK 1.6.0_51 von Apple sowie das JDK 1.7.0_25 von Oracle installiert. Ich habe kürzlich das 1.8-Vorschau-JDK von Oracle für eine Pre-Release-Software installiert, für die dies erforderlich ist. Wenn ich jetzt / usr / libexec / java_home ausführe, erhalte ich Folgendes:
$ /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
Toll.
Laufen jedoch:
$ java -version
Kehrt zurück:
java version "1.8.0-ea"
Das bedeutet, dass die Standardversion von Java derzeit die Vorabversion ist, die einige "normale" Pakete (in meinem Fall VisualVM) zerstört.
Ich kann nicht festlegen, JAVA_HOME
da beim Starten von Anwendungen Umgebungsvariablen ignoriert werden, selbst wenn sie über die Befehlszeile gestartet werden (z $ open /Applications/VisualVM.app
. B. ).
Gibt es eine Datei, die ich bearbeiten kann und in der ich meine JVM-Bestelleinstellungen global festlegen kann ?
(Bitte fordern Sie mich nicht auf, das Java-Einstellungsfenster zu starten, da dies einfach nicht funktioniert: Es enthält nichts Nützliches und listet nur eine der 4 JVMs auf, die ich installiert habe.)
Update :
Oracle JVMs leben in /Library/Java/JavaVirtualMachines
. Das Umbenennen des JDK 1.8-Verzeichnisses in jdk1.8.0.jvm.xyz
ändert nichts: Es befindet sich java_home
immer noch an der richtigen Stelle, und wenn Sie / usr / bin / java ausführen, wird die 1.8-JVM weiterhin ausgeführt. Dies ist kein Problem mit Synlinks usw.
Antworten auf ähnliche Fragen
Während diese Antwort bietet , was zu einem Hack beträgt die Java - Versionen von abgeholt von java_home zu entfernen, es antwortet immer noch nicht diese Frage, wie java_home seinen Standard wählt und ob Benutzer können nicht-destruktiv es eingestellt .
/usr/bin/java
ist nur ein Symlink/usr/bin/java
zeigt auf/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. DasVersions
Verzeichnis enthält keinen Symlink zum 1.8.0 JDK. Stattdessen enthält es ein Verzeichnis, das hilfreich aufgerufen wird und aufA
dasCurrent
verweist.A
ist kein "JAVA_HOME". Es hat ein Unterverzeichnis namens,Commands
das einenjava
Befehl hat, aber es ist eine undurchsichtige universelle Binärdatei, die wer weiß was tut. Ich vermute, sie verwendetjava_home
usw., um zu entscheiden, welche JVM verwendet werden soll.Antworten:
Ich denke, das
JAVA_HOME
ist das Beste, was du tun kannst. Die Befehlszeilentools mögenjava
undjavac
respektieren diese Umgebungsvariable. Sie können sie verwenden/usr/libexec/java_home -v '1.7*'
, um einen geeigneten Wert anzugebenJAVA_HOME
, damit Befehlszeilentools Java 7 verwenden.Standard-Doppelklick-Anwendungspakete verwenden jedoch überhaupt keine JDKs, unter denen installiert ist
/Library/Java
. Alte.app
Bundles, die Apple verwendenJavaApplicationStub
, verwenden Apple Java 6 von/System/Library/Frameworks
, und neue, die mit AppBundler ohne gebündelte JRE erstellt wurden, verwenden die "öffentliche" JRE in/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- die im Stub-Code fest codiert ist und nicht geändert werden kann Sie können nicht zwei verschiedene öffentliche JREs gleichzeitig installieren.Bearbeiten: Ich habe mir VisualVM speziell angesehen, vorausgesetzt, Sie verwenden die "Anwendungspaket" -Version von der Download-Seite , und diese bestimmte App ist keine AppBundler-Anwendung, sondern ihre ausführbare Hauptdatei ist ein Shell-Skript, das eine Nummer aufruft von anderen Shell-Skripten und liest verschiedene Konfigurationsdateien.
/Library/Java
Standardmäßig wird das neueste JDK ausgewählt, sofern dies 7u10 oder höher ist, oder Java 6 verwendet, wenn Ihre Java 7-Installation Update 9 oder früher ist. Wenn ich jedoch die Logik in den Shell-Skripten entschlüssele, scheint es mir, als könnten Sie ein bestimmtes JDK mithilfe einer Konfigurationsdatei angeben.Erstellen Sie eine Textdatei
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(ersetzen Sie 1.3.6 durch die von Ihnen verwendete Version von VisualVM), die die Zeile enthältund dies zwingt es, Java 7 anstelle von 8 zu wählen.
quelle
JAVA_HOME
ist der richtige Weg, und im Allgemeinen ist es am besten, die kleinere Version anzugeben, die Sie in anderen Fällen benötigen. Basierend auf Demontage, stellt sich heraus , Sie könnenexport JAVA_VERSION=1.7
machenjava_home
standardmäßig zeigt JKD7 statt JDK8, aber das bricht ,java_home -v 1.6
weiljava-home
interpretiert es als eine zusätzliche Einschränkung und gibt aufgrund gegenseitig unerfüllbar Zwänge, dann geht nur mit dem Standard 1.8 auch mit der--failfast
Option.Ich war auch dort und habe überall gesucht, wie es
/usr/libexec/java_home
funktioniert, aber ich konnte keine Informationen darüber finden, wie es die verfügbaren Java Virtual Machines bestimmt, die es auflistet.Ich habe ein bisschen experimentiert und ich denke, es führt einfach a aus
ls /Library/Java/JavaVirtualMachines
und überprüft dann die dort gefundenen./<version>/Contents/Info.plist
Laufzeiten.Anschließend werden sie nach dem in der Info.plist enthaltenen Schlüssel absteigend
JVMVersion
sortiert und standardmäßig der erste Eintrag als Standard-JVM verwendet.Ich denke, das Einzige, was wir tun könnten, ist,
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
die Plist zu ändern und dann die JVMVersion von1.8.0
etwas anderem zu ändern, das sie nach unten anstatt nach oben sortiert!1.8.0
.Etwas wie:
und dann verschwindet es auf magische Weise vom Anfang der Liste:
Jetzt müssen Sie sich abmelden / anmelden und dann:
:-)
Natürlich habe ich keine Ahnung, ob jetzt etwas anderes kaputt geht oder ob die 1.8.0-ea-Version von Java noch richtig funktioniert.
Sie sollten dies wahrscheinlich nicht tun, sondern einfach 1.8.0 deinstallieren.
Bisher hat dies jedoch bei mir funktioniert.
quelle
/usr/libexec/java_home -v 1.7
. Ich denke, ich werde das gleiche für JAVA_HOME tun .../usr/bin/java
wird das neueste installierte JDK gefunden und für alle Java-bezogenen Befehlszeilentools in verwendet/usr/bin
.Es ist eigentlich ziemlich einfach. Angenommen, wir haben dies in unserem JavaVirtualMachines-Ordner:
Stellen Sie sich vor, 1.8 ist unser Standardordner. Dann fügen wir einfach einen neuen Ordner hinzu (zum Beispiel 'alt') und verschieben den Standard-JDK-Ordner in diesen neuen Ordner. Mach es noch
java -version
einmal et voila, 1.7!quelle
Es ist ziemlich einfach, wenn es Ihnen nichts ausmacht, die Ärmel hochzukrempeln ... / Library / Java / Home ist die Standardeinstellung für JAVA_HOME, und es ist nur ein Link, der auf einen der folgenden Punkte verweist:
Ich wollte also meine Standard-JVM / JDK-Version ändern, ohne den Inhalt von JAVA_HOME zu ändern ... / Library / Java / Home ist der Standardspeicherort für die aktuelle JVM / JDK, und das wollte ich beibehalten ... scheint mir der einfachste Weg zu sein, Dinge mit den geringsten Nebenwirkungen zu ändern.
Es ist eigentlich ganz einfach. Um zu ändern, welche Java-Version Sie mit Java-Version sehen, müssen Sie lediglich eine Version davon ausführen:
Ich habe mir nicht die Zeit genommen, aber ein sehr einfaches Shell-Skript, das / usr / libexec / java_home und ln verwendet, um den obigen Symlink neu zu benennen, sollte dumm und einfach zu erstellen sein ...
Sobald Sie geändert haben, wohin / Library / Java / Home zeigt ... erhalten Sie das richtige Ergebnis:
quelle
/Library/Java/Home
ist in der Tat ein Symlink, aber es zeigt auf,/System/Library/Frameworks/JavaVM.framework/Home
was sich in einem großen Durcheinander von Symlinks befindet, das Sie schließlich zu ... einem magischen Befehl bringt, der die richtige JRE zum Starten bestimmt. Beachten Sie, dass/usr/libexec/java_home
auch in diese Magie verknüpft. Sie können also alles unterbrechen, indem Sie nur Symlinks ersetzen und auf eine einzelne JRE verweisen. Sie müssen dies jedoch jedes Mal aktualisieren. Es gibt offensichtlich keinen Befehl wieset_preferred_jvm_version
oder etwas Ähnliches.JAVA_HOME
vornehmen müssen. Ich werde mit dieser Technik spielen, um zu sehen, ob Java-basierte Programme mit der "bevorzugten" Java-VM gestartet werden. Ich vermute es wird, aber es ist ziemlich zerbrechlich..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
Anweisungen zur Deinstallation von Oracle für Java 7 bei mir funktioniert.
Auszug:
quelle
Ein bisschen spät, aber da dies ein laufendes Problem mit Mac OSX ist ...
Die einfachste Lösung, die ich gefunden habe, bestand darin, das von Apple installierte OpenJDK-Material einfach zu entfernen. Jedes Mal, wenn ein Update von Mac OSX eintrifft, wird es installiert und Sie müssen es erneut entfernen.
Dies funktioniert sehr gut, wenn Sie Apps für Google App Engine auf Ihrem Mac mit Java entwickeln. Das OpenJDK funktioniert nicht gut und die Java-Version, die mit dem Mac OSX Yosemite-Upgrade geliefert wird, führt bei jeder Bereitstellung zum Absturz des Eclipse-Plug-ins für App Engine mit dem hilfreichen Fehler "Zeitüberschreitung beim Lesen".
quelle
Ich habe "jenv" und andere Dinge wie das Setzen von "JAVA_HOME" ohne Erfolg getestet. Jetzt habe ich und endet mit folgender Lösung
(hinzugefügt zu ~ / .bashrc oder ~ / .bash.profile oder ~ / .zshrc)
Und so anrufen:
java_home verarbeitet die falsche Eingabe. Sie können also nichts falsch machen. Maven und andere Sachen werden jetzt die richtige Version abholen.
quelle
Ich habe mir das im Disassembler ein wenig angesehen, da die Quelle nicht verfügbar ist.
/ usr / bin / java und / usr / libexec / java_home verwenden beide JavaLaunching.framework. Die Umgebungsvariable JAVA_HOME wird tatsächlich zuerst von / usr / bin / java und Freunden (aber nicht von / usr / libexec / java_home) überprüft. Das Framework verwendet die Umgebungsvariablen JAVA_VERSION und JAVA_ARCH, um die verfügbaren JVMs zu filtern. Also standardmäßig:
Die Einstellung von beispielsweise JAVA_VERSION kann jedoch die Standardeinstellung überschreiben:
Sie können JAVA_LAUNCHER_VERBOSE = 1 auch festlegen, um zusätzliche Debug-Protokollierung für Suchpfade, gefundene JVMs usw. mit / usr / bin / java und / usr / libexec / java_home anzuzeigen.
In der Vergangenheit verwendete JavaLaunching.framework tatsächlich das Einstellungssystem (unter der Domäne com.apple.java.JavaPreferences), um die bevorzugte JVM-Reihenfolge festzulegen, sodass die Standard-JVM mit PlistBuddy festgelegt werden kann - aber so gut ich das kann Code wurde in neueren Versionen von macOS entfernt. Umgebungsvariablen scheinen der einzige Weg zu sein (abgesehen von der Bearbeitung der Info.plist in den JDK-Bundles selbst).
Das Festlegen von Standardumgebungsvariablen kann natürlich über Ihr .profile oder über launchd erfolgen , wenn Sie diese auf Sitzungsebene festlegen müssen.
quelle
.profile
ist für meinen Anwendungsfall nicht nützlich (Starten einer Anwendung über z. B. Launchpad), aber der Tipplaunchd
ist gut. Ich muss es versuchen, da Javas jüngster Versionswahnsinn bedeutet, dass ich mehrere Generationen von Java gleichzeitig installiert habe, mit unterschiedlichem (persönlichem) Vertrauen.Bearbeiten: Diese Informationen sind speziell für visualvm bestimmt, nicht für andere Java-Apps
Wie von anderen erwähnt, müssen Sie die visualvm.conf ändern
Für die neueste Version von JvisualVM 1.3.6 auf dem Mac wurden die Installationsverzeichnisse geändert.
Es befindet sich derzeit in /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
Dies kann jedoch davon abhängen, wo Sie VisualVM installiert haben. Der einfachste Weg, um herauszufinden, wo Ihre VisualVM ist, besteht darin, sie zu starten und den Prozess dann folgendermaßen zu betrachten:
ps -ef | grep VisualVM
Sie werden so etwas sehen wie:
... -Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...
Sie möchten die Eigenschaft netbeans.dir verwenden und ein Verzeichnis suchen. Dort finden Sie den Ordner etc.
Kommentieren Sie diese Zeile in der visualvm.conf aus und ändern Sie den Pfad zum jdk
Wenn Sie mit Ihrem VisualVM langsam sind und viel Speicher haben, würde ich außerdem empfehlen, die verfügbare Speichermenge erheblich zu erhöhen und im Servermodus auszuführen:
quelle
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.Ich hatte eine ähnliche Situation und der folgende Prozess funktionierte für mich:
Geben Sie im Terminal Folgendes ein
Fügen Sie dann diese Zeile in die Datei ein und speichern Sie sie
Dabei handelt es sich um die Version auf Ihrem Computer, z. B. 1.7.0_25
Beenden Sie den Editor und geben Sie den folgenden Befehl ein, damit er wirksam wird
Geben Sie dann java -version ein, um das Ergebnis zu überprüfen
Was ist .profile? Von: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
quelle
MacOS verwendet / usr / libexec / java_home, um die aktuelle Java-Version zu finden. Eine Möglichkeit zur Umgehung besteht darin, die Plist-Datei wie oben unter @ void256 erläutert zu ändern. Eine andere Möglichkeit besteht darin, die Sicherung des java_home zu erstellen und durch Ihr eigenes Skript java_home mit dem Code zu ersetzen
echo $ JAVA_HOME zu ersetzen
Exportieren Sie nun JAVA_HOME in die gewünschte Version des SDK, indem Sie dem ~ / .bash_profile die folgenden Befehle hinzufügen. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Machen Sie die Umgebungsvariable global
Führen Sie die Befehlsquelle ~ / .bash_profile aus, um die obigen Befehle auszuführen.
Jedes Mal, wenn JAVA_HOME geändert werden muss, kann der JAVA_HOME-Wert in der Datei ~ / .bash_profile zurückgesetzt werden.
quelle
Ich wollte die Standard-Java-Version von 1.6 * auf 1.7 * ändern. Ich habe die folgenden Schritte ausprobiert und es hat bei mir funktioniert:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
Java-Version "1.7.0_51"
Java (TM) SE-Laufzeitumgebung (Build 1.7.0_51-b13)
Java HotSpot (TM) 64-Bit-Server-VM (Build 24.51-b03, gemischter Modus)
quelle
/usr/libexec/java_home
.