Wie kann ich die von / usr / libexec / java_home zurückgegebene Standard-Java-VM von Mac OS ändern?

108

(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_HOMEda 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_homeimmer 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 .

Christopher Schultz
quelle
Geben Sie 'which java' ein und folgen Sie den Semmelbröseln. /usr/bin/javaist nur ein Symlink
Brian Roach
11
Kenne ich schon. /usr/bin/javazeigt auf /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java. Das VersionsVerzeichnis enthält keinen Symlink zum 1.8.0 JDK. Stattdessen enthält es ein Verzeichnis, das hilfreich aufgerufen wird und auf Adas Currentverweist. Aist kein "JAVA_HOME". Es hat ein Unterverzeichnis namens, Commandsdas einen javaBefehl hat, aber es ist eine undurchsichtige universelle Binärdatei, die wer weiß was tut. Ich vermute, sie verwendet java_homeusw., um zu entscheiden, welche JVM verwendet werden soll.
Christopher Schultz
2
Wenn dies nicht zum Thema gehört, migrieren Sie bitte, anstatt es zu schließen. FWIW, hier geht es um "Software-Tools, die üblicherweise von Programmierern verwendet werden", so dass das Schließen von "Off-Topic" unaufrichtig ist.
Christopher Schultz
Ja, das ist frustrierend! Ich möchte nur ein JDK für alle oder vielleicht zwei, mit denen ich problemlos zwischen 1,7 und 1,8 wechseln kann.
Brian
1
Ich fand diese SO-Antwort nützlich für diese Frage: stackoverflow.com/a/44169445/2987755
dkb

Antworten:

89

Ich denke, das JAVA_HOMEist das Beste, was du tun kannst. Die Befehlszeilentools mögen javaund javacrespektieren diese Umgebungsvariable. Sie können sie verwenden /usr/libexec/java_home -v '1.7*', um einen geeigneten Wert anzugeben JAVA_HOME, damit Befehlszeilentools Java 7 verwenden.

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

Standard-Doppelklick-Anwendungspakete verwenden jedoch überhaupt keine JDKs, unter denen installiert ist /Library/Java. Alte .appBundles, die Apple verwenden JavaApplicationStub, 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/JavaStandardmäß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ält

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

und dies zwingt es, Java 7 anstelle von 8 zu wählen.

Ian Roberts
quelle
Dies scheint auf meinem System nicht der Fall zu sein. Das Starten von VisualVM vor der Installation von JDK 1.8 funktionierte. Nach JDK1.8 zeigt VisualVM den Begrüßungsbildschirm an und stirbt dann ab. Durch das Verschieben des JDK1.8-Verzeichnisses aus / Library / Java wird die Ausführungsfähigkeit wiederhergestellt.
Christopher Schultz
@ChristopherSchultz Ich habe mir das VisualVM-Bundle angesehen und es stellte sich heraus, dass es keine normale Appbundler-Anwendung ist. Eine mögliche Problemumgehung finden Sie in meiner Bearbeitung.
Ian Roberts
Entschuldigung, ich habe meinen vorherigen Kommentar vor Ihrer Bearbeitung geschrieben. Ich werde prüfen, ob VisualVM mit dieser Technik ausgeführt werden kann, aber es ist unwahrscheinlich, dass es universell anwendbar ist. Ich habe eine Reihe anderer Java-basierter Software, die ich ebenfalls ausführe, wie Eclipse, JasperReports iReport usw., die wahrscheinlich alle davon betroffen sind. Ich denke, ich würde das JDK1.8-Verzeichnis lieber an einen anderen Ort verschieben und es explizit mit JAVA_HOME für die (wenigen) Male verwenden, die ich tatsächlich benötige.
Christopher Schultz
1
Ja, Sie haben Recht, es JAVA_HOMEist 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önnen export JAVA_VERSION=1.7machen java_homestandardmäßig zeigt JKD7 statt JDK8, aber das bricht , java_home -v 1.6weil java-homeinterpretiert 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 --failfastOption.
Andrewdotn
2
Ich kann nicht verstehen, warum die Java-Systemsteuerung für Systemeinstellungen nicht nur eine Liste zur Auswahl anzeigt, sondern auf Shell-Skripte / -Befehle zurückgreifen muss. Ich vermute, dies ist nur für Applets, die im Browser ausgeführt werden ...
JGFMK
51

Ich war auch dort und habe überall gesucht, wie es /usr/libexec/java_homefunktioniert, 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/JavaVirtualMachinesund überprüft dann die dort gefundenen ./<version>/Contents/Info.plistLaufzeiten.

Anschließend werden sie nach dem in der Info.plist enthaltenen Schlüssel absteigendJVMVersion 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.plistdie Plist zu ändern und dann die JVMVersion von 1.8.0etwas anderem zu ändern, das sie nach unten anstatt nach oben sortiert !1.8.0.

Etwas wie:

<?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' -->`

und dann verschwindet es auf magische Weise vom Anfang der 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

Jetzt müssen Sie sich abmelden / anmelden und dann:

java -version
java version "1.7.0_45"

:-)

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.

void256
quelle
Das hat bei mir funktioniert. Ich musste diese Optimierung verwenden, damit das Idea Sbt-Plugin unter MacOS für mich funktioniert. Ich erwähne es auf meinem Blog agilebuild.blogspot.com/2014/02/…
Antoine
Dies funktioniert, scheint jedoch etwas schwierig zu sein und sieht möglicherweise nicht wie eine Standardoperation aus. Ich wandere, wenn es einen besseren Ansatz gibt.
Weibo Li
Ich hätte immer noch gerne eine Lösung dafür, aber um das JDK für Intellij zu verwenden, habe ich dies meinem zshenv hinzugefügt: export IDEA_JDK = /usr/libexec/java_home -v 1.7. Ich denke, ich werde das gleiche für JAVA_HOME tun ...
David Resnick
Ich kann diese Antwort verwenden, um zu vermeiden, dass Java 9 Doppelklick-Anwendungen startet (aufgrund eines Problems im Keystore Store Explorer). Vielen Dank!
Nicolas Henneaux
2
Ein Auszug aus der Installation des JDK und der JRE unter macOS : Nach der Installation von Java für macOS 2012-006 /usr/bin/javawird das neueste installierte JDK gefunden und für alle Java-bezogenen Befehlszeilentools in verwendet /usr/bin.
Jeremy Kao
7

Es ist eigentlich ziemlich einfach. Angenommen, wir haben dies in unserem JavaVirtualMachines-Ordner:

  • jdk1.7.0_51.jdk
  • jdk1.8.0.jdk

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 -versioneinmal et voila, 1.7!

User404
quelle
1
Unglaublich, aber es hat funktioniert ... Danke Mac OS Mojave
Michał Dobi Dobrzański
5

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:

  • /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
  • /Library/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home

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:

cd /Library/Java
sudo rm Home
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home

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:

cerebro:~ magneto$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM)
64-Bit Server VM (build 25.60-b23, mixed mode)
jrypkahauer
quelle
1
So funktioniert dieses Zeug nicht: Es /Library/Java/Homeist in der Tat ein Symlink, aber es zeigt auf, /System/Library/Frameworks/JavaVM.framework/Homewas 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_homeauch 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 wie set_preferred_jvm_versionoder etwas Ähnliches.
Christopher Schultz
1
Der Vorteil dieser Technik besteht jedoch darin, dass Sie keine Einstellungen JAVA_HOMEvornehmen 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.
Christopher Schultz
Nun, heutzutage habe ich das nur in .bash_profile:export JAVA_HOME=`/usr/libexec/java_home -v 12`
jrypkahauer
Dies funktioniert nicht, wenn Sie auf ein Symbol doppelklicken, was der springende Punkt war. Lösungen, die nur über die Befehlszeile funktionieren, sind ... keine Lösungen.
Christopher Schultz
3

Anweisungen zur Deinstallation von Oracle für Java 7 bei mir funktioniert.

Auszug:

JDK deinstallieren Um das JDK zu deinstallieren, müssen Sie über Administratorrechte verfügen und den Befehl remove entweder als root oder mit dem Tool sudo (8) ausführen.

Navigieren Sie zu / Library / Java / JavaVirtualMachines und entfernen Sie das Verzeichnis, dessen Name dem folgenden Format entspricht: *

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

So deinstallieren Sie beispielsweise 7u6:

% rm -rf jdk1.7.0_06.jdk

Duma
quelle
2
Bei dieser Frage ging es nicht um die Deinstallation ... es ging um die Auswahl der "primären" JVM aus den installierten ...
Christopher Schultz
3

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".

Mo'in Creemers
quelle
1
Witzig ... Ich dachte, Apple hätte Java zu diesem Zeitpunkt komplett entfernt. Ich erinnere mich nicht daran, Apples Java 1.6 JVM manuell entfernt zu haben, und es ist definitiv nicht mehr hier. Dies behebt jedenfalls nicht das ursprüngliche Problem, bei dem die bevorzugte JVM bei einer installierten Auswahl angegeben wurde.
Christopher Schultz
Du hast Recht. Es beantwortet die Frage nicht. Dies beantwortet Folgendes: Wenn Sie die verwendete JVM entfernen, wird die 'nächste' in der Liste verwendet. Vielleicht hilft das.
Mo'in Creemers
Erklärt dies, warum nach der Ausführung einer JDK 8-Installation diese nicht im Ordner JavaVirtualMachines angezeigt wird? Ich sehe nur "1.6.0.jdk", egal welche Version ich installiere.
Whyoz
@whyoz Gerade jdk-8u31-macosx-x64 auf osx 10.10.2 installiert und die VM wurde wie erwartet im Ordner JavaVirtualMachines installiert.
Mo'in Creemers
Führen Sie Parallels zufällig aus? Ich habe es auf der Windows-Seite von Parallels installiert und 8u31 wie erwartet installiert. Nur nicht auf der Mac-Seite.
Whyoz
3

Ich habe "jenv" und andere Dinge wie das Setzen von "JAVA_HOME" ohne Erfolg getestet. Jetzt habe ich und endet mit folgender Lösung

function setJava {
    export JAVA_HOME="$(/usr/libexec/java_home -v $1)"
    launchctl setenv JAVA_HOME $JAVA_HOME
    sudo ln -nsf "$(dirname ${JAVA_HOME})/MacOS" /Library/Java/MacOS 
    java -version
}

(hinzugefügt zu ~ / .bashrc oder ~ / .bash.profile oder ~ / .zshrc)

Und so anrufen:

setJava 1.8

java_home verarbeitet die falsche Eingabe. Sie können also nichts falsch machen. Maven und andere Sachen werden jetzt die richtige Version abholen.

Yuna Braska
quelle
1

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:

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.5, x86_64: "Amazon Corretto 11"    /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_232, x86_64:  "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

Die Einstellung von beispielsweise JAVA_VERSION kann jedoch die Standardeinstellung überschreiben:

$ JAVA_VERSION=1.8 /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

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.

Dan Walters
quelle
Das sind großartige Informationen, Dan. Die Verwendung .profileist für meinen Anwendungsfall nicht nützlich (Starten einer Anwendung über z. B. Launchpad), aber der Tipp launchdist 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.
Christopher Schultz
-2

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

visualvm_jdkhome="/path/to/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:

visualvm_default_options="-J-XX:MaxPermSize=96m -J-Xmx2048m -J-Xms2048m -J-server -J-XX:+UseCompressedOops -J-XX:+UseConcMarkSweepGC -J-XX:+UseParNewGC -J-XX:NewRatio=2 -J-Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense -J-Dsun.jvmstat.perdata.syncWaitMs=10000 -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.d3d=false"
Celandro
quelle
Schlechter Rat: Wenn Sie das Startskript für eine bestimmte Anwendung ändern, wird die Anwendung wahrscheinlich beschädigt und das ursprüngliche Problem der Änderung der Standard-JVM für das Betriebssystem wird nicht gelöst.
Christopher Schultz
Leider verwendet jvisualvm, wie von anderen erwähnt, keine Standardmethoden für die Auswahl eines jvm. Dies ist die einzige Lösung für diese App.
Celandro
Wie ich in meiner Antwort feststelle, müssen Sie im Anwendungspaket selbst nichts ändern, die App kann ihre Konfiguration von laden ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf.
Ian Roberts
-2

Ich hatte eine ähnliche Situation und der folgende Prozess funktionierte für mich:

  1. Geben Sie im Terminal Folgendes ein

    vi ~/.profile
  2. Fügen Sie dann diese Zeile in die Datei ein und speichern Sie sie

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

    Dabei handelt es sich um die Version auf Ihrem Computer, z. B. 1.7.0_25

  3. Beenden Sie den Editor und geben Sie den folgenden Befehl ein, damit er wirksam wird

    source ~/.profile 

Geben Sie dann java -version ein, um das Ergebnis zu überprüfen

    java -version 

Was ist .profile? Von: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515

Die Profildatei ist eine versteckte Datei. Es handelt sich um eine optionale Datei, die dem System mitteilt, welche Befehle ausgeführt werden sollen, wenn sich der Benutzer anmeldet, dessen Profildatei sich anmeldet. Wenn beispielsweise mein Benutzername bruno lautet und sich in / Users / bruno / eine .profile-Datei befindet, wird der gesamte Inhalt angezeigt wird während des Anmeldevorgangs ausgeführt.

Tony
quelle
Dies funktioniert nicht, wenn VisualVM über Launchpad gestartet wird. Das Starten über die Befehlszeile ist kein Problem, da Sie die Umgebungsvariable JAVA_HOME festlegen können.
Christopher Schultz
-2

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.

Rajat
quelle
Alles, was auf Umgebungsvariablen beruht, funktioniert nicht. Der Punkt ist, dass Anwendungen, die über LaunchPad usw. gestartet werden, nicht über diese Umgebung verfügen. Der obige Plist-Hack scheint insofern der "beste" zu sein, als er tatsächlich das gewünschte Ergebnis erzielt. Ich bin mir noch nicht sicher, welche Nachteile es gibt. Siehe die Antwort von @Tony, die das gleiche Problem hat.
Christopher Schultz
-3

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:

  • Link "java" unter / usr / bin entfernt
  • Erstellt es erneut und zeigt auf den neuen Speicherort:

ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java

  • verifiziert mit "java -version"

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)

user2756423
quelle
Beantwortet die Frage nicht: Es wird das Verhalten von nicht beeinflussen /usr/libexec/java_home.
Christopher Schultz