Сделать $ JAVA_HOME легко изменяемым в Ubuntu

В Ubuntu я хотел бы переключать переменную среды JAVA_HOME туда и обратно между Java 5 и 6.

Я открываю терминал и ввожу следующее, чтобы установить переменную окружения JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

И в том же окне терминала я набираю следующее, чтобы убедиться, что переменная среды была обновлена:

echo $JAVA_HOME

И я вижу /usr/lib/jvm/java-1.5.0-sun, что я и ожидал увидеть. Кроме того, я изменяю ~/.profile и устанавливаю для переменной среды JAVA_HOME значение /usr/lib/jvm/java-1.5.0-sun.

А теперь о проблеме: когда я открываю новое окно терминала и проверяю свою переменную среды JAVA_HOME, введя echo $JAVA_HOME, я вижу, что моя переменная среды JAVA_HOME была возвращена обратно к Java 6. Когда Я перезагружаю свою машину (или выхожу из системы и снова захожу, я полагаю), для переменной среды JAVA_HOME установлено значение Java 5 (предположительно из-за модификации, которую я сделал в своем ~/.profile).

Есть ли способ обойти это, чтобы я мог изменить свою среду JAVA_HOME без необходимости выхода из системы и обратно (И сделать эту переменную среды прикрепленной во всех новых окнах терминала)?


person Junho Park    schedule 16.04.2010    source источник
comment
Какой правильный сайт и дублирующий ответ?   -  person Martin Konicek    schedule 03.09.2012
comment
Файл ~/.profile читается только при входе в Ubuntu, поэтому, если вы выходите из системы или входите в систему, JAVA_HOME устанавливается для всех терминалов и любых других приложений, которые вы запускаете. Если вы установите JAVA_HOME в ~/.bashrc, он будет виден только приложениям, запускаемым из терминала.   -  person jr0cket    schedule 21.01.2015


Ответы (8)


Поместите переменные среды в глобальный файл /etc/environment:

...
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
...

Выполните «source /etc/environment» в каждой оболочке, где вы хотите обновить переменные:

$ source /etc/environment

Убедитесь, что это работает:

$ echo $JAVA_HOME
$ /usr/lib/jvm/java-1.5.0-sun

Отлично, выход не нужен.

Если вы хотите установить переменную среды JAVA_HOME только в терминале, установите ее в файле ~/.bashrc.

person Martin Konicek    schedule 13.05.2011
comment
Чтобы эти изменения повлияли на приложения, запускаемые через пользовательский интерфейс Ubuntu, по-прежнему требуется перезагрузка (т. е. двойной щелчок приложения). - person Eric Hu; 12.02.2013
comment
Чем это отличается от простой установки переменной в каждой чертовой оболочке? - person mlissner; 22.08.2013
comment
@mlissner Да, вам нужно запустить команду в каждой оболочке, но значение также постоянно остается в файле /etc/environment. Если просто установить переменную в каждой оболочке, она снова будет потеряна после перезапуска. - person Martin Konicek; 23.08.2013
comment
другой способ не запускать это вручную каждый раз - изменить файл .bashrc, чтобы включить источник команды /etc/environment - person nityan; 08.01.2014
comment
это не сработало для меня, пока я не export JAVA_HOME; - person psychok7; 30.04.2014
comment
Как установить envvar в /etc/environment через командную строку, например setx в Windows? - person Neil McGuigan; 24.07.2014
comment
Этот вопрос суперпользователя предполагает, что для того, чтобы это вступило в силу для всех пользователей, необходим выход из системы/вход в систему: superuser.com/questions/339617/ - person Greg K; 03.12.2014
comment
@MartinKonicek, ваш пример неверен. в этой строке не должно быть «экспорта». /etc/environment содержит пары ключ-значение - person pdeva; 21.03.2015
comment
@psychok7 см. мой последний комментарий - person pdeva; 21.03.2015
comment
имейте в виду, что /etc/environment является особым и не допускает подстановки переменных, например. JRE_HOME=${JAVA_HOME}/jre не работает. - person Abdull; 27.11.2015
comment
@MartinKonicek Я не понимаю причины этого. Файлы конфигурации не выполняются из того, что указано в FHS. - person Abhishek Bhatia; 02.02.2016

Вероятно, это решит вашу проблему: https://help.ubuntu.com/community/EnvironmentVariables

Переменные среды для всего сеанса

Чтобы установить переменные среды таким образом, чтобы это повлияло на среду конкретного пользователя, не следует помещать команды для установки их значений в определенные файлы сценариев оболочки в домашнем каталоге пользователя, а использовать:

~/.pam_environment — этот файл специально предназначен для настройки среды пользователя. Это не файл сценария, а скорее состоит из выражений присваивания, по одному в строке.

Не рекомендуется:

~/.profile — это, вероятно, лучший файл для размещения назначений переменных среды, поскольку он автоматически выполняется DisplayManager во время сеанса рабочего стола процесса запуска, а также оболочкой входа в систему при входе в систему с текстовой консоли.

person Holger Frohloff    schedule 16.04.2010
comment
Из предоставленной вами ссылки: приведенное ниже не рекомендуется, но предыдущее решение (?), представленное на этой странице, не работало с настольной версией 10.04. .pam_environment естественным образом не обрабатывается вместе с дистрибутивом. - person Calmarius; 05.10.2011
comment
~/.pam_environment — отличный способ заблокировать ваш логин, если вы предполагаете, что он обрабатывает переменные. Я попытался установить PATH в ${PATH}:${HOME}/bin, но не удалось оценить переменные. Чистый результат: невозможно войти в систему :( Исправлено путем посещения Ctrl-Alt-1 и запуска /bin/rm ~/.pam_environment. Будьте исключительно осторожны или используйте дополнительную учетную запись для проверки настроек здесь. - person Alain O'Dea; 04.04.2012
comment
Лично я не знаю, почему они удосужились создать файл среды, а затем заставили его работать совершенно иначе, чем любой другой механизм установки переменных среды, когда-либо работавший раньше. Простые пары ключ-значение, подобные используемым в файле среды, — это просто BS. Есть причина, по которой мы используем переменные и ссылки в среде, и она до сих пор актуальна. Это упрощает администрирование. Кем бы ни были эти придурки, решившие, что способ работы с PAM в этом файле был лучшим, в лучшем случае идиоты. Переменные НЕОБХОДИМО интерпретировать. - person Bill Rosmus; 26.07.2012
comment
@AlainO'Dea: у меня была точно такая же проблема. Шокирован и взволнован, когда я не мог пройти мимо экрана входа в систему. После некоторого поиска я обнаружил, что вы можете использовать переменные, но должны использовать другой синтаксис. например. PATH DEFAULT=${PATH}:${HOME}/bin Когда не используется переменная, кажется, что работает простое присваивание. - person tim_wonil; 27.07.2012
comment
Да, я согласен с @AlainO'Dea. Если в вашем скрипте есть какая-либо ошибка, вы не сможете войти в систему. Заботиться. - person Evan Hu; 11.02.2015

Попробуйте эти шаги.

--Мы собираемся отредактировать "etc\profile". Переменные среды должны быть введены в нижней части файла. Поскольку Ubuntu не дает доступа к корневой папке, нам придется использовать несколько команд в терминале.

Шаг 1: Запустите терминал. Введите команду: gksudo gedit /etc/profile

Шаг 2: Откроется текстовый файл профиля. Введите переменные среды внизу страницы........... Например: export JAVA_HOME=/home/alex/jdk1.6.0_22/bin/java

export PATH=/home/alex/jdk1.6.0_22/bin:$PATH

Шаг 3: сохраните и закройте файл. Проверьте, установлены ли переменные среды с помощью команды echo........ Например echo $PATH

person Alex    schedule 07.11.2010

Вам нужно поместить определение переменной в файл ~/.bashrc.

Со страницы руководства bash:

Когда запускается интерактивная оболочка, не являющаяся оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrc и ~/.bashrc, если эти файлы существуют.

person Paweł Nadolski    schedule 07.11.2010

Традиционно, если вы хотите изменить переменную только в окнах терминала, установите ее в файле .bashrc, который загружается каждый раз при открытии нового терминала. .profile не загружается каждый раз, когда вы открываете новый терминал.

Посмотрите разницу между .profile и .bashrc в вопросе: разница между .bashrc, .bash_profile и .environment?

.bashrc должен решить вашу проблему. Однако это не правильное решение, поскольку вы используете Ubuntu. См. соответствующую страницу справки Ubuntu "Переменные среды для всего сеанса". Таким образом, неудивительно, что .profile у вас не работает. Я использую Ubuntu 12.04 и xfce. Я настроил свой .profile, и он просто не вступает в силу, даже если я выхожу из системы и снова вхожу в нее. Подобный опыт здесь. Поэтому вам, возможно, придется использовать файл .pam_environment и полностью забыть о .profile и .bashrc. И ЗАМЕТЬТЕ, что .pam_environment не является файлом сценария.

person HongboZhu    schedule 26.02.2013

Взгляните на bash(1), вам нужна оболочка для входа подобрать вариант ~/.profile, т.е. вариант -l.

person Nikolai Fetissov    schedule 16.04.2010

Я знаю, что это долгий холодный вопрос, но он возникает каждый раз, когда выходит новый или недавний крупный выпуск Java. Теперь это легко применимо к обмену 6 и 7.

Я делал это в прошлом с update-java-alternatives: http://manpages.ubuntu.com/manpages/hardy/man8/update-java-alternatives.8.html

person Alain O'Dea    schedule 04.04.2012

После внесения изменений в .profile вам необходимо выполнить файл, чтобы изменения вступили в силу.

root@masternode# . ~/.profile

Как только это будет сделано, команда echo будет работать.

person Community    schedule 18.03.2013
comment
Вы должны использовать ~/.profile, а не ./.profile. - person Alexis Wilke; 25.02.2014