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

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

Если я загружаю пакет Sun 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 на базе Debian?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Стандартная установка 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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Я обнаружил аналогичные проблемы с пакетами 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.

Ответ 10

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

JAVA_HOME =/USR/Library/JVM/Java-6-OpenJDK-i386/JRE

Ответ 11

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

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

HTH!

Ответ 12

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

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

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

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

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

Ответ 13

Посмотрите, что делает команда 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