Какова правильная цель для переменной среды JAVA_HOME для дистрибутива Linux OpenJDK на основе Debian?

91

В Windows JAVA_HOMEдолжен указывать на папку установки JDK (чтобы она JAVA_HOME/binсодержала все исполняемые файлы и JAVA_HOME/libsвсе jarбиблиотеки по умолчанию ).

Если я загружу пакет Sun JDK и установлю его в Linux, это будет та же процедура.

Однако мне нужно использовать пакет Kubuntu по умолчанию OpenJDK. Проблема в том, что все исполняемые файлы помещаются в /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?

Спасибо за помощь, Луис

Луис Соейро
источник

Ответы:

98

То, что в итоге сработало для меня (теперь Grails работает плавно), работает почти так, как указал Стив Б.:

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

Таким образом, если пользователь изменяет JDK по умолчанию для системы, он JAVA_HOMEвсе еще работает.

default-java является символической ссылкой на текущую JVM.

Луис Соейро
источник
6
Похоже, в Debian 7 такой ссылки нет
a1an 09
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 (путем запуска источника / etc / profile) JAVA_HOME был заполнен, как ожидалось.
darnold0714,
80

Если вы используете альтернативы для управления несколькими версиями java, вы можете установить их на JAVA_HOMEоснове символьной java (или javac) следующим образом:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
bbaassssiiee
источник
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
7

Стандартная установка 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 05
4
Обратите внимание, что отправитель запроса сказал, что он использовал Kubuntu, поэтому решения Ubuntu должны подойти.
Джозеф Холстен,
0

Обычно у меня нет переменной окружения JAVA_HOME. Java может установить это сама. Внутри java должно быть доступно системное свойство java.home.

iny
источник
У меня его тоже обычно нет. Однако, если я его не настрою, grails сообщит, что JAVA_HOME отсутствует, и завершится.
Луис Соейро,
1
ant тоже нуждается в этом в debian, который является контекстом
RichieHH 05
0

Попробуйте также установить переменную JAVA_LIB.

Кантильон
источник
0

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

MVang
источник
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.

Сатурн Junction
источник
0

Ubuntu 12.04 это работает ...

JAVA_HOME = / usr / lib / jvm / java-6-openjdk-i386 / jre

Alex
источник
0

В качестве обновления для пользователя Fedora альтернативы устанавливают текущий каталог java на / usr / java / default.

поэтому вы должны установить свой JAVA_HOME в / usr / java / default, чтобы всегда иметь альтернативный текущий выбор в вашем пути к классам

HTH!

Грег Генри
источник
0

Я всегда стараюсь установить JAVA_HOME в соответствии с /usr/bin/java.

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

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

Иво
источник
-1

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

Тобиас Шульте
источник
Этого нет в Ubuntu 20.4
Мартин Шредер,
-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

Elcuco
источник
update-альтернатив мало. Это должны быть альтернативы update-java
RichieHH
@Richard: да, заметил. В первый раз я об этом подумал, поэтому я погуглил и нашел документацию Ubuntu. Благодарность!
elcuco
-2

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

Но если вы предпочитаете придерживаться необычного способа установки Debian, лучше всего предположить, что это родительский каталог, расположенный чуть выше того места, где расположены двоичные файлы java и javac.

(поскольку, когда вы указываете его в своем пути, это $ JAVA_HOME / bin) (Так что в вашем случае это будет ... $ JAVA_HOME / share, а $ JAVA_HOME будет / usr?)

Эх, звучит не так ...

Мне тоже интересно услышать ответ на это!

leeand00
источник
При использовании debian вам действительно нужно придерживаться структур debian, иначе более поздние обновления системы приведут к поломке системы.
RichieHH 05