Найдите JAVA_HOME и установите его на RHEL

Я установил java некоторое время на моей машине RHEL. Теперь я пытаюсь запустить программу, для которой требуется установить переменную JAVA_HOME. Каков наилучший способ выяснить каталог установки моей установки java, а затем установить JAVA_HOME? Ниже приведены результаты запуска java-версии:

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

У меня есть каталог /usr/lib/jvm, но он пуст.

Ответ 1

Сначала попробуйте echo $JAVA_HOME из командной строки. Поскольку java уже на вашем пути, JAVA_HOME может быть установлен.

Каков наилучший способ выяснить каталог установки моей установки java.

Запуск команды which java указывает вам, где установлен java.

а затем установите JAVA_HOME

Вы можете редактировать ~/.bashrc, ~/.bash_profile или /etc/profile для установки JAVA_HOME. Установка его в ~/etc/profile будет устанавливать его в системном масштабе, и это, вероятно, не то, что вы хотите. Скажем, для примера, вывод which java равен /opt/jdk_1.7.0_25, тогда вы просто добавляете export JAVA_HOME=/opt/jdk_1.7.0_25 в ~/.bashrc или ~/.bash_profile, а затем запустите source ~/.bashrc (или source ~/.bash_profile, если вы установите его там).

Обратите внимание, что в этом случае java находится на PATH, но в некоторых случаях вам нужно добавить export PATH=$PATH:$JAVA_HOME/bin, чтобы добавить переменную JAVA_HOME в PATH.

Ответ 2

RHEL использует подсистему альтернатив для управления установками Java. Вы можете иметь несколько версий java установлены, но только один из них активен одновременно.

Это означает, что запуск which java не предоставляет полезной информации. выход будет таким же, независимо от того, какая установка java выбрана через альтернативы. Выполнение readlink -f $(which java) (как уже было предложено в другой комментарий) или использование альтернатив alternatives --display java быть лучше.

См. пример с машины RHEL 6 с установленным OpenJDK (который поставляется с RHEL):

[[email protected] ~]# which java
/usr/bin/java
[[email protected] ~]# readlink -f $(which java)
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64/jre/bin/java
[[email protected] ~]# alternatives --display java | head -2
java - status is manual.
 link currently points to /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

Обратите внимание, что переменная среды JAVA_HOME по умолчанию не определена, вам нужно будет определить его самостоятельно в .bashrc пользователя, который этого требует.

В предыдущем примере правильное значение JAVA_HOME было бы /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64.

Подробнее см. Установить OpenJDK документация, поиск раздела "Необязательно: установите переменную среды JAVA_HOME".

Ответ 3

readlink команда покажет вам полный путь к символической ссылке:

readlink -f `which java`

Ответ 4

Лучшее, что вы можете сделать, это полностью исключить java-версию Red Hat.

Получите Java из Oracle и поместите его в /opt. Затем просто создайте symlink/opt/java → /opt/jdk-someversion и создайте файл /etc/profile.d/java.sh, содержащий

#!/bin/sh
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH

Затем, чтобы изменить общесистемную java, просто измените символическую ссылку в opt. Чтобы использовать несколько java-версий, используйте сценарии, подобные приведенным выше, с соответствующим JAVA_HOME.

Кроме того, /sbin/service script, используемые для запуска скриптов /etc/init.d, будут сбрасывать переменные среды - явно выполняет env -i. Так что ваш tomcat не получит JAVA_HOME, вам нужно будет создать setenv.sh в $CATALINA_BASE/bin.

Недостатком этого подхода является то, что вы не получаете обновления Java от Red Hat.

Ответ 5

Я нашел способ объединить вышеперечисленное, чтобы программно установить JAVA_HOME.

export JAVA_HOME=$(dirname $(readlink -f $(which java))|sed 's^jre/bin^^')

В Ubuntu возвращает /usr/lib/jvm/java-8-openjdk-amd64/. В CentOS7 возвращает /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64/.

Это можно добавить в Makefile с помощью

JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')

Это гораздо безопаснее, чем экспортировать жестко закодированный путь, и более переносимо.

Ответ 6

По крайней мере, на RHEL 7, alternatives устанавливает подчиненное соединение для java_sdk по адресу:

/etc/alternatives/java_sdk/

Это символическая ссылка на корень установки SDK.