Каковы стандартные места, в которых виртуальная машина Java настроена в Ubuntu 12.04?

Я использую 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 и компилятор используют одну и ту же версию.

5
задан 13 February 2014 в 23:54

2 ответа

Начиная с вашего последнего абзаца

Можете ли вы сказать мне, где 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 .

TL; DR

Итак, чтобы вкратце ответить на ваш запрос, подключаемый модуль 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.

0
ответ дан 13 February 2014 в 23:54

На мой 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


0
ответ дан 13 February 2014 в 23:54

Другие вопросы по тегам:

Похожие вопросы: