(Nie byłem pewien, czy to powinno trwać SU ... migracja jest z pewnością opcją, ale więcej programistów czyta tutaj pytania, więc tutaj idzie).
Używam systemu Mac OS X 10.8.4 i mam zainstalowany JDK 1.6.0_51 firmy Apple oraz JDK 1.7.0_25 firmy Oracle. Niedawno zainstalowałem JDK w wersji zapoznawczej Oracle 1.8 dla niektórych programów w wersji wstępnej, które tego wymagają. Teraz, kiedy uruchamiam / usr / libexec / java_home, otrzymuję to:
$ /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
Wspaniały.
Jednak bieganie:
$ java -version
Zwroty:
java version "1.8.0-ea"
Oznacza to, że domyślną wersją Javy jest obecnie wersja przedpremierowa, która psuje niektóre „normalne” pakiety (w moim przypadku VisualVM).
Nie mogę ustawić, JAVA_HOME
ponieważ uruchamianie aplikacji ignoruje zmienne środowiskowe, nawet podczas uruchamiania z wiersza poleceń (np $ open /Applications/VisualVM.app
.).
Czy jest więc plik, który mogę edytować, w którym mogę globalnie ustawić preferencje porządkowania maszyny JVM ?
(Proszę nie mówić mi, żebym uruchamiał panel preferencji Java, ponieważ to po prostu nie działa: nie zawiera niczego przydatnego i zawiera tylko jedną z 4 maszyn JVM, które zainstalowałem).
Aktualizacja :
Maszyny JVM firmy Oracle mieszkają w /Library/Java/JavaVirtualMachines
. jdk1.8.0.jvm.xyz
Zmiana nazwy katalogu JDK 1.8 na niczego nie zmienia: java_home
nadal znajduje go we właściwym miejscu, a uruchomienie / usr / bin / java nadal wykonuje JVM 1.8. Nie jest to problem z linkami synchronizacyjnymi itp.
Odpowiedzi na podobne pytania
Chociaż ta odpowiedź jest równoznaczna z włamaniem, które usunie wersje Javy z przechwytywania przez java_home, nadal nie odpowiada na pytanie, w jaki sposób java_home wybiera swoje domyślne ustawienie i czy użytkownicy mogą je ustawić w sposób nieniszczący .
/usr/bin/java
to tylko symboliczne łącze/usr/bin/java
wskazuje na/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
.Versions
Katalog nie zawiera dowiązania do 1.8.0 JDK. Zamiast tego zawiera katalog o użytecznej nazwie,A
któryCurrent
wskazuje na.A
nie jest "JAVA_HOME. Ma podkatalog o nazwie,Commands
który majava
polecenie, ale jest to nieprzezroczysty uniwersalny plik binarny, który robi, kto-wie-co. Podejrzewam, że używajava_home
itp., aby zdecydować, którego JVM użyć."Odpowiedzi:
Myślę, że
JAVA_HOME
to najlepsze, co możesz zrobić. Narzędzia wiersza poleceń, takie jakjava
ijavac
będą respektować tę zmienną środowiskową, możesz użyć/usr/libexec/java_home -v '1.7*'
do podania odpowiedniej wartości do wprowadzeniaJAVA_HOME
, aby narzędzia wiersza poleceń używały języka Java 7.Ale standardowe pakiety aplikacji, które można kliknąć dwukrotnie, w ogóle nie używają pakietów JDK zainstalowanych poniżej
/Library/Java
..app
Pakiety w starym stylu korzystające z AppleJavaApplicationStub
będą używać Java 6 firmy Apple/System/Library/Frameworks
, a pakiety w nowym stylu utworzone za pomocą AppBundler bez dołączonego środowiska JRE będą używać „publicznego” środowiska JRE/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- jest to na stałe zakodowane w kodzie pośredniczącym i nie można go zmienić, oraz nie można mieć zainstalowanych dwóch różnych publicznych środowisk JRE w tym samym czasie.Edycja: przyjrzałem się konkretnie VisualVM, zakładając, że używasz wersji „pakietu aplikacji” ze strony pobierania , a ta konkretna aplikacja nie jest aplikacją AppBundler, zamiast tego jej głównym plikiem wykonywalnym jest skrypt powłoki, który wywołuje numer innych skryptów powłoki i odczytuje różne pliki konfiguracyjne. Domyślnie wybiera najnowszy JDK z
/Library/Java
pakiet o ile jest to wersja 7u10 lub nowsza, lub używa języka Java 6, jeśli instalacja oprogramowania Java 7 to aktualizacja 9 lub starsza. Ale po rozwikłaniu logiki w skryptach powłoki wydaje mi się, że można określić konkretny JDK za pomocą pliku konfiguracyjnego.Utwórz plik tekstowy
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(zastąp 1.3.6 dowolną wersją programu VisualVM, którego używasz) zawierający wiersza to zmusi go do wybrania Java 7 zamiast 8.
źródło
JAVA_HOME
to najlepszy sposób i ogólnie najlepiej jest określić wersję pomocniczą, której potrzebujesz w innych przypadkach. Opierając się na demontaż, okaże się to możliweexport JAVA_VERSION=1.7
, abyjava_home
domyślnie wyświetlał JKD7 zamiast JDK8, ale przerwyjava_home -v 1.6
ponieważjava-home
interpretuje ją jako dodatkowe ograniczenia i rezygnuje z powodu wzajemnie unsatisfiable ograniczeń, a potem po prostu idzie z domyślnego 1.8 nawet z--failfast
opcją.Ja też tam byłem i wszędzie szukałem sposobu
/usr/libexec/java_home
szukałem działa, ale nie mogłem znaleźć żadnych informacji o tym, jak określa dostępne wirtualne maszyny Java, które wyświetla.Trochę eksperymentowałem i myślę, że po prostu wykonuje a,
ls /Library/Java/JavaVirtualMachines
a następnie sprawdza./<version>/Contents/Info.plist
wszystkie znalezione tam środowiska wykonawcze.Następnie sortuje je malejąco według klucza
JVMVersion
zawartego w Info.plist i domyślnie używa pierwszego wpisu jako domyślnej maszyny JVM.Myślę, że jedyne, co możemy zrobić, to zmienić plistę:
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
a następnie zmodyfikować JVMVersion z1.8.0
na coś innego, co spowoduje, że sortuje ją do dołu zamiast do góry, na przykład!1.8.0
.Coś jak:
a potem magicznie znika z góry listy:
Teraz musisz się wylogować / zalogować, a następnie:
:-)
Oczywiście nie mam pojęcia, czy coś się teraz psuje lub czy wersja Java 1.8.0-ea nadal działa poprawnie.
Prawdopodobnie nie powinieneś tego robić, a zamiast tego po prostu odinstalować 1.8.0.
Jak dotąd jednak to zadziałało.
źródło
/usr/libexec/java_home -v 1.7
. Myślę, że zrobię to samo dla JAVA_HOME .../usr/bin/java
znajdzie najnowszy zainstalowany pakiet JDK i użyje go do wszystkich narzędzi wiersza poleceń związanych z Javą w programie/usr/bin
.To całkiem proste. Powiedzmy, że mamy to w naszym folderze JavaVirtualMachines:
Wyobraź sobie, że 1.8 jest naszym domyślnym, po prostu dodajemy nowy folder (na przykład „stary”) i przenosimy domyślny folder jdk do tego nowego folderu. Zrób
java -version
ponownie et voila, 1.7!źródło
To całkiem proste, jeśli nie masz nic przeciwko zakasaniu rękawów ... / Library / Java / Home jest domyślnym dla JAVA_HOME, a to tylko link wskazujący na jeden z:
Chciałem więc zmienić moją domyślną wersję JVM / JDK bez zmiany zawartości JAVA_HOME ... / Library / Java / Home to standardowa lokalizacja dla obecnej JVM / JDK i to właśnie chciałem zachować ... wydaje mi się być najłatwiejszym sposobem zmiany rzeczy przy jak najmniejszych skutkach ubocznych.
To naprawdę proste. Aby zmienić wersję java, którą widzisz za pomocą java -version, wszystko, co musisz zrobić, to jej wersja:
Nie poświęciłem czasu, ale bardzo prosty skrypt powłoki, który wykorzystuje / usr / libexec / java_home i ln do zmiany powyższego linku symbolicznego, powinien być głupi łatwy do stworzenia ...
Po zmianie miejsca / Library / Java / Home ... otrzymasz poprawny wynik:
źródło
/Library/Java/Home
jest rzeczywiście dowiązaniem symbolicznym, ale wskazuje na to,/System/Library/Frameworks/JavaVM.framework/Home
które samo w sobie znajduje się w dużej mieszaninie dowiązań symbolicznych, które w końcu prowadzą do ... magicznego polecenia, które określa właściwe środowisko JRE do uruchomienia. Zauważ, że/usr/libexec/java_home
również łączy się z tą magią. Możesz więc przerwać wszystko, zastępując dowiązania symboliczne i wskazując pojedyncze środowisko JRE, ale za każdym razem będziesz musiał to aktualizować. Najwyraźniej nie ma takiego poleceniaset_preferred_jvm_version
ani czegoś podobnego.JAVA_HOME
nigdzie ustawiania . Bawię się tą techniką, aby sprawdzić, czy spowoduje to uruchomienie programów opartych na języku Java z „preferowaną” maszyną wirtualną Java. Podejrzewam, że tak, ale jest dość delikatny..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
U mnie zadziałały instrukcje dotyczące odinstalowywania oprogramowania Oracle dla oprogramowania Java 7 .
Fragment:
źródło
Trochę późno, ale ponieważ jest to ciągły problem w systemie Mac OSX ...
Najprostszym rozwiązaniem, jakie znalazłem, było po prostu usunięcie elementów OpenJDK, które instaluje Apple. Za każdym razem, gdy pojawia się aktualizacja systemu Mac OSX, jest ona instalowana i należy ją ponownie usunąć.
Działa to naprawdę dobrze, jeśli tworzysz aplikacje dla Google App Engine na komputerze Mac przy użyciu języka Java. OpenJDK nie działa dobrze, a wersja Java, która jest dostarczana z uaktualnieniem Mac OSX Yosemite, spowoduje awarię wtyczki Eclipse dla App Engine przy każdym wdrożeniu z pomocnym błędem: „Przekroczono limit czasu odczytu”.
źródło
Testowałem "jenv" i inne rzeczy, takie jak ustawienie "JAVA_HOME" bez powodzenia. Teraz ja i kończę na następującym rozwiązaniu
(dodane do ~ / .bashrc lub ~ / .bash.profile lub ~ / .zshrc)
I tak dzwonię:
java_home obsłuży błędne dane wejściowe. więc nie możesz zrobić czegoś złego. Maven i inne rzeczy wybiorą teraz właściwą wersję.
źródło
Właściwie przyjrzałem się temu trochę w deasemblerze, ponieważ źródło nie jest dostępne.
/ usr / bin / java i / usr / libexec / java_home korzystają z JavaLaunching.framework. Zmienna środowiskowa JAVA_HOME jest rzeczywiście najpierw sprawdzana przez / usr / bin / java i znajomych (ale nie przez / usr / libexec / java_home). Framework wykorzystuje zmienne środowiskowe JAVA_VERSION i JAVA_ARCH do filtrowania dostępnych maszyn JVM. Tak więc domyślnie:
Ale ustawienie, powiedzmy, JAVA_VERSION może zastąpić ustawienie domyślne:
Możesz również ustawić JAVA_LAUNCHER_VERBOSE = 1, aby wyświetlić dodatkowe rejestrowanie debugowania, takie jak ścieżki wyszukiwania, znalezione maszyny JVM itp., Zarówno z / usr / bin / java, jak i / usr / libexec / java_home.
W przeszłości JavaLaunching.framework faktycznie używał systemu preferencji (w domenie com.apple.java.JavaPreferences), aby ustawić preferowaną kolejność JVM, umożliwiając ustawienie domyślnej maszyny JVM za pomocą PlistBuddy - ale najlepiej, jak mogę powiedzieć, że kod został usunięty w najnowszych wersjach systemu macOS. Zmienne środowiskowe wydają się być jedynym sposobem (poza edytowaniem Info.plist w samych pakietach JDK).
Ustawienie domyślnych zmiennych środowiskowych można oczywiście wykonać poprzez plik .profile lub przez launchd , jeśli trzeba, ustawić je na poziomie sesji.
źródło
.profile
nie jest przydatne w moim przypadku użycia (uruchamianie aplikacji np. Z launchpada), ale wskazówkalaunchd
jest dobra. Będę musiał spróbować, ponieważ niedawne szaleństwo w zakresie wersjonowania Javy oznacza, że mam kilka generacji Javy zainstalowanych jednocześnie, z różnymi poziomami (osobistego) zaufania.Edycja: ta informacja jest przeznaczona specjalnie dla VisualVM, a nie dla żadnej innej aplikacji Java
Jak wspominali inni, musisz zmodyfikować plik visualvm.conf
W najnowszej wersji JvisualVM 1.3.6 na komputerach Mac katalogi instalacyjne uległy zmianie.
Obecnie znajduje się w /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
Jednak może to zależeć od tego, gdzie zainstalowano VisualVM. Najłatwiejszym sposobem znalezienia miejsca, w którym znajduje się Twój VisualVM, jest uruchomienie go, a następnie przyjrzenie się temu procesowi za pomocą:
ps -ef | grep VisualVM
Zobaczysz coś takiego:
... -Dnetbeans.dirs = / Applications / VisualVM.app / Contents / Resources / visualvm / visualvm ...
Chcesz wziąć właściwość netbeans.dir i poszukać katalogu, a znajdziesz folder etc.
Odkomentuj ten wiersz w pliku visualvm.conf i zmień ścieżkę do jdk
Dodatkowo, jeśli masz powolne działanie swojego visualvm i masz dużo pamięci, sugerowałbym znaczne zwiększenie ilości dostępnej pamięci i uruchomienie jej w trybie serwera:
źródło
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.Miałem podobną sytuację i następujący proces zadziałał dla mnie:
W terminalu wpisz
Następnie dodaj tę linię do pliku i zapisz
gdzie wersja to ta na komputerze, na przykład 1.7.0_25
Wyjdź z edytora, a następnie wpisz następujące polecenie, aby stało się skuteczne
Następnie wpisz java -version, aby sprawdzić wynik
Co to jest .profile? Od: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
źródło
MacOS używa / usr / libexec / java_home do znalezienia aktualnej wersji Java. Jednym ze sposobów na ominięcie jest zmiana pliku plist, jak wyjaśniono powyżej w @ void256. Innym sposobem jest wykonanie kopii zapasowej java_home i zastąpienie jej własnym skryptem java_home z kodem
echo $ JAVA_HOME
Teraz wyeksportuj JAVA_HOME do żądanej wersji SDK, dodając następujące polecenia do ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Ustaw zmienną środowiskową na globalną
Uruchom polecenie source ~ / .bash_profile, aby uruchomić powyższe polecenia.
Za każdym razem, gdy trzeba zmienić JAVA_HOME, można zresetować wartość JAVA_HOME w pliku ~ / .bash_profile.
źródło
Chciałem zmienić domyślną wersję java z 1.6 * na 1.7 *. Wypróbowałem następujące kroki i zadziałało:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
wersja java „1.7.0_51”
Java (TM) SE Runtime Environment (kompilacja 1.7.0_51-b13)
Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (wersja 24.51-b03, tryb mieszany)
źródło
/usr/libexec/java_home
.