Я использую Pangolin (12.04 LTS) и хочу разобраться с некоторыми вещами на Java, где моя JVM указывает на другое место моего компилятора.
Для демонстрации моя JVM выглядит следующим образом:
pcrow@pcrow-HP-notebook:~/Documents$ java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.4)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
В то время как мой компилятор указывает здесь:
pcrow@pcrow-HP-notebook:~/Documents$ javac -version
javac 1.7.0_51
Я настроил последний, добавив запись в мой ~/.profile
файл. Дело в том, что я не уверен, что задает первые, и я хочу, чтобы они были последовательными. В / etc / environment у меня есть следующая запись:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
И когда я запускаю printenv | grep "java"
PATH=/usr/share/maven/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-7-openjdk-amd64/bin
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
Можете ли вы сказать мне, где IcedTea6 скорее всего настроен на Ubuntu? Я хотел бы переопределить его, если смогу, и убедиться, что моя JVM и компилятор используют одну и ту же версию.
Начиная с вашего последнего абзаца
Можете ли вы сказать мне, где IcedTea6 наиболее вероятно установлен в Ubuntu? Я хотел бы переопределить его, если смогу, и убедиться, что моя JVM и компилятор используют одну и ту же версию.
Ubuntu предоставляет хороший инструмент для выбора одного JDK / JRE из нескольких установок. Это update-java-alternatives
. Он тесно связан с инструментом update-alternatives
.
Каждый JDK / JRE включает в себя набор инструментов Java, таких как javac
, java
, javaws
, jinfo
, javah
и т. Д. Установка может идти со скрытым файлом .jinfo
, где находятся эти компоненты Java. перечислены. В моей системе, когда я устанавливаю пакет openjdk-8-jdk
, создается файл /usr/lib/jvm/.java-1.8.0-openjdk-amd64.jinfo
. Содержимое этого файла (пропущено несколько строк)
name=java-8-openjdk-amd64
alias=java-1.8.0-openjdk-amd64
priority=1081
section=main
hl rmid /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmid
hl java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
hl keytool /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/keytool
hl jjs /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/jjs
hl pack200 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/pack200
hl rmiregistry /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/rmiregistry
.
.
. (skipped lines)
.
.
jdkhl jdb /usr/lib/jvm/java-8-openjdk-amd64/bin/jdb
jdkhl serialver /usr/lib/jvm/java-8-openjdk-amd64/bin/serialver
jdkhl wsgen /usr/lib/jvm/java-8-openjdk-amd64/bin/wsgen
jdkhl jcmd /usr/lib/jvm/java-8-openjdk-amd64/bin/jcmd
jdk appletviewer /usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer
jdk jconsole /usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole
plugin mozilla-javaplugin.so /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so
update-java-alternatives
использует этот файл для создания альтернативных ссылок в каталоге /etc/alternatives
. Цель этого каталога - предоставить механизм, с помощью которого вы можете выбрать программу по умолчанию из набора похожих инструментов. Это отлично подходит для нескольких версий JDK (см. Больше в update-alternatives
)
update-alternatives
Для краткой демонстрации процесса. Когда программа впервые устанавливается, она регистрирует свои альтернативы для имени мастера (например, javac
) в базе данных альтернатив (это содержится в каталоге /var/lib/dpkg/alternatives
). В процессе установки update-alternatives
создает главную ссылку в /usr/bin/javac
, указывающую на /etc/alternatives/javac
, которая также является символической ссылкой, указывающей на фактический файл из JDK.
Теперь, когда вы устанавливаете другой JDK, у него тоже будет javac
программа. Таким образом, при установке второго JDK update-alternatives
автоматически обновляется символическая ссылка /etc/alternatives/javac
, чтобы она указывала на ссылку с наивысшим приоритетом. Он также обновляет базу данных альтернатив, так что вы можете вручную выбрать значение по умолчанию, вызвав его.
update-java-alternatives
, , update-java-alternatives
использует update-alternatives
, чтобы предоставить полный набор значений по умолчанию из одной установки JDK / JRE. Идея заключается в том, что вы выберете установку JDK / JRE, и все инструменты из этого JRE / JDK будут использоваться по умолчанию для предоставления нескольких инструментов Java, избавляя вас от использования update-alternatives
для каждого инструмента. Таким образом, когда вы используете update-java-alternatives
для выбора JDK, например, openjdk-8-jdk
, он делает java-инструменты этого JDK (такие как javac
, java
, javaws
и т. Д.) По умолчанию. При условии, что JDK установлен правильно и он перечисляет свои инструменты в файле .jinfo
.
Итак, чтобы вкратце ответить на ваш запрос, подключаемый модуль IcedTea6 настроен в файле .jinfo
, и update-java-alternatives
использует этот файл для обновления ссылок, указывающих на него. Итак, вам нужно создать файл для вашего JDK, в котором перечислены плагин и все инструменты Java, и использовать update-java-alternatives
.
Если вы установили JDK / JRE вручную, проверьте этот вопрос, чтобы получить помощь в его распознавании инструментом update-java-alternatives
.
Кажется, это update-java-alternatives
больше не обновляет компоненты JDK в последнее время. Это только обновление инструментов JRE. Есть много жалоб, говорящих, что использование этого инструмента не обновляет все компоненты Java. После того, как я столкнулся с той же проблемой и потратил почти 5 часов, думаю, я нашел решение. Решение просто заменяет hl
на jre
и jdkhl
на jdk
в файле .jinfo
. Я нашел старый файл .jinfo
на github , где были jre
и jdk
.
.jinfo
. Итак, чтобы исправить это, вам нужно изменить hl
и jdkhl
s. Если ваш файл .openjdk-8-jdk.jinfo
в /usr/lib/jvm/
, используйте эту команду
sudo sed -i 's/^hl/jre/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo
sudo sed -i 's/^jdkhl/jdk/p' /usr/lib/jvm/.openjdk-8-jdk.jinfo
Теперь, чтобы обновить, сначала перечислите альтернативы
sudo update-java-alternatives -l
Он вернет что-то вроде этого (фактический ответ может отличаться для вас)
java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64
jdk1.8.0_65 1081 /usr/lib/jvm/jdk1.8.0_65
Скопируйте альтернативное имя из первого столбца и используйте его, чтобы установить значение по умолчанию. Чтобы установить jdk1.8.0_65
по умолчанию, я бы использовал
sudo update-java-alternatives -s jdk1.8.0_65 -v
Теперь, проверьте версии java
и javac
.
На мой PATH каким-то образом влияет файл /etc/environment
, как вы можете видеть:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
Когда я выполняю which java
и which javac
, я вижу что-то вроде следующего:
/usr/bin/java
Теперь я не могу быть уверен, что они связаны. * Но как разработчик Java, я часто добавляю вещи в Path - это то, как мы влияем на CLASSPATH, чтобы наши классы Java были доступны. А в приведенной выше конфигурации Пути вы видите этот отрывок:
PATH="/usr/l...sbin:/usr/bin:/sbi..."
Я не знаю, что это значит. Тем не менее, следуя целям, данным мне командой which
, я получаю набор ссылок на исполняемые файлы. Глядя на цели этих ссылок, я получаю что-то вроде:
/etc/alternatives/java
Неуверен в следующих шагах. Скопируйте эти ссылки, сделайте их резервную копию или удалите их. Немного проб и ошибок, и поиск в Google - следующие шаги. Я не погуглил разницу между javac -version
и which
, но мне следует
HTH и благодаря BryceAtNetwork23