What is the correct target for the JAVA_HOME environment variable for a Linux OpenJDK Debian-based distribution?
В 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.
Если я использую:
JAVA_HOME=/usr
Все приложения и скрипты, которые хотят использовать любой исполняемый файл Java, могут использовать стандартную процедуру
call $JAVA_HOME/bin/executable
, Однако, поскольку банки находятся в другом месте, их не всегда можно найти (пример: в Grails я получаюClassDefNotFound
заnative2ascii
).С другой стороны, если я использую:
JAVA_HOME=/usr/share/java
Ни один из исполняемых файлов Java (
java
,javac
и т. д.) можно найти.
Итак, как правильно обращаться с JAVA_HOME
переменная в Linux на основе Debian?
Спасибо за вашу помощь, Луис
15 ответов
То, что в итоге сработало для меня (теперь Grails работает без сбоев), делает почти так, как сказал Стив Б.
JAVA_HOME=/usr/lib/jvm/default-java
Таким образом, если пользователь изменяет JDK по умолчанию для системы, JAVA_HOME
еще работает.
default-java
символическая ссылка на текущую JVM
Если вы используете альтернативы, вы можете установить JAVA_HOME
основанный на символической Java, как это:
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, если она находится в вашем PATH.
JAVA_HOME=$( j=$( readlink -f $(which java) ) ; echo ${j%%/bin/java} )
У меня обычно нет какой-либо переменной окружения JAVA_HOME. Java может настроить его сам. Внутри java должно быть доступно системное свойство 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
,
В качестве обновления для пользователя fedora, альтернативы устанавливают текущий каталог java в /usr/java/default
поэтому вы должны установить JAVA_HOME в /usr/java/default, чтобы всегда иметь альтернативный выбор в вашем classpath
HTH!
Я всегда стараюсь установить JAVA_HOME в соответствии с /usr/bin/java
.
JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"
Таким образом, обе альтернативы указывают на одно и то же место.
Пожалуйста, посмотрите, что делает команда 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
, Больше информации на:
Моя правильная цель всегда состояла в том, чтобы загрузить это от Sun и просто установить это таким образом. Тогда вы точно знаете, в каком каталоге все идет.
Но если вы предпочитаете придерживаться необычного способа установки Debian, я бы предпочел, чтобы родительский каталог находился чуть выше того места, где находятся двоичные файлы java и javac.
(поскольку, когда вы указываете его в своем пути, это $JAVA_HOME/bin) (Так что в вашем случае это будет... $JAVA_HOME/share и $ JAVA_HOME будет /usr?)
Эх, это не звучит правильно...
Мне тоже интересно услышать ответ на этот вопрос!
Насколько я помню, я использовал скрипт update-java-alternatives вместо update-alternatives. И он правильно установил JAVA_HOME для меня.
Ubuntu 12.04 это работает...
JAVA_HOME = / USR / Библиотека / JVM / Java-6-OpenJDK-i386/ JRE