2009-03-19 5 views
71

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

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

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

+2

Я не могу поверить, что моды не закрыли этот полезный вопрос как «вне темы»! – HDave

ответ

87

Что, наконец, работал для меня (Grails теперь работает гладко) делает почти как Steve B. отмечал:

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

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

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

+5

Кажется, нет такой ссылки на Debian 7 – a1an

+3

На RHEL5.10 это/usr/lib/jvm/java – Brian

+1

Я использовал/usr/lib/jvm/java-7-openjdk-amd64 –

-1

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

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

(так как при указании его в пути это $ JAVA_HOME/BIN) (Так что в вашем случае это будет ... $ JAVA_HOME/акцию и $ JAVA_HOME будет/USR?)

Eh, это звучит не так ...

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

+0

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

0

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

+0

У меня обычно нет. Однако, если я его не настрою, Грайлс жалуется, что JAVA_HOME не существует и прерывается. –

+0

ant нуждается в этом тоже в debian, что является контекстом – RichieHH

6

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

, что опасно рекомендовать решения Ubuntu с Debian. Они могут и могут меняться. – RichieHH

+3

Обратите внимание, что запрашивающий сказал, что он использовал Kubuntu, поэтому решения Ubuntu должны быть в порядке. –

-1

Пожалуйста, посмотрите, что делает команда update-alternatives (у нее хороший человек ...).

Вскоре - что происходит, когда у вас есть java-sun-1.4 и java-opensouce-1.0 ... который берет «java»? Это DEBiAN "/ USR/бен/Java" является символической ссылкой и "/usr/bin/java-sun-1.4" является альтернативой "/ USR/бен/Java"

Edit: Как сказал Ричард, update-alternatives недостаточно. Вам действительно нужно использовать update-java-alternatives. Более подробную информацию по адресу:

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

+0

update-alternatives is not достаточно. Это должно быть update-java-alternatives – RichieHH

+0

@ Рихард: да, отмечено. В первый раз я об этом рассказываю, поэтому я нашел googled и нашел документацию Ubuntu. Благодаря! – elcuco

0

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

0

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

1

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

48

Если вы используете альтернативы, вы можете установить JAVA_HOME на основе слинкован Java, как это:

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

Это работает, за исключением того, что у меня есть «java», а не «javac». –

+3

Это работает для меня: JAVA_HOME = $ (readlink -f/usr/bin/java | sed "s:/jre/bin/java ::") – dpnsan

+3

Блестящее решение, решает мои летние головные боли с помощью JAVA_HOME, который имеет тенденцию указывать в разные места в разных операционных системах. – Datageek

1

Я обнаружил аналогичные проблемы с OpenJDK-6-JRE и OpenJDK-6-JRE-обезглавленных пакетов в 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

Ubuntu 12,04 это работает ...

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

0

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

поэтому вы должны установить JAVA_HOME в/USR/Java/по умолчанию всегда есть альтернативы curent выбора в вашем пути к классам

HTH!