ما هو الهدف الصحيح لمتغير البيئة JAVA_HOME للتوزيع المستند إلى Linux OpenJDK Debian؟
-
20-08-2019 - |
سؤال
في ويندوز، JAVA_HOME
يجب أن يشير إلى مجلد تثبيت JDK (وبالتالي JAVA_HOME/bin
يحتوي على كافة الملفات التنفيذية و JAVA_HOME/libs
يحتوي على كافة الافتراضية jar
المكتبات).
إذا قمت بتنزيل حزمة Sun's JDK وقمت بتثبيتها على Linux، فسيكون نفس الإجراء.
ومع ذلك، أحتاج إلى استخدام حزمة OpenJDK الافتراضية الخاصة بـ Kubuntu.المشكلة هي أن كافة الملفات التنفيذية يتم وضعها في /usr/bin
.ولكن يتم وضع الجرار فيها /usr/share/java
.لأنهم ليسوا تحت نفس JAVA_HOME
أواجه مشكلة مع Grails وربما ستكون هناك مشكلة مع التطبيقات الأخرى التي تتوقع بنية Java القياسية.
إذا كنت تستخدم:
JAVA_HOME=/usr
يمكن لجميع التطبيقات والبرامج النصية التي ترغب في استخدام أي برنامج Java قابل للتنفيذ استخدام الإجراء القياسي
call $JAVA_HOME/bin/executable
.ومع ذلك، بما أن الجرار موجودة في مكان مختلف، فلا يتم العثور عليها دائمًا (مثال:في الكؤوس التي أحصل عليهاClassDefNotFound
لnative2ascii
).ومن ناحية أخرى، إذا كنت تستخدم:
JAVA_HOME=/usr/share/java
لا يوجد أي من ملفات Java التنفيذية (
java
,javac
, الخ) يمكن العثور عليها.
إذن ما هي الطريقة الصحيحة للتعامل مع JAVA_HOME
متغير في نظام التشغيل Linux القائم على دبيان؟
شكرا لمساعدتك يا لويس
المحلول
ما نجح أخيرًا بالنسبة لي (يعمل Grails الآن بسلاسة) هو ما يفعله Steve B تقريبًا.وقد أشار:
JAVA_HOME=/usr/lib/jvm/default-java
بهذه الطريقة، إذا قام المستخدم بتغيير JDK الافتراضي للنظام، JAVA_HOME
مازال يعمل.
default-java
هو رابط رمزي لـ JVM الحالي.
نصائح أخرى
إذا كنت تستخدم بدائل لإدارة إصدارات Java المتعددة، فيمكنك تعيين JAVA_HOME
استنادًا إلى Java (أو javac) المرتبطة بالرمز مثل هذا:
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
يبدو أن تثبيت Ubuntu القياسي يضع إصدارات Java المختلفة فيه /usr/lib/jvm
.ال javac
, ، جافا التي تجدها في المسار الخاص بك سوف ترتبط بهذا.
لا توجد مشكلة في تثبيت إصدار Java الخاص بك في أي مكان تريده، طالما قمت بتعيين JAVA_HOME
متغير البيئة وتأكد من حصولك على Java الجديد bin
على طريقك.
إحدى الطرق البسيطة للقيام بذلك هي أن يكون موقع Java الرئيسي موجودًا كرابط إلكتروني، بحيث إذا كنت تريد ترقية الإصدارات أو تبديلها، فما عليك سوى تغيير الدليل الذي يشير إليه هذا - على سبيل المثال:
/usr/bin/java --> /opt/jdk/bin/java,
/opt/jdk --> /opt/jdk1.6.011
ليس لدي عادةً أي متغير بيئة Java_HOME.يمكن لـ Java إعدادها بنفسها.يجب أن تكون خاصية نظام Java.home متاحة داخل Java.
حاول تعيين المتغير JAVA_LIB أيضًا.
بقدر ما أتذكر، استخدمت البرنامج النصي update-java-alternatives بدلاً من بدائل التحديث.وقد قام بتعيين Java_HOME لي بشكل صحيح.
إذا كانت لديك مشكلات تتعلق بعدم العثور على ملفات JAR، فسأضمن أيضًا تعيين CLASSPATH الخاص بك ليشمل موقع تلك الملفات.ومع ذلك، أجد أن CLASSPATH يحتاج في كثير من الأحيان إلى ضبطه بشكل مختلف لبرامج مختلفة، وغالبًا ما ينتهي به الأمر إلى أن يكون شيئًا يمكن تعيينه بشكل فريد للبرامج الفردية.
يمكن العثور هنا على إجابة محدثة من شأنها أن تحل مشكلتك وكذلك مجرد كيفية عامة جيدة لتثبيت Oracle Java 7 على Ubuntu: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux
لقد اكتشفت مشكلات مماثلة مع الحزمتين openjdk-6-jre وopenjdk-6-jre-headless في Ubuntu.
تم حل مشكلتي عن طريق إزالة الحزمتين openjdk-6-jre وopenjdk-6-jre-headless وإعادة تثبيتهما.يتم تحديث البدائل فقط عند التثبيت الجديد للحزمتين openjdk-6-jre وopenjdk-6-jre-headless.
فيما يلي عينة من التثبيت بعد التطهير:
aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...
يمكنك أن ترى فوق ذلك update-alternatives
يتم تشغيله لإعداد روابط لثنائيات Java المختلفة.
بعد هذا التثبيت، هناك أيضًا روابط في /usr/bin
, ، الروابط في /etc/alternatives
, والملفات لكل ثنائي في /var/lib/dpkg/alternatives
.
ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root 40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root 22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java
دعونا نقارن هذا بالتثبيت دون التطهير.
aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...
كما ترى، update-alternatives
لم يتم تشغيله.
بعد هذا التثبيت، لا توجد ملفات لثنائيات Java في /var/lib/dpkg/alternatives
, ، لا توجد روابط في /etc/alternatives
, ، ولا توجد روابط في /usr/bin
.
إزالة الملفات الموجودة في /var/lib/dpkg/alternatives
فواصل أيضا update-java-alternatives
.
أوبونتو 12.04 هذا يعمل ...
JAVA_HOME=/usr/lib/jvm/Java-6-openjdk-i386/jre
كتحديث لمستخدم Fedora ، قم بتعيين بدائل Java الحالية على/usr/java/default
لذلك يتعين عليك ضبط Java_HOME على /usr/Java/default حتى يكون لديك دائمًا بدائل مختارة حاليًا في مسار الفصل الدراسي الخاص بك
هث!
لقد كان هدفي الصحيح دائمًا هو تنزيله من Sun وتثبيته بهذه الطريقة.ثم تعرف بالضبط ما هو الدليل الذي يدخل فيه كل شيء.
لكن إذا كنت تفضل الالتزام بالطريقة الغريبة التي يقوم بها دبيان بتثبيته، فإن أفضل تخميني هو الدليل الأصلي الموجود أعلى المكان الذي توجد فيه ثنائيات java وjavac.
(لأنه عند تحديده في طريقك ، يكون $ java_home/bin) (لذلك في حالتك سيكون ...$JAVA_HOME/share و$JAVA_HOME سيكونان /usr؟)
اه، هذا لا يبدو صحيحا...
أنا مهتم بسماع الإجابة على هذا أيضًا!
يرجى الاطلاع على ما يفعله أمر التحديث البديل (يحتوي على رجل لطيف...).
قريبًا - ماذا يحدث عندما يكون لديك java-sun-1.4 وjava-opensouce-1.0...أي واحد يأخذ "جافا"؟إن debian "/usr/bin/Java" هو رابط رمزي و"/usr/bin/Java-sun-1.4" هو بديل لـ "/usr/bin/Java"
يحرر:وكما قال ريتشارد، update-alternatives
ليس كافيا.أنت في الواقع بحاجة إلى استخدام update-java-alternatives
.مزيد من المعلومات على: