Проблема изменения версии Java с использованием альтернатив - PullRequest
14 голосов
/ 23 апреля 2010

Я не совсем уверен, как я попал в этот беспорядок, но по какой-то причине я не могу изменить текущую версию Java, используя альтернативы. Я могу запустить альтернативы --config java и ввести свой выбор, но когда я повторяю номер версии для java или javac, он каждый раз выдает 1.5 (несмотря на то, что в текущей версии 1.6). Между прочим, сервер, с которым я работаю, работает под управлением RHEL5.

Я проверил, что пути, используемые в альтернативах, указывают на правильные каталоги. Вот некоторые результаты моего сеанса:

[brilewis @ myserver] $ sudo / usr / sbin / update-alternatives --config Java

Есть 3 программы, которые обеспечивают 'Ява'.

Команда выбора

** 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
+ 2 /usr/java/jdk1.5.0_10/bin/java
3 /usr/java/jdk1.6.0_16/bin/java

Введите, чтобы сохранить текущий выбор [+] или тип выбора номера: 3

[brilewis @ myserver] $ java -version

Java-версия "1.5.0_10" Java (TM) 2 Runtime Окружающая среда, Standard Edition (сборка 1.5.0_10-b03) Серверная виртуальная машина Java HotSpot (TM) (сборка 1.5.0_10-b03, смешанный режим)

[brilewis @ myserver] $ sudo / usr / sbin / update-alternatives --config java

Есть 3 программы, которые предоставляют 'Java'.

Команда выбора

** 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java
2 /usr/java/jdk1.5.0_10/bin/java
+ 3 /usr/java/jdk1.6.0_16/bin/java

Введите, чтобы сохранить текущий выбор [+], или введите номер выбора:

ОБНОВЛЕНИЕ: ниже выводится echo $PATH:

/ USR / Java / jdk1.5.0_10 / бен: /usr/local/apache-ant-1.7.1/bin: /usr/local/apache-tomcat-6.0.24: / USR / Кербероса / бен: / USR / местные / бен: / бен: / USR / бен: / USR / NX / бен: / Главная / brilewis / бен

ОБНОВЛЕНИЕ (26.04.10): Я последовал совету Берта и удалил JAVA_HOME из переменной окружения PATH в / etc / profile. После этого я смог использовать альтернативы для изменения версии Java. Единственная проблема заключается в том, что когда я пытаюсь запустить javac, я получаю «-bash: javac: команда не найдена». Этого не происходит, когда установлена ​​версия 1.5.

Ответы [ 6 ]

32 голосов
/ 07 февраля 2012

Для Oracle Java 6u30, после того как вы установили их RPM, вы можете настроить альтернативы:

/usr/sbin/alternatives --install "/usr/bin/java" "java" "/usr/java/default/bin/java" 2 \
--slave /usr/bin/javac javac /usr/java/default/bin/javac \
--slave /usr/bin/javadoc javadoc /usr/java/default/bin/javadoc \
--slave /usr/bin/jar jar /usr/java/default/bin/jar \
--slave /usr/bin/keytool keytool /usr/java/default/bin/keytool \
--slave /usr/bin/orbd orbd /usr/java/default/bin/orbd \
--slave /usr/bin/pack200 pack200 /usr/java/default/bin/pack200 \
--slave /usr/bin/rmid rmid /usr/java/default/bin/rmid \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry \
--slave /usr/bin/servertool servertool /usr/java/default/bin/servertool \
--slave /usr/bin/tnameserv tnameserv /usr/java/default/bin/tnameserv \
--slave /usr/bin/unpack200 unpack200 /usr/java/default/bin/unpack200 \
--slave /usr/share/man/man1/java.1.gz java.1.gz /usr/java/default/man/man1/java.1.gz \
--slave /usr/share/man/man1/keytool.1.gz keytool.1.gz /usr/java/default/man/man1/keytool.1.gz \
--slave /usr/share/man/man1/orbd.1.gz orbd.1.gz /usr/java/default/man/man1/orbd.1.gz \
--slave /usr/share/man/man1/pack200.1.gz pack200.1.gz /usr/java/default/man/man1/pack200.1.gz \
--slave /usr/share/man/man1/rmid.1.gz rmid.1.gz /usr/java/default/man/man1/rmid.1.gz \
--slave /usr/share/man/man1/rmiregistry.1.gz rmiregistry.1.gz /usr/java/default/man/man1/rmiregistry.1.gz \
--slave /usr/share/man/man1/servertool.1.gz servertool.1.gz /usr/java/default/man/man1/servertool.1.gz \
--slave /usr/share/man/man1/tnameserv.1.gz tnameserv.1.gz /usr/java/default/man/man1/tnameserv.1.gz \
--slave /usr/share/man/man1/unpack200.1.gz unpack200.1.gz /usr/java/default/man/man1/unpack200.1.gz

Затем активируйте конфигурацию:

/usr/sbin/alternatives --config java

И выберите / usr / java / default / bin / java из меню.

Кроме того, вы должны сжать man-страницы

gzip /usr/java/default/man/man1/*.1

Кроме того, RPM-пакеты Oracle java могли заглушить символическую ссылку альтернативы, поэтому она должна быть нормальной.

ln -sf /etc/alternatives/java /usr/bin/java
6 голосов
/ 29 февраля 2012

Я могу изменить стандартную Java на CentOS, используя следующие шаги:

  1. Добавьте IBM JDK:

    alternatives --install /usr/bin/java java /opt/WebSphere/AppServer/java/bin/java 3
    
  2. Установите новый IBM JDK по умолчанию:

    alternatives --config java   (then select #3 in the list)
    
  3. Введите java -version в приглашении, чтобы увидеть результат.

3 голосов
/ 26 апреля 2010

Единственный способ решить эту проблему - начать сначала, удалив / var / lib / alternatives / java и снова установив каждый JDK. Я сделал то же самое для javac и jar. После этого я смог без проблем переключаться между версиями.

3 голосов
/ 23 апреля 2010

alternatives работает путем изменения символической ссылки в каталоге /usr/bin. Однако, если ваш путь содержит допустимый исполняемый файл ранее в пути, он будет использоваться вместо этого.

В этом случае, судя по вашим предыдущим комментариям, похоже, что /usr/java/jdk1.5.0_10/bin находится где-то в пути и должен быть удален.

Для оболочки BASH путь обычно задается в ~/.bashrc или (менее вероятно?) ~/.bash_profile

1 голос
/ 23 апреля 2010

Обновлено с дополнительными пояснениями

  1. Проверьте, какой java исполняемый файл действительно запущен, например,

    $ type java

    Если это показывает что-то отличное от /usr/bin/java, то, скорее всего, у вас есть определенный код JRE / JDK на вашем пути. Это нормально, но вы не сможете использовать изменение версий Java с использованием альтернатив RH для любой учетной записи, которая таким образом жестко кодирует конкретный JRE / JDK в его PATH. Однако другие пакеты / учетные записи (например, системные процессы), которые не жестко задают конкретную версию JDK в своем пути, будут использовать указанную alternatives JRE.

  2. Проверьте переменную окружения JAVA_HOME, например,

    $ echo $JAVA_HOME

    Если этот параметр установлен, он иногда указывает исполняемому файлу Java на другой JRE / JDK, независимо от того, где находится сам исполняемый файл java. Опять же, нет ничего необычного в том, чтобы установить это, но вы не сможете использовать изменение версий Java с использованием альтернатив RH для любой учетной записи, которая жестко кодирует другой JAVA_HOME.

Все это говорит о том, что для разработки в моей учетной записи я обычно устанавливаю определенный JDK в своем пути и устанавливаю JAVA_HOME, чтобы указывать на конкретный JDK, а не полагаться на системные настройки. Альтернативы RH хороши для контроля того, какую версию Java используют другие пакеты, но для моей собственной разработки я хотел бы явно указать целевой Java, который я хочу использовать.

0 голосов
/ 22 апреля 2015

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

alternatives --install "/usr/bin/java" "java" "/usr/java/example/bin/java" \
 --slave /usr/bin/javac javac /usr/java/example/bin/javac \
 ...

Для этого нужно установить альтернативу для символической ссылки Java. Для каждого ведомого, он также создает / обновляет символическую ссылку на другое значение, указанное в другой альтернативе, когда вы ее переключаете. Так что, если вам нужно было переключиться на другую версию java, используя альтернативы, а в альтернативе указывается ведомый для javac, javac также будет переписываться на новую версию.

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

alternatives --install /usr/bin/java java /usr/java/<version>/bin/java 1500 \
  --slave /usr/bin/ControlPanel ControlPanel /usr/java/<version>/jre/bin/ControlPanel \
   --slave /usr/bin/jar jar /usr/java/<version>/bin/jar \
   --slave /usr/bin/javac javac /usr/java/<version>/bin/javac \
   --slave /usr/bin/javaws javaws /usr/java/<version>/bin/javaws \
   --slave /usr/bin/jcontrol jcontrol /usr/java/<version>/bin/jcontrol \
   --slave /usr/bin/keytool keytool /usr/java/<version>/bin/keytool \
   --slave /usr/bin/orbd orbd /usr/java/<version>/bin/orbd \
   --slave /usr/bin/pack200 pack200 /usr/java/<version>/bin/pack200 \
   --slave /usr/bin/policytool policytool /usr/java/<version>/bin/policytool \
   --slave /usr/bin/rmid rmid /usr/java/<version>/bin/rmid \
   --slave /usr/bin/rmiregistry rmiregistry /usr/java/<version>/bin/rmiregistry \
   --slave /usr/bin/servertool servertool /usr/java/<version>/bin/servertool \
   --slave /usr/bin/tnameserv tnameserv /usr/java/<version>/bin/tnameserv \
   --slave /usr/bin/unpack200 unpack200 /usr/java/<version>/bin/unpack200 \
   --slave /usr/share/man/man1/java.1 java.1 /usr/java/<version>/man/man1/java.1  \ 
   --slave /usr/share/man/man1/javac.1 javac.1 /usr/java/<version>/man/man1/javac.1  \ 
   --slave /usr/share/man/man1/javaws.1 javaws.1 /usr/java/<version>/man/man1/javaws.1  \ 
   --slave /usr/share/man/man1/keytool.1 keytool.1 /usr/java/<version>/man/man1/keytool.1  \ 
   --slave /usr/share/man/man1/orbd.1 orbd.1 /usr/java/<version>/man/man1/orbd.1  \ 
   --slave /usr/share/man/man1/pack200.1 pack200.1 /usr/java/<version>/man/man1/pack200.1  \ 
   --slave /usr/share/man/man1/policytool.1 policytool.1 /usr/java/<version>/man/man1/policytool.1  \ 
   --slave /usr/share/man/man1/rmid.1 rmid.1 /usr/java/<version>/man/man1/rmid.1  \ 
   --slave /usr/share/man/man1/rmiregistry.1 rmiregistry.1 /usr/java/<version>/man/man1/rmiregistry.1  \ 
   --slave /usr/share/man/man1/servertool.1 servertool.1 /usr/java/<version>/man/man1/servertool.1  \ 
   --slave /usr/share/man/man1/tnameserv.1 tnameserv.1 /usr/java/<version>/man/man1/tnameserv.1  \ 
   --slave /usr/share/man/man1/unpack200.1 unpack200.1 /usr/java/<version>/man/man1/unpack200.1

Надеюсь, это поможет.

...