Как установить JAVA_HOME в Linux для всех пользователей

185

Я новичок в системе Linux и, похоже, слишком много папок Java.

Java-версия дает мне:

  • Java-версия "1.7.0_55"
  • Среда выполнения OpenJDK (rhel-2.4.7.1.el6_5-x86_64 u55-b13)
  • 64-битная серверная виртуальная машина OpenJDK (сборка 24.51-b03, смешанный режим)

Когда я пытаюсь построить проект Maven, я получаю сообщение об ошибке:

Error: JAVA_HOME is not defined correctly.
We cannot execute /usr/java/jdk1.7.0_05/bin/java

Не могли бы вы сказать, какие файлы мне нужно изменить как для пользователя root, так и для пользователя без полномочий root, и где именно находится Java?

Bosco
источник

Ответы:

354
  1. find /usr/lib/jvm/java-1.x.x-openjdk
  2. vim /etc/profile

    Добавьте predo, если вы вошли в систему как непривилегированный пользователь, т.е. sudo vim

  3. Нажмите «я», чтобы войти в режим вставки
  4. Добавить:

    export JAVA_HOME="path that you found"
    
    export PATH=$JAVA_HOME/bin:$PATH
  5. Выйдите из системы и войдите снова, перезагрузите компьютер или используйте, source /etc/profileчтобы немедленно применить изменения в вашей текущей оболочке
Это Дейв Гай
источник
29
не забудьте удалить двойные кавычки и воссоздать их с клавиатуры, потому что только копирование и вставка могут создать проблемы.
Сунил Кумар
12
@rbaleksandar, от которого зависят некоторые приложения JAVA_HOME, тоже не помешает его настройке.
Раффиан
2
IntelliJ - такое приложение, а не второстепенное.
Пит
12
Вам нужно бежать, source /etc/profileчтобы изменения вступили в силу немедленно!
Мохамед Тахер Alrefaie
1
Это указало мне в правильном направлении. Там на самом деле был несвежий /etc/profile.d/jdk.shплавающий в моей системе.
Германн
109

Для всех пользователей я бы рекомендовал разместить следующую строку в /etc/profile

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

Это будет обновляться динамически и хорошо работает с системой альтернатив . Обратите внимание, что обновление будет происходить только в новой оболочке входа в систему.

Ээро Аалтонен
источник
10
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/bin/java::")вместо этого использовать только простое использование JRE (даже без головы) - обратите внимание, что я использую просто java, а неjavac
Роман Круглов
@occulta По крайней мере Maven ожидает, что JAVA_HOME будет указывать на JDK, и использует его для поиска компилятора java.
Ээро Аалтонен
1
Upvote для readlinkи обновить / обновить совместимое решение, даже это 5-летняя тема. Я только рекомендую не редактировать / etc / profile, а поместить ваш экспорт в пользовательский файл, например /etc/profile.d/java_environment.sh, возможно, вам придется chmod +x java_environment.shперезагрузиться.
ChristophS
Отлично. Лучше, чем мое неуклюжее dirnameрешение. Если вы похожи на меня и хотите понять, что здесь происходит, это простая замена соответствующего текста из ввода на пустую строку. Символом «замены» по умолчанию является символ /, но если вы последовательны, вы можете заменить его на /что угодно. В этом случае это двоеточия, как мы используем /для разделителей пути.
Ungeheuer
35

Вы можете использовать / etc / profile или лучше файл, такой как /etc/profile.d/jdk_home.sh

export JAVA_HOME=/usr/java/jdk1.7.0_05/

Вы должны помнить, что этот файл загружается только с новыми оболочками для входа в систему. То есть после bash -l или нового сеанса gnome, и что он не меняется с новыми версиями Java.

flob
источник
1
по крайней мере в моем linux (raspbian), / etc / profile будет источником, /etc/profile.d/*.shчтобы ваш файл нужно было вызывать, jdk_home.shчтобы он был получен
Hilikus
Спасибо @Hilikus :-) Я изменил его соответственно.
flob
2
Спасибо. я сделал смесь твоего ответа и ответа @ Eero на лучшее из обоих миров;)
Хиликус
1
Это лучший ответ
Джейкоб
/etc/profile.d/jdk_home.shЭто гораздо более чистый ответ, по крайней мере, для Ubuntu , /etc/profileуже с таким количеством логики. Не кажется мудрым, чтобы добавить больше на это ...
Нг Сек Лонг
30

Ни один из других ответов не «прилипал» ко мне в RHEL 7, даже устанавливая JAVA_HOMEи PATHпрямо /etc/profileили ~/.bash_profileне работая. Каждый раз, когда я пытался проверить, JAVA_HOMEбыл ли установлен, он получал пустым:

$ echo $JAVA_HOME
    (<-- no output)

То, что я должен был сделать, это установить скрипт в /etc/profile.d/jdk_home.sh:

#!/bin/sh
export JAVA_HOME=/opt/ibm/java-x86_64-60/
export PATH=$JAVA_HOME/bin:$PATH

Первоначально я пренебрег первой строкой (the #!/bin/sh), и без нее не получится.

Сейчас это работает:

$ echo $JAVA_HOME
/opt/ibm/java-x86_64-60/
Кайл Фалконер
источник
У меня был такой же опыт на RHEL 7. Я удалил экспорт из ~ / .bash_profile и использовал этот подход.
xpagesbeast
#! / bin / sh не требуется в вашем jdk_home.sh.
После того,
12

Очень просто установить путь в Linux. Сделайте следующее:

Шаг-1 Откройте терминал и введите sudo gedit .bashrc

Шаг 2 Он спросит ваш пароль. После ввода пароля откроется файл bash. Затем перейдите к концу и введите ниже

шаг 3

   export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"
   export PATH=$PATH:$JAVA_HOME/bin

Шаг 4 Затем сохраните файл и выйдите из файла.

Выше для одного пользователя. Для всех пользователей, вы должны выполнить следующие шаги

Шаг 1 gedit /etc/profile

Шаг 2 export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/"

Шаг 3 export PATH=$PATH:$JAVA_HOME/bin

Надеюсь это поможет. Спасибо!

PyDevSRS
источник
2
этот ответ устанавливает его только для текущего пользователя.
Мануэль Манхарт
Спасибо @ickyrr
PyDevSRS
7

Делать то, что делает Oracle (как бывший сотрудник Sun, я не могу привыкнуть к этому)

ln -s latestJavaRelease / usr / java / default
Где latestJavaRelease - это версия, которую вы хотите использовать

затем экспортируйте JAVA_HOME = / usr / java / default

Стив С
источник
6

Ответ дан, предыдущие посты действительны. Но ни один ответ не является полным в отношении:

  1. Изменение / etc / profile не рекомендуется просто по причине (как указано в / etc / profile):
  • Не рекомендуется менять этот файл, если вы не знаете, что делаете. Гораздо лучше создать сценарий оболочки custom.sh в /etc/profile.d/ для внесения пользовательских изменений в вашу среду, поскольку это предотвратит необходимость объединения в будущих обновлениях. *
  1. Поэтому, как указано выше, создайте файл /etc/profile.d/custom.sh для пользовательских изменений.

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

#if делает JDK в качестве Java дома

export JAVA_HOME = $ (ссылка для чтения -f / usr / bin / javac | sed "s: / bin / javac ::")

ИЛИ

#if делает JRE, как Java дома

export JAVA_HOME = $ (ссылка для чтения -f / usr / bin / java | sed "s: / bin / java ::")

  1. И не забудьте иметь #! / bin / bash в файле custom.sh
алок айлавади
источник
4

Скопируйте путь к файлу bin, который вы установили

YOUR PATH

откройте терминал и отредактируйте файл окружения, набрав следующую команду,

sudo nano /etc/environment

В этом файле добавьте следующую строку (заменяя YOUR_PATHтолько что скопированный путь):

JAVA_HOME="YOUR_PATH"

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

source /etc/environment

Теперь проверьте это, выполнив:

echo $JAVA_HOME
VirangaMahesh
источник
3
Олни влияет на текущую терминальную сессию
Фатих Тюркер
@ FatihTürker Перезагрузите компьютер
Джек Гиффин
Для меня, использующего jdk11, YOUR_PATH/usr/lib/jvm/default-java/
Джек Гиффин
Путь JAVA_HOME установлен, но он не работает. т.е. Java не работает. Даже после перезагрузки
Ssenyonjo
2

В Linux я добавляю эту строку в мой ~ / .profile:

export JAVA_HOME=$(readlink -ze /usr/bin/javac | xargs -0 dirname -z | xargs -0 dirname)
Эмануэль Оливейра
источник
2
Это кажется потенциально правильным ответом, но не могли бы вы объяснить, почему он работает, то есть что он делает и в чем проблема ОП? Кроме того, вы говорите «в Linux», но есть много разных дистрибутивов Linux, и они могут не работать для всех, пожалуйста, добавьте, для какого дистрибутива это работает.
Буурман
2

Это очень простой скрипт для решения проблемы

export JAVA_HOME_BIN=`which java`
export JAVA_HOME_DIR=`dirname $JAVA_HOME_BIN`
export JAVA_HOME=`dirname $JAVA_HOME_DIR`

И для тестирования:

echo $JAVA_HOME
Дилан Брёйн
источник
2

Шаг 1 - проверьте текущую версию Java по "echo $ JAVA_HOME"

Шаг 2 - vim / etc / profile

Шаг 3 - В конце файла вы найдете экспорт JAVA_HOME, нам нужно указать новый путь, убедиться, что он не относительный.

Шаг 4 - Сохранить и выйти: wq

Шаг 5 - «источник / etc / profile /», это выполнит изменение

Шаг 6 - Снова сделайте эхо $ JAVA_HOME - изменение будет отражено.

свапнил шашанк
источник
2

1 ... Использование комбинации клавиш Ctlr+ Alt+ Tдля открытия терминала

2 ... Выполните следующую команду:

echo export JAVA_HOME='$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")' | sudo tee /etc/profile.d/jdk_home.sh > /dev/null

3 ... (рекомендуется) Перезагрузите виртуальную машину / компьютер. Вы можете использовать, source /etc/sourceесли не хотите перезагрузить компьютер

4 ... Использование комбинации клавиш Ctlr+ Alt+ Tдля открытия терминала

5 ... Проверенный взнос JAVA_HOME с

echo $JAVA_HOME

Однострочная копия с flob , кредит им

Нг Сек Лонг
источник
2
export "JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")" | tee -a /etc/profile && source /etc/profile && echo $JAVA_HOME
Дашрат Мундкар
источник
1

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

либо: источник / и т.д. / или. /и т.д/

Где тот профиль, который вы редактировали.

Брайант Бернштейн
источник
1

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

1) Легко обновить JDK, не влияя на запуск приложения и файл конфигурации, который указывает на JAVA_HOME. вам просто нужно скачать новую версию и убедиться, что ваш JAVA_HOME указывает на новую версию Java. Это лучшее преимущество использования переменных окружения или ссылок.

2) Переменная JAVA_HOME является краткой и краткой вместо полного пути к каталогу установки JDK.

3) Переменная JAVA_HOME не зависит от платформы, т. Е. Если ваш загрузочный скрипт использует JAVA_HOME, то он может работать в Windows и UNIX без каких-либо изменений, вам просто нужно установить JAVA_HOME в соответствующей операционной системе.

Читать подробнее: http://javarevisited.blogspot.com/2012/02/how-to-set-javahome-environment-in.html#ixzz4BWmaYIjH

гость
источник
1

Публикация в качестве ответа, поскольку я не имею права комментировать.

Обратите внимание : следуйте принятому ответу, опубликованному "That Dave Guy".

После установки переменных убедитесь, что вы установили соответствующие разрешения для каталога java, где он установлен.

chmod -R 755 /usr/java
Ван Пир
источник
1

Все операционные шаги (поиск java, родительский каталог, редактирование файла, ...) одно решение

zFileProfile="/etc/profile"
zJavaHomePath=$(readlink -ze $(which java) | xargs -0 dirname | xargs -0 dirname)
echo $zJavaHomePath

echo "export JAVA_HOME=\"${zJavaHomePath}\"" >> $zFileProfile
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> $zFileProfile

Результат:

# tail -2 $zFileProfile
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64"
export PATH=$PATH:$JAVA_HOME/bin

Объяснение:

1) Давайте разберем всю команду на части

$(readlink -ze $(which java) | xargs -0 dirname | xargs -0 dirname)

2) Найти путь Java из команды Java

# $(which java)
"/usr/bin/java"

3) Получить относительный путь из символического пути

# readlink -ze /usr/bin/java
"/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/java"

4) Получить родительский путь /usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/java

# readlink -ze /usr/bin/java | xargs -0 dirname
"/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin"

5) Получить родительский путь /usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64/bin/

# readlink -ze /usr/bin/java | xargs -0 dirname | xargs -0 dirname
"/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64"
Ahmet
источник
1

В / etc / profile, если вы откроете его, вы узнаете, что НЕ рекомендуется писать в этот файл. Вместо этого создайте скрипт из ваших команд (предположим, test.sh), перейдите в папку /etc/profile.d и поместите туда test.sh. Каждый раз, когда вы перезагружаете экземпляр, он будет автоматически вызываться / etc / profile.

Ноха
источник
0

Используйте SDKMAN sdkman.io для переключения между прочим. твой SDK.

Он устанавливает JAVA_HOME для вас.

Стефан Хельткер
источник
0

откройте kafka-run-class.sh с помощью sudo, чтобы написать

Вы можете найти файл kafka-run-class.sh в своей папке kafka : kafka / bin / kafka-run-class.sh

проверьте эти строки

введите описание изображения здесь

Измените переменную JAVA в части else, чтобы она указала на исполняемый файл java в вашем java / bin. как JAVA = "$ JAVA_HOME / java"

Ашиш Верма
источник
-1

Я использую строку:

export JAVA_HOME=$(readlink -f $(dirname $(readlink -f $(which java) ))/../)

в мой ~ / .profile, поэтому он использует базу java-каталога по умолчанию во время входа в систему. Это для Баш.

darkhipo
источник