Проблема изменения версии Java с использованием альтернатив

Я не совсем уверен, как я попал в этот беспорядок, но по какой-то причине я не могу изменить текущую версию 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 version "1.5.0_10" Java (TM) 2 Runtime Окружающая среда, стандартная версия (сборка 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

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

UPDATE: Ниже представлен вывод echo $PATH:

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

UPDATE (4/26/10): Я последовал за предложением Берта и удалил JAVA_HOME из среды PATH var в /etc/profile. После этого я смог использовать альтернативы для изменения версии Java. Единственная проблема в том, что когда я пытаюсь запустить javac, я получаю "- bash: javac: command not found". Этого не происходит, если для версии установлено значение 1.5.

Ответы

Ответ 1

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

Ответ 2

Для 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 в меню.

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

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

Кроме того, RPM Oracle java могли бы скрыть ваши альтернативные символические ссылки, чтобы заставить их быть нормальными.

ln -sf /etc/alternatives/java /usr/bin/java

Ответ 3

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

  • Добавьте IBM JDK:

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

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

Ответ 4

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

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

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

Ответ 5

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

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

    $ type java

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

  • Проверьте переменную среды JAVA_HOME, например.

    $ echo $JAVA_HOME

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

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

Ответ 6

При использовании альтернативного метода, если вы хотите использовать альтернативу, он должен быть сначала установлен. Я считаю, что 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

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