Tomcat не распознает JAVA_HOME

15

Я установил Ubuntu 14.04 Server, извлек JDK1.8u5 и Tomcat7 и добавил следующее в .profile (я также попытался добавить его в .bashrc с похожими [не-] результатами):

export JAVA_HOME=/opt/java/jdk1.8.0_05
export PATH=$PATH:$JAVA_HOME/bin

когда я бегу, echo $JAVA_HOMEя получаю ожидаемый результат /opt/java/jdk1.8.0_05. Я также могу запустить java -versionи получить правильный ответ от Java. Все идет нормально.

так что теперь я пытаюсь запустить Tomcat (пробовал также catalina.sh), и я получаю следующее:

user@ubuntu:~$ sudo /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

но ... я только попробовал, echo $JAVA_HOMEи это сработало?

isapir
источник

Ответы:

23

В справке есть текст catalina.sh. Я процитирую это здесь:

#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.

#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#                   Required to run the with the "debug" argument.

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

При запуске с tomcatпомощью catalina.sh, он ищет файл setenv.shи поиск его. Это поиск в CATALINA_HOMEили CATALINA_BASE.

Таким образом , лучший способ набора JAVA_HOMEдля tomcatэто:

  1. Создайте сценарий с именем setenv.shв папке CATALINA_BASE/bin, если он еще не существует.
  2. Добавить эту строку в setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
  3. Сделайте это исполняемым.


Почему вы должны использовать это решение:

Установка переменной среды в скрипте безопаснее. Всегда старайтесь устанавливать переменные как можно локально. Попробуйте не использовать /etc/environment, /etc/profileа другие , если вы действительно не нужно Global Environment Variable. Установка JAVA_HOMEв setenv.shдает возможность использовать различные с различными котов приложений , которым требуется другая версия java, но работает один пользователь. Другие пользовательские среды не будут затронуты вами.

c0rp
источник
4

Поскольку вы установили переменную окружения для своего собственного пользователя, а не для суперпользователя, у вас есть два варианта:

  1. Вам нужно будет экспортировать переменную, используя -Eопцию следующим образом:

    sudo -E /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh

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

  2. Экспортируйте переменную в корневой.bashrc /etc/enviroment файл. Откройте терминал и введите:

    sudo nano /etc/environment

    и введите свой административный пароль, и добавьте следующие строки в конец файла:

    JAVA_HOME=/opt/java/jdk1.8.0_05
    PATH=$PATH:$JAVA_HOME/bin

    а потом

    source /etc/environment

    или перезагрузите компьютер, а затем повторите команду, которую вы использовали.


Обновить:

В этом ответе указывается, что два шага 2 не будут работать, sudoбудут сбрасывать среду и обеспечивать безопасный путь, поэтому все глобальные переменные будут сброшены. Обходной путь будет использовать

sudo su

и затем выполните команду, которая использует заданные переменные среды.

Jobin
источник
1
Спасибо @Jobin - вариант 1 работает, поэтому я проголосовал за ваш ответ. Сейчас я проверю вариант 2, который является моим предпочтительным решением, и если он сработает, я приму ваш ответ.
Исапир
Я добавил команды с /root/.bashrcпомощью nano, как вы предложили, но вызывал user@ubuntu:~$ source /root/.bashrcрезультаты -bash: /root/.bashrc: Permission deniedи пробовал с помощью sudo sudo: source: command not found.
повторная попытка
@Igal: Отредактировал мой ответ, чтобы решить эту проблему, вы должны сначала использовать sudo -iперед вами source. Спасибо что подметил это.
Jobin
хорошо, простите за вопросы новичка, но как я могу выйти из того, что я sudo -iназвал источником? без выхода я получаю оригинальное сообщение об ошибке ...
isapir
@Igal: просто нажмите Ctrl + d или введите exit.
Jobin
0

Решение, которое я искал, заключается в том, /etc/environmentчто, как указано в EnvironmentVariables , не обрабатывает сценарии и не раскрывает переменные, поэтому добавление следующего ( без экспорта) принесло свои плоды:

JAVA_HOME=/opt/java/jdk1.8.0_05

Затем я перезагрузил систему, чтобы изменения вступили в силу.

isapir
источник
0

Я добавил JAVA_HOME в tomcat7.serviceскрипт, так как setenv.shне был полученcatalina.sh

шаги:

1. Откройте файл сценария обслуживания tomcat7.

sudo gedit /etc/init.d/tomcat7

2.Установите JAVA_HOME

.
.
.
JAVA_HOME=/usr/lib/jvm/java-8-oracle

# Directory where the Tomcat 6 binary distribution resides
CATALINA_HOME=/usr/share/$NAME

# Directory for per-instance configuration files and webapps
CATALINA_BASE=/var/lib/$NAME

# Use the Java security manager? (yes/no)
TOMCAT7_SECURITY=no

3. Запустите сервис Tomcat7

sudo service tomcat7 status

CᴴᴀZ
источник