ما هو الهدف الصحيح لمتغير البيئة JAVA_HOME للتوزيع المستند إلى Linux OpenJDK Debian؟

StackOverflow https://stackoverflow.com/questions/663658

سؤال

في ويندوز، 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 القياسية.

  1. إذا كنت تستخدم:

    JAVA_HOME=/usr
    

    يمكن لجميع التطبيقات والبرامج النصية التي ترغب في استخدام أي برنامج Java قابل للتنفيذ استخدام الإجراء القياسي call $JAVA_HOME/bin/executable.ومع ذلك، بما أن الجرار موجودة في مكان مختلف، فلا يتم العثور عليها دائمًا (مثال:في الكؤوس التي أحصل عليها ClassDefNotFound ل native2ascii).

  2. ومن ناحية أخرى، إذا كنت تستخدم:

    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.مزيد من المعلومات على:

https://help.ubuntu.com/community/Java

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top