четверг, 11 октября 2007 г.

Sun WTK в окружении JDK 1.6 на FreeBSD



Препосылки
Приложения из пакета Sun WTK 2.2, установленные из Коллекции портов FreeBSD, не работают должным образом. Так, например, при запуске любого тестового J2ME-приложения (из числа демонстрационных, входящих в комплект поставки Sun WTK) в KToolbar возможно одно из следующих сообщений об ошибке:
1) Ошибка обращения к нативной библиотеке libXpm;
2) Ошибка LIME номер такой-то;
3) Ошибка компиляции из-за неверной кодировки строк символов в исходниках.

С самого начала было ясно, что комплект разработчика Sun WTK портировался и тестировался для работы в Linux-окружении JDK версии 1.4.2 и выше. Странно, что ранее его удавалось завести под Diablo JDK 1.5, нативной версией Sun J2SE SDK 1.5. С недавних пор работа эмулятора Sun WTK вызывала серьёзные нарекания. Возможно, это как-то связано с существенными изменениями в ядре операционной системы и переходу на новую версию оконной системы Xorg 7.2, а затем и на Xorg 7.3. Кардинальные обновления Sun WTK 2.2 не наблюдались — по-прежнему использовался дистрибутив для Linux, зависимый по сборке от нативной Diablo JDK 1.5.

Пути решения
Путь решения оказался самым элементарным: очистить систему от установленных JDK, попробовать установить Sun WTK, заставив его запускаться в окружении Linux-версии Sun JDK из Коллекции портов. Далее накатить нативную версию Sun JDK для обеспечения эффективной работы остальных java-приложений в системе. Благо, FreeBSD позволяет работать нативным Linux-приложениям, используя режим трансляции API-вызовов через механизм ABI.

Сначала был установлен пакет linux-sun-jdk-1.4.2.13. В нём Sun WTK работал стабильно, но нагрузка на процессор была близка к 100% при подозрительно-большом числе (10-15 штук!) процессов java, которые не реагировали на команду killall java даже от имени root'а — очень странная и неоптимальная конфигурация для работы. От этого пришлось отказаться.

Снова очистка и перезагрузка системы.

Решение
Далее я описываю решение, которое найдено умозрительным путём.

1. Установить Linux Sun JDK 1.6:
% cd /usr/ports/java/linux-sun-jdk16
% make rmconfig clean install clean

В начале процесса установки появится просьба скачать необходимые файлы с сайта java.sun.com и скопировать их в каталог ports/distfiles, при этом ссылки на страницы загрузки будут даны.

2. Примонтировать файловую систему Linux ProcFS:
% mount -t linprocfs linprocfs /compat/linux/proc
Без этой команды пакет разработчика Sun WTK не соберётся.
Вообще же, строчку:
linprocfs /compat/linux/proc linprocfs rw 0 0
следует добавить в файл /etc/fstab, так как без этого эмулятор Sun WTK откажется запускаться и выбросит одну из вышеприведённых ошибок.

3. Собрать Sun WTK:
% cd /usr/ports/java/sun-wtk
% make rmconfig clean install clean

После этого надо обеспечить пакет Sun WTK конфигурацией для функционирования в окружении Linux JDK:
% mkdir /usr/local/sun-wtk/wtklib/Linux
% cp /usr/local/sun-wtk/wtklib/FreeBSD/* /usr/local/sun-wtk/wtklib/Linux/


4. Можно перезагрузить систему командой:
% shutdown -r now

5. Собрать и инсталлировать Diablo JDK 1.5 для сборки нативного Sun JDK 1.6:
% cd /usr/ports/java/diablo-jdk15
% make rmconfig clean install clean

В начале процесса установки появится просьба скачать необходимые файлы с соответствующих сайтов и скопировать их в каталог ports/distfiles, при этом ссылки на страницы загрузки будут даны. Впоследствии Diablo JDK 1.5 можно удалить, так как он нужен лишь на этапе сборки нативного Sun JDK 1.6 и офисного пакета OpenOffice.

6. Собрать и инсталлировать Sun JDK 1.6:
% cd /usr/ports/java/jdk16
% make rmconfig clean install

Опять же, в начале процесса установки появится просьба скачать необходимые файлы с соответствующих сайтов и скопировать их в каталог ports/distfiles, при этом ссылки на страницы загрузки будут даны. Здесь намеренно не используется команда make clean, так как при последующем удалении пакета Diablo JDK 1.5 последний уносит с собой в небытие некоторые нативные библиотеки, без которых невозможна работа сетевых Java-приложений и апплетов в Web-браузере, а значит необходимо будет либо собрать с нуля Sun JDK 1.6 (установленный Sun JDK 1.6 способен пересобрать сам себя), либо воспользоваться уже откомпилированным материалом.

7. Можно удалить пакет Diablo JDK 1.5, чтобы освободить место на диске:
% cd /usr/ports/java/diablo-jdk15
% make deinstall clean

и реинсталлировать Sun JDK 1.6:
% rehash
% cd /usr/ports/java/jdk16
% make deinstall install clean


9. Проверить версию рабочей JVM:
% java -version
Она должна быть:
java version "1.6.0_01-p1"
Java(TM) SE Runtime Environment (build 1.6.0_01-p1-root_11_oct_2007_02_04-b00)
Java HotSpot(TM) Client VM (build 1.6.0_01-p1-root_11_oct_2007_02_04-b00, mixed mode)


Итак, теперь в системе установлено две версии Sun JDK 1.6: одна для работы специфических Linux-приложений, нуждающихся в нативной поддержке Linux ABI; другая — нативный комплект разработчика для работы любых Java-приложений в окружении нативной JRE.

Собственно, на этом всё.

1 комментарий:

Анонимный комментирует...

Блин.. Я с этим мучаюсь уже сутки! Спасибо!