Проблема изменения версии 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
Надеюсь, что это поможет.