Какова правильная цель для переменной среды JAVA_HOME для дистрибутива Linux на основе OpenJDK на основе Debian? - PullRequest
80 голосов
/ 19 марта 2009

В 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?

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

Ответы [ 13 ]

89 голосов
/ 19 марта 2009

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

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

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

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

61 голосов
/ 18 июля 2012

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

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
5 голосов
/ 19 марта 2009

Стандартная установка Ubuntu помещает различные версии Java в /usr/lib/jvm. javac, java, который вы найдете на своем пути, будет мягкой ссылкой на это.

Нет проблем с установкой собственной версии Java в любое удобное для вас место, если вы установите переменную среды JAVA_HOME и убедитесь, что на вашем пути установлена ​​новая Java bin.

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

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

/opt/jdk --> /opt/jdk1.6.011
0 голосов
/ 07 сентября 2015

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

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

HTH!

0 голосов
/ 07 марта 2013

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

JAVA_HOME = / USR / Библиотека / JVM / Java-6-OpenJDK-i386 / JRE

0 голосов
/ 16 января 2013

Я обнаружил похожие проблемы с пакетами 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 голосов
/ 12 июня 2012

Обновленный ответ, который решит вашу проблему, а также общие рекомендации по установке Oracle Java 7 в Ubuntu можно найти здесь: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

0 голосов
/ 14 марта 2011

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

0 голосов
/ 20 марта 2009

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

0 голосов
/ 19 марта 2009

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

...