Яка правильна мета для змінної середовища JAVA_HOME для дистрибутива на базі Linux OpenJDK Debian?


90

У Windows JAVA_HOMEпотрібно вказати на папку встановлення JDK (щоб вона JAVA_HOME/binмістила всі виконувані файли та JAVA_HOME/libsмістила всі jarбібліотеки за замовчуванням ).

Якщо я завантажую пакет JDK від Sun і встановлюю його в 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 на базі Debian?

Дякуємо за допомогу, Луїс

Відповіді:


97

Те, що нарешті у мене вийшло (Grails тепер працює безперебійно), робиться майже так, як зазначив Стів Б.:

JAVA_HOME=/usr/lib/jvm/default-java

Таким чином, якщо користувач змінює стандартний JDK для системи, JAVA_HOMEвсе ще працює.

default-java є символічним посиланням на поточну JVM.


6
Здається, такого посилання немає на Debian 7
1

3
На RHEL5.10 це / usr / lib / jvm / java
Брайан

1
Я використовував / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn

Для Oracle Linux 7 (це має стосуватися CentOS та RHEL), я створив файл під назвою /etc/profile.d/java.sh і заповнив його таким: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME після повторного пошуку / etc / profile (запустивши source / etc / profile) JAVA_HOME заповнився, як очікувалося.
darnold0714

79

Якщо ви використовуєте альтернативні варіанти для керування кількома версіями Java, ви можете встановити JAVA_HOMEбазу на основі посилання java (або javac) таким чином:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

3
Це працює для мене: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan

4
Блискуче рішення вирішує мої багаторічні головні болі за допомогою JAVA_HOME, який, як правило, вказує на різні місця в різних операційних системах.
Datageek

3
зауважте, що це розумне рішення не буде працювати на таких дистрибутивах, як Gentoo, які /usr/bin/javaвказують на скрипт ( /usr/libexec/eselect-java/run-java-tool.bash). все-таки це приємний підхід. Єдине , що я змінив би це заміна використовувати вбудований в Bash , щоб уникнути породжуючи sed, наприклад:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO

Це працює добре :) Можливо, хочеться змінити javacна, javaоскільки не у всіх встановлений JDK; тільки JRE
Hanxue

1
@AlexisWilke тепер Java замість javac
bbaassssiiee

6

Здається, що стандартна установка Ubuntu містить різні версії Java /usr/lib/jvm. javac, Java ви знайдете на вашому шляху буде до цього м'якою посиланням .

Немає проблем із встановленням власної версії Java куди завгодно, якщо ви встановите JAVA_HOMEзмінну середовища та переконайтеся, що binна вашому шляху є нова Java .

Простий спосіб зробити це - мати дім Java як програмне посилання, так що якщо ви хочете оновити або змінити версію, вам потрібно лише змінити каталог, на який це вказує - наприклад:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011

небезпечно рекомендувати рішення Ubuntu з Debian. Вони можуть і різняться.
RichieHH

4
Зауважте, що запитувач сказав, що він використовував Kubuntu, тому рішення Ubuntu повинні бути в порядку.
Джозеф Холстен

0

Зазвичай у мене немає змінної середовища JAVA_HOME. Java може налаштувати її сама. Усередині системної властивості java.home повинна бути доступна.


Зазвичай у мене його теж немає. Однак, якщо я не налаштовую це, Grails скаржиться, що JAVA_HOME там немає, і перериває.
Луїс Соейро,

мураха це теж потрібно в debian, що є контекстом
RichieHH


0

Наскільки я пам’ятаю, я використовував сценарій update-java-alternatives замість update-alternatives. І це правильно встановило для мене JAVA_HOME.


0

Якщо у вас проблеми з файлами JAR, які не знайдені, я б також переконався, що ваш CLASSPATH налаштовано включати місце розташування цих файлів. Однак я виявляю, що CLASSPATH часто потрібно встановлювати по-різному для різних програм, і часто в кінцевому підсумку є тим, що встановлюється унікально для окремих програм.



0

Я виявив подібні проблеми з пакетами 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.



0

Як оновлення для користувача Fedora, альтернативи встановлюють поточний каталог Java на / usr / java / за замовчуванням

тому вам потрібно встановити для свого JAVA_HOME значення / usr / java / за замовчуванням, щоб завжди мати альтернативні поточні виділення у вашому шляху до класу

HTH!


0

Я завжди прагну встановити JAVA_HOME відповідно до /usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

Таким чином, обидві альтернативи вказують на одне і те ж місце


-1

Будь ласка, подивіться, що робить команда update-alternatives (у неї хороший чоловік ...).

Коротко - що відбувається, коли у вас є java-sun-1.4 та java-opensouce-1.0 ... який бере "java"? Це debian "/ usr / bin / java" є символічним посиланням, а "/usr/bin/java-sun-1.4" є альтернативою "/ usr / bin / java"

Редагувати: Як сказав Річард, update-alternativesцього недостатньо. Вам насправді потрібно використовувати update-java-alternatives. Більше інформації за адресою:

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


альтернатив оновлення недостатньо. Це має бути update-java-alternative
RichieHH

@Richard: так, зазначив. Вперше я пішов про це, тому погуглив і знайшов документацію Ubuntu. Дякую!
elcuco

-2

Моєю правильною метою завжди було завантажити його з Sun і просто встановити таким чином. Тоді ви точно знаєте, в якому каталозі все знаходиться.

Але якщо ви віддаєте перевагу незрозумілому способу його встановлення Debian, найкраще припустити, що це батьківський каталог, який знаходиться трохи вище, де розташовані двійкові файли java та javac.

(оскільки коли ви вказуєте це у своєму шляху, це $ JAVA_HOME / bin) (Отже, у вашому випадку це буде ... $ JAVA_HOME / share і $ JAVA_HOME буде / usr?)

Е, це не звучить правильно ...

Мені цікаво почути відповідь і на це!


При використанні debian вам дійсно потрібно дотримуватися структур debian, або пізніші оновлення системи залишать вас зі зламаною системою.
RichieHH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.