(Tidak yakin apakah ini harus berjalan di SU ... migrasi tentu saja merupakan pilihan, tetapi lebih banyak pemrogram membaca pertanyaan di sini, jadi begini).
Saya menjalankan Mac OS X 10.8.4, dan saya telah menginstal JDK 1.6.0_51 Apple serta JDK 1.7.0_25 Oracle. Saya baru-baru ini menginstal JDK pratinjau 1.8 Oracle untuk beberapa perangkat lunak pra-rilis yang membutuhkannya. Sekarang, ketika saya menjalankan / usr / libexec / java_home, saya mendapatkan ini:
$ /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
Bagus.
Namun, menjalankan:
$ java -version
Pengembalian:
java version "1.8.0-ea"
Itu berarti bahwa versi default Java saat ini adalah versi pra-rilis, yang merusak beberapa paket "normal" (dalam kasus saya, VisualVM).
Saya tidak dapat menyetel JAVA_HOME
karena meluncurkan aplikasi mengabaikan variabel lingkungan, bahkan saat meluncurkan dari baris perintah (misalnya $ open /Applications/VisualVM.app
).
Jadi, apakah ada file yang dapat saya edit di mana saya dapat mengatur preferensi pemesanan JVM saya secara global ?
(Tolong jangan beri tahu saya untuk meluncurkan Panel Preferensi Java karena itu tidak berfungsi: tidak berisi sesuatu yang berguna dan hanya mencantumkan salah satu dari 4 JVM yang telah saya instal.)
Pembaruan :
Oracle JVM tersedia /Library/Java/JavaVirtualMachines
. Penamaan ulang direktori JDK 1.8 jdk1.8.0.jvm.xyz
tidak mengubah apa pun: java_home
masih menemukannya di tempat yang benar, dan menjalankan / usr / bin / java masih mengeksekusi 1.8 JVM. Ini bukan masalah dengan tautan sinkronisasi, dll.
Jawaban untuk Pertanyaan Serupa
Meskipun jawaban ini menawarkan jumlah peretasan yang akan menghapus versi Java agar tidak diambil oleh java_home, jawaban ini masih tidak menjawab pertanyaan tentang bagaimana java_home memilih defaultnya dan apakah pengguna dapat mengaturnya secara non-destruktif atau tidak .
/usr/bin/java
hanya symlink/usr/bin/java
menunjuk ke/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
. TheVersions
direktori tidak berisi symlink ke 1.8.0 JDK. Sebaliknya, berisi direktori membantu disebutA
yangCurrent
menunjuk ke.A
bukan "JAVA_HOME. Ia memiliki subdirektori bernamaCommands
yang memang memilikijava
perintah, tetapi ini adalah biner universal buram yang melakukan siapa-tahu-apa. Saya curiga ia menggunakanjava_home
, dll. untuk memutuskan JVM mana yang akan digunakan.Jawaban:
Saya pikir
JAVA_HOME
itu yang terbaik yang bisa Anda lakukan. Alat baris perintah menyukaijava
danjavac
akan menghormati variabel lingkungan itu, Anda dapat menggunakan/usr/libexec/java_home -v '1.7*'
untuk memberi Anda nilai yang sesuai untuk dimasukkanJAVA_HOME
agar alat baris perintah menggunakan Java 7.Tetapi bundel aplikasi standar yang dapat diklik dua kali tidak menggunakan JDK yang diinstal
/Library/Java
sama sekali..app
Bundel gaya lama yang menggunakan AppleJavaApplicationStub
akan menggunakan Apple Java 6 dari/System/Library/Frameworks
, dan bundel gaya baru yang dibuat dengan AppBundler tanpa JRE yang dibundel akan menggunakan JRE "publik"/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- yang di-hardcode dalam kode rintisan dan tidak dapat diubah, dan Anda tidak dapat menginstal dua JRE publik yang berbeda pada saat yang sama.Sunting: Saya telah melihat VisualVM secara khusus, dengan asumsi Anda menggunakan versi "bundel aplikasi" dari halaman unduhan , dan aplikasi khusus ini bukan aplikasi AppBundler, sebaliknya yang dapat dieksekusi utamanya adalah skrip shell yang memanggil nomor skrip shell lainnya dan membaca berbagai file konfigurasi. Secara default memilih JDK terbaru
/Library/Java
selama 7u10 atau yang lebih baru, atau menggunakan Java 6 jika penginstalan Java 7 Anda diperbarui 9 atau lebih lama. Tetapi mengungkap logika dalam skrip shell, menurut saya Anda dapat menentukan JDK tertentu menggunakan file konfigurasi.Buat file teks
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
(ganti 1.3.6 dengan versi VisualVM apa pun yang Anda gunakan) yang berisi barisdan ini akan memaksanya untuk memilih Java 7, bukan 8.
sumber
JAVA_HOME
adalah cara yang harus dilakukan dan secara umum taruhan terbaik Anda adalah menentukan versi minor yang Anda butuhkan dalam kasus lain. Berdasarkan pembongkaran, ternyata Anda dapatexport JAVA_VERSION=1.7
membuatjava_home
default untuk menampilkan JKD7 bukan JDK8, tetapi itu rusakjava_home -v 1.6
karenajava-home
menafsirkannya sebagai kendala tambahan dan menyerah karena kendala yang sama-sama tidak memuaskan, kemudian hanya pergi dengan default 1.8 bahkan dengan--failfast
opsi.Saya juga pernah ke sana dan mencari di mana-mana cara
/usr/libexec/java_home
kerjanya, tetapi saya tidak dapat menemukan informasi apa pun tentang cara menentukan Java Virtual Machine yang tersedia dalam daftar.Saya telah bereksperimen sedikit dan saya pikir itu hanya mengeksekusi
ls /Library/Java/JavaVirtualMachines
dan kemudian memeriksa./<version>/Contents/Info.plist
semua runtime yang ditemukan di sana.Ini kemudian mengurutkan mereka secara turun menurut kunci yang
JVMVersion
terdapat dalam Info.plist dan secara default menggunakan entri pertama sebagai JVM default-nya.Saya pikir satu-satunya hal yang mungkin kita lakukan adalah mengubah plist:
sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
dan kemudian memodifikasi JVMVersion dari1.8.0
sesuatu yang lain yang membuatnya mengurutkannya ke bawah dan bukan ke atas, seperti!1.8.0
.Sesuatu seperti:
dan kemudian secara ajaib menghilang dari daftar teratas:
Sekarang Anda harus keluar / masuk dan kemudian:
:-)
Tentu saja saya tidak tahu apakah ada hal lain yang rusak sekarang atau jika Java versi 1.8.0-ea masih berfungsi dengan benar.
Anda mungkin sebaiknya tidak melakukan semua ini, tetapi cukup deinstal 1.8.0.
Namun sejauh ini ini berhasil untuk saya.
sumber
/usr/libexec/java_home -v 1.7
. Saya rasa saya akan melakukan hal yang sama untuk JAVA_HOME .../usr/bin/java
akan menemukan JDK terbaru yang diinstal, dan akan menggunakannya untuk semua alat baris perintah terkait Java di/usr/bin
.Sebenarnya cukup mudah. Katakanlah kita memiliki ini di folder JavaVirtualMachines kita:
Bayangkan 1.8 adalah default kami, lalu kami hanya menambahkan folder baru (misalnya 'lama') dan memindahkan folder jdk default ke folder baru tersebut. Lakukan
java -version
lagi et voila, 1.7!sumber
Ini cukup sederhana, jika Anda tidak keberatan menyingsingkan lengan baju Anda ... / Library / Java / Home adalah default untuk JAVA_HOME, dan itu hanya tautan yang mengarah ke salah satu dari:
Jadi saya ingin mengubah versi JVM / JDK default saya tanpa mengubah konten JAVA_HOME ... / Library / Java / Home adalah lokasi standar untuk JVM / JDK saat ini dan itulah yang ingin saya pertahankan ... menurut saya menjadi cara termudah untuk mengubah hal-hal dengan efek samping paling sedikit.
Sebenarnya sangat sederhana. Untuk mengubah versi java mana yang Anda lihat dengan java -version, yang harus Anda lakukan adalah beberapa versi ini:
Saya belum meluangkan waktu tetapi skrip shell yang sangat sederhana yang menggunakan / usr / libexec / java_home dan ln untuk memasang kembali symlink di atas seharusnya sangat mudah dibuat ...
Setelah Anda mengubah tempat / Library / Java / Home diarahkan ... Anda mendapatkan hasil yang benar:
sumber
/Library/Java/Home
memang symlink, tetapi menunjuk ke/System/Library/Frameworks/JavaVM.framework/Home
mana itu sendiri berada dalam tumpukan besar symlink yang akhirnya membawa Anda ke ... perintah ajaib yang menentukan JRE yang tepat untuk diluncurkan. Perhatikan bahwa itu/usr/libexec/java_home
juga terkait dengan keajaiban ini. Jadi, Anda dapat menghentikan semuanya hanya dengan mengganti symlink dan menunjuk ke satu JRE, tetapi Anda harus memperbaruinya setiap saat. Jelas tidak ada perintah sepertiset_preferred_jvm_version
atau yang serupa.JAVA_HOME
mana pun. Saya akan bermain dengan teknik ini untuk melihat apakah itu akan menghasilkan program berbasis Java yang diluncurkan dengan Java VM yang "disukai". Saya menduga itu akan terjadi, tetapi cukup rapuh..bash_profile
:export JAVA_HOME=`/usr/libexec/java_home -v 12`
Instruksi penghapusan instalan Oracle untuk Java 7 berfungsi untuk saya.
Kutipan:
sumber
Agak terlambat tetapi karena ini adalah masalah yang sedang berlangsung dengan Mac OSX ...
Solusi paling sederhana yang saya temukan adalah menghapus hal-hal OpenJDK yang diinstal Apple. Setiap kali pembaruan Mac OSX tiba, pembaruan akan diinstal dan Anda harus menghapusnya lagi.
Ini bekerja dengan sangat baik jika Anda mengembangkan aplikasi untuk Google App Engine di mac Anda menggunakan Java. OpenJDK tidak bekerja dengan baik dan versi Java yang disertakan dengan upgrade Mac OSX Yosemite akan membuat Eclipse Plug-in untuk App Engine mogok pada setiap penerapan dengan kesalahan yang membantu: "Waktu baca habis".
sumber
Saya menguji "jenv" dan hal-hal lain seperti menyetel "JAVA_HOME" tidak berhasil. Sekarang saya dan akhiri dengan solusi berikut
(ditambahkan ke ~ / .bashrc atau ~ / .bash.profile atau ~ / .zshrc)
Dan memanggil seperti itu:
java_home akan menangani masukan yang salah. jadi kamu tidak bisa melakukan sesuatu yang salah. Maven dan lainnya akan memilih versi yang benar sekarang.
sumber
Saya sebenarnya melihat ini sedikit di pembongkaran, karena sumber tidak tersedia.
/ usr / bin / java dan / usr / libexec / java_home keduanya menggunakan JavaLaunching.framework. Variabel lingkungan JAVA_HOME memang diperiksa pertama kali oleh / usr / bin / java dan teman-teman (tetapi bukan / usr / libexec / java_home.) Kerangka kerja menggunakan variabel lingkungan JAVA_VERSION dan JAVA_ARCH untuk memfilter JVM yang tersedia. Jadi, secara default:
Tetapi pengaturan, katakanlah, JAVA_VERSION dapat menimpa default:
Anda juga dapat menyetel JAVA_LAUNCHER_VERBOSE = 1 untuk melihat beberapa logging debug tambahan sejauh jalur pencarian, JVM yang ditemukan, dll., Dengan / usr / bin / java dan / usr / libexec / java_home.
Di masa lalu, JavaLaunching.framework sebenarnya menggunakan sistem preferensi (di bawah domain com.apple.java.JavaPreferences) untuk mengatur urutan JVM yang disukai, memungkinkan JVM default disetel dengan PlistBuddy - tetapi sebaik yang saya tahu, itu kode telah dihapus di versi terbaru macOS. Variabel lingkungan tampaknya menjadi satu-satunya cara (selain mengedit Info.plist di bundel JDK itu sendiri.)
Menyetel variabel lingkungan default tentu saja dapat dilakukan melalui .profile Anda atau melalui launchd , jika Anda membutuhkannya disetel pada tingkat sesi.
sumber
.profile
tidak berguna untuk kasus penggunaan saya (meluncurkan aplikasi dari misalnya launchpad) tetapi tipnyalaunchd
bagus. Saya harus mencobanya, karena kegilaan versi Java baru-baru ini berarti saya memiliki beberapa generasi Java yang diinstal secara bersamaan, dengan berbagai tingkat kepercayaan (pribadi).Edit: informasi ini khusus untuk visualvm, bukan untuk aplikasi java lainnya
Seperti yang disebutkan oleh orang lain, Anda perlu memodifikasi visualvm.conf
Untuk versi terbaru JvisualVM 1.3.6 di Mac, direktori instal telah berubah.
Saat ini ada di /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf .
Namun ini mungkin tergantung pada tempat Anda menginstal VisualVM. Cara termudah untuk menemukan di mana VisualVM Anda adalah memulainya, dan kemudian lihat prosesnya menggunakan:
ps -ef | grep VisualVM
Anda akan melihat sesuatu seperti:
... -Dnetbeans.dirs = / Aplikasi / VisualVM.app / Isi / Sumber / visualvm / visualvm ...
Anda ingin membuka properti netbeans.dir dan mencari direktori dan Anda akan menemukan folder etc.
Batalkan komentar baris ini di visualvm.conf dan ubah jalur ke jdk
Selain itu, jika Anda mengalami kelambatan dengan visualvm Anda dan Anda memiliki banyak memori, saya sarankan untuk sangat meningkatkan jumlah memori yang tersedia dan menjalankannya dalam mode server:
sumber
~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf
.Saya memiliki situasi yang serupa, dan proses berikut berhasil untuk saya:
Di terminal, ketik
Kemudian tambahkan baris ini di file, dan simpan
dengan versi yang ada di komputer Anda, seperti 1.7.0_25
Keluar dari editor, lalu ketik perintah berikut agar efektif
Kemudian ketik java -version untuk memeriksa hasilnya
Apa itu .profile? Dari: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515
sumber
MacOS menggunakan / usr / libexec / java_home untuk menemukan Versi Java saat ini. Salah satu cara untuk melewati adalah dengan mengubah file plist seperti yang dijelaskan oleh @ void256 di atas. Cara lain adalah dengan mengambil backup java_home dan menggantinya dengan script java_home milik Anda sendiri yang memiliki kode
echo $ JAVA_HOME
Sekarang ekspor JAVA_HOME ke versi SDK yang diinginkan dengan menambahkan perintah berikut ke ~ / .bash_profile. export JAVA_HOME = "/ System / Library / Java / JavaVirtualMachines / 1.6.0.jdk / Contents / Home" launchctl setenv JAVA_HOME $ JAVA_HOME /// Jadikan variabel lingkungan global
Jalankan sumber perintah ~ / .bash_profile untuk menjalankan perintah di atas.
Setiap kali seseorang perlu mengubah JAVA_HOME, dia dapat mengatur ulang nilai JAVA_HOME di file ~ / .bash_profile.
sumber
Saya ingin mengubah versi java default dari 1.6 * menjadi 1.7 *. Saya mencoba langkah-langkah berikut dan berhasil untuk saya:
ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java java
versi java "1.7.0_51"
Java (TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot (TM) 64-Bit Server VM (build 24.51-b03, mode campuran)
sumber
/usr/libexec/java_home
.