it-swarm.dev

كيف يمكنني تغيير Java الافتراضي لنظام التشغيل Mac OS؟ VM عاد من/usr/libexec/Java_home

(لم تكن متأكداً مما إذا كان هذا يجب أن يستمر في SU ... من المؤكد أن الترحيل يعد خيارًا ، لكن المزيد من المبرمجين يقرؤون الأسئلة هنا ، لذلك هنا يذهب).

أقوم بتشغيل Mac OS X 10.8.4 ، ولدي JDK 1.6.0_51 من Apple مثبت بالإضافة إلى JDK 1.7.0_25 من Oracle. لقد قمت مؤخرًا بتثبيت JDK 1.8 لمعاينة JDK لبعض برامج ما قبل النشر التي تتطلب ذلك. الآن ، عندما أقوم بتشغيل/usr/libexec/Java_home ، أحصل على هذا:

$ /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

عظيم.

ومع ذلك ، تشغيل:

$ Java -version

عائدات:

Java version "1.8.0-ea"

هذا يعني أن الإصدار الافتراضي من Java هو الإصدار التجريبي حاليًا ، والذي يكسر بعض الحزم "العادية" (في حالتي ، VisualVM).

لا يمكنني ضبط Java_HOME لأن تشغيل التطبيقات يتجاهل متغيرات البيئة ، حتى عند التشغيل من سطر الأوامر (على سبيل المثال ، $ open /Applications/VisualVM.app).

إذن ، هل هناك ملف يمكنني تعديله حيث يمكنني ضبط تفضيلات طلب JVM الخاصة بي عالمي؟

(من فضلك لا تخبرني بتشغيل لوحة تفضيلات Java لأن ذلك ببساطة لا يعمل: إنه لا يحتوي على أي شيء مفيد ولا يسرد سوى قائمة من JVMs الأربعة التي قمت بتثبيتها.)

تحديث :

يعيش Oracle JVMs في /Library/Java/JavaVirtualMachines. لا تؤدي إعادة تسمية دليل JDK 1.8 إلى jdk1.8.0.jvm.xyz إلى تغيير أي شيء: لا يزال Java_home يجدها في المكان الصحيح ، ولا يزال تشغيل/usr/bin/Java ينفذ 1.8 JVM. هذه ليست مشكلة في الارتباطات ، إلخ.

إجابات على أسئلة مماثلة

على الرغم من أن هذه الإجابة تقدم ما يرقى إلى مستوى الاختراق الذي سيؤدي إلى إزالة إصدارات Java من أن يتم التقاطها بواسطة Java_home ، إلا أنه لا يزال لا يجيب على هذا السؤال عن {how Java_home يختار الافتراضي الخاص به أم لا المستخدمين يمكن غير مدمرة تعيينها .

97
Christopher Schultz

أعتقد أن Java_HOME هو أفضل ما يمكنك القيام به. ستحترم أدوات سطر الأوامر مثل Java و javac متغير البيئة ، يمكنك استخدام /usr/libexec/Java_home -v '1.7*' لتعطيك قيمة مناسبة لوضعها في Java_HOME من أجل جعل أدوات سطر الأوامر تستخدم Java 7.

export Java_HOME="`/usr/libexec/Java_home -v '1.7*'`"

لكن حزم التطبيقات القياسية القابلة للنقر المزدوج لا تستخدم JDKs المثبتة تحت /Library/Java على الإطلاق. سوف تستخدم حزم .app ذات النمط القديم التي تستخدم JavaApplicationStub من Apple Apple Java 6 من /System/Library/Frameworks ، كما ستستخدم حزم النمط الجديد المصممة مع AppBundler JB المجمعة JRE "العام" في J__ في /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home - هذا مرمز بشكل ثابت في كود كعب الروتين ولا يمكن تغييرها ، ولا يمكن تثبيت اثنين من JREs العامة المختلفة في نفس الوقت.


تحرير: لقد ألقيت نظرة على VisualVM على وجه التحديد ، بافتراض أنك تستخدم إصدار "حزمة التطبيق" من صفحة التنزيل ، وهذا التطبيق المحدد ليس تطبيق AppBundler ، بدلاً من ذلك يكون الملف التنفيذي الرئيسي هو برنامج Shell يستدعي عددًا من البرامج النصية الأخرى لـ Shell ويقرأ ملفات التكوين المختلفة. من المفترض اختيار أحدث إصدار JDK من /Library/Java طالما كان 7u10 أو أحدث ، أو يستخدم Java 6 إذا تم تحديث تثبيت Java 7 9 أو إصدار سابق. ولكن كشف المنطق في البرامج النصية Shell يبدو لي أنه يمكنك تحديد JDK معين باستخدام ملف التكوين.

قم بإنشاء ملف نصي ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf (استبدل 1.3.6 بأي إصدار من VisualVM تستخدمه) يحتوي على السطر

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

وهذا سيجبرها على اختيار Java 7 بدلاً من 8.

85
Ian Roberts

لقد كنت هناك أيضًا وبحثت في كل مكان عن كيفية عمل /usr/libexec/Java_home لكن لم أجد أي معلومات حول كيفية تحديد Java Virtual Machines المتوفرة التي يسردها.

لقد جربت بعض الشيء وأعتقد أنه ينفذ ببساطة ls /Library/Java/JavaVirtualMachines ثم يتفقد ./<version>/Contents/Info.plist لجميع أوقات التشغيل التي يجدها هناك.

ثم يقوم بفرزهم تنازلي بواسطة المفتاح JVMVersion المتضمن في Info.plist ، ويستخدم بشكل افتراضي الإدخال الأول باعتباره JVM الافتراضي الخاص به.

أعتقد أن الشيء الوحيد الذي قد نفعله هو تغيير الصورة: Sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist ثم تعديل JVMVersion من 1.8.0 إلى شيء آخر يجعله يفرزها في الأسفل بدلاً من الأعلى ، مثل !1.8.0.

شيء مثل:

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

ثم يختفي بطريقة سحرية من أعلى القائمة:

/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

الآن سوف تحتاج إلى تسجيل الخروج/تسجيل الدخول ومن ثم:

Java -version
Java version "1.7.0_45"

:-)

بالطبع ليس لدي أي فكرة عما إذا كان هناك شيء آخر يكسر الآن أو إذا كان الإصدار 1.8.0 ea من Java لا يزال يعمل بشكل صحيح.

ربما لا ينبغي عليك القيام بأي من هذا ولكن بدلاً من ذلك ، عليك ببساطة إلغاء تثبيت 1.8.0.

لكن حتى الآن هذا قد عملت بالنسبة لي.

48
void256

أوراكل تعليمات إلغاء التثبيت لجافا 7 عملت بالنسبة لي.

مقتطفات:

إلغاء تثبيت JDK لإلغاء تثبيت JDK ، يجب أن يكون لديك امتيازات المسؤول وتنفيذ الأمر remove إما كجذر أو باستخدام أداة Sudo (8).

انتقل إلى/Library/Java/JavaVirtualMachines وأزل الدليل الذي يطابق اسمه بالتنسيق التالي: *

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

على سبيل المثال ، لإزالة تثبيت 7u6:

% rm -rf jdk1.7.0_06.jdk

5
duma

الأمر بسيط للغاية ، إذا كنت لا تمانع في طي سواعدك .../Library/Java/Home هو الافتراضي لـ Java_HOME ، وهو مجرد رابط يشير إلى أحد:

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

لذلك أردت تغيير إصدار JVM/JDK الافتراضي الخاص بي بدون تغيير محتويات Java_HOME .../Library/Java/Home هو الموقع القياسي لـ JVM/JDK الحالي وهذا ما أردت الحفاظ عليه ... يبدو لي أنه أسهل طريقة لتغيير الأشياء بأقل آثار جانبية.

انها فعلا بسيطة حقا. لتغيير إصدار Java الذي تراه مع Java -version ، كل ما عليك فعله هو إصدار من هذا الإصدار:

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

لم أكن قد قضيت الوقت ، ولكن يجب أن يكون برنامج شل البسيط الذي يستخدم/usr/libexec/Java_home و ln لإعادة تعيين الارتباط أعلاه ، سهل الغباء لإنشاء ...

بمجرد تغيير المكان الذي تتم الإشارة إليه/Library/Java/Home ... ستحصل على النتيجة الصحيحة:

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)
5
jrypkahauer

انها فعلا سهلة جدا. دعنا نقول أن لدينا هذا في مجلد JavaVirtualMachines لدينا:

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

تخيل أن 1.8 هو الافتراضي ، ثم نضيف فقط مجلدًا جديدًا (على سبيل المثال "قديم") وننقل مجلد jdk الافتراضي إلى ذلك المجلد الجديد. هل Java -version مرة أخرى et فويلا ، 1.7!

5
User404

متأخرة بعض الشيء ولكن لأن هذه مشكلة مستمرة مع Mac OSX ...

الحل الأبسط الذي وجدته هو إزالة عناصر OpenJDK التي تقوم بتثبيتها Apple. في كل مرة يصل فيها تحديث لنظام Mac OSX ، يتم تثبيته وستحتاج إلى إزالته مرة أخرى.

يعمل هذا بشكل جيد إذا قمت بتطوير تطبيقات لـ Google App Engine على جهاز Mac باستخدام Java. لا يعمل OpenJDK جيدًا وسيؤدي إصدار Java الذي يأتي مع ترقية Mac OSX Yosemite إلى تعطل Eclipse Plug-in لـ App Engine في كل عملية نشر مع وجود خطأ مفيد: "انتهت مهلة القراءة".

4
Mo'in Creemers

لقد اختبرت "jenv" وأشياء أخرى مثل إعداد "Java_HOME" دون نجاح. الآن أنا وانتهيت مع الحل التالي

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
}

(تمت الإضافة إلى ~/.bashrc أو ~/.bash.profile أو ~/.zshrc)

والدعوة من هذا القبيل:

setJava 1.8

سوف Java_home التعامل مع المدخلات خاطئ. لذلك لا يمكنك أن تفعل شيئا خاطئا. سوف مخضرم وغيرها من الاشياء التقاط الإصدار الصحيح الآن.

0
Yuna Braska