Google Analytics

понедельник, 25 апреля 2011 г.

Archlinux, xulrunner 2.0 и WebKitGTK+ 1.3.13 - устраняем ошибку No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]

Случилась у меня проблемма с моей любимой IDE. Думаю, не сложно догадаться, что это Eclipse.

Почему Eclipse?

Eclipse - это фреймворк, позволяющий из разных компонент построить IDE на любой вкус, и для разных языков. Это не IDE, а мета-IDE, местами больше напоминающая ещё одну ОС:)
Среда написана на Java, что является гарантией её корректной работы на различных ОС(не известно, на чём прийдётся работать в будущем).
Она легко расширяема(в этом она мне напоминает Emacs, так как среди расширений есть IDE для различных языков, разные редакторы, файловый менеджер, медиаплеер, фреймворк для создания отчётов и многое другое).
У меня установленно всё что нужно, для изучения технологий XSL, Java и Scheme(я изучаю Sheme по замечательной книге SICP), а также Web Tools и ещё кое-что(для работы с XML/HTML/CSS и JavaScript).

Суть проблемы

Установленно всё на Archlinux 64-bit, и при этом я использую firefox 4/xulrunner-2.0 и Gnome 3(а вместе с ним и WebKitGTK+ 1.3.13). Из-за этого то свежего софта и сломался компонент SWT, отвечающий за внутренний браузер. При запуске Eclipse вместо браузера отображается такое вот сообщение:
No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]
org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]
 at org.eclipse.swt.SWT.error(SWT.java:4109)
 at org.eclipse.swt.browser.Mozilla.initMozilla(Mozilla.java:1739)
 at org.eclipse.swt.browser.Mozilla.create(Mozilla.java:656)
 at org.eclipse.swt.browser.Browser.(Browser.java:119)
 at org.eclipse.ui.internal.browser.BrowserViewer.(BrowserViewer.java:225)
 at org.eclipse.ui.internal.browser.WebBrowserEditor.createPartControl(WebBrowserEditor.java:78)
 at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670)
 at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)
 at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
 at org.eclipse.ui.internal.EditorAreaHelper.setVisibleEditor(EditorAreaHelper.java:271)
 at org.eclipse.ui.internal.EditorManager.setVisibleEditor(EditorManager.java:1429)
 at org.eclipse.ui.internal.EditorManager$5.runWithException(EditorManager.java:942)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3515)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3164)
 at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
 at org.eclipse.ui.internal.Workbench$31.runWithException(Workbench.java:1567)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3515)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3164)
 at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2548)
 at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
 at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
 at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
 at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
 at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
 at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
 at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
 at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
 at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
 at org.eclipse.equinox.launcher.Main.main(Main.java:1384)


И всё. Стал я искать в интернете сведения, как эту проблемму решить. И нашёл два варианта решения, оба базируются на добавлении в конец eclipse.ini опций для компонента WEB-браузера в SWT. Вначале добавил в конец файла эти строки:
-XX:-UseCompressedOops
-Dorg.eclipse.swt.browser.XULRunnerPath==/usr/lib/xulrunner-2.0/
Но не завелось, ведь xulrunner версии 2 и выше не поддерживает JavaXPCOM, а эта технология была связующей между Java-приложениями и объектами XPCOM. В результате при апгрейде до Firefox 4 и Gnome 3 автоматически ломается работа браузера, встроенного в приложения Java. SWT c версии 3.6 позволяет использовать WebKit вместо xulrunner, а в SWT 3.7 и Eclipse 3.7 этот HTML-движок является компонентом web-браузера по умолчанию. Я решил, что вторая рекомендация мне поможет. Для задействования для отображения HTML движка WebKit, в eclipse.ini надо добавить строку:
-Dorg.eclipse.swt.browser.UseWebKitGTK=true
В результате мой конфиг(eclipse.ini) стал выглядеть так:
plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.2.R36x_v20101019_1345
-product
org.eclipse.epp.package.javascript.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-Xms256m
-Xmx256m
-XX:+AggressiveOpts 
-Dorg.eclipse.swt.browser.UseWebKitGTK=true
Из конфигурации видно, что оперативы у меня мало(на борту всего 1Гб памяти, и 64 метра из неё съедает встроенная GeForce 6100), и я использую новый сборщик мусора и агрессивную оптимизацию. Всё из-за устаревшего железа, что делать... Но проблемма осталась, всё так-же eclipse ругался на отсутсвие подходящей версии xulrunner. Почему не завёлся WebKit? У меня паралельно имеется Eclipse Helios(версия 3.6), и тестовая версия Eclipse Indigo(версия 3.7). И в обоих версиях всё осталось по прежнему. Так в чём же причина? С Gnome 3 установилась и WebKitGtk версии 1.3.13-1. Смотрим скриншот:


А на сайте проекта WebKitGTK что мы видим? Вот такое предупреждение: What's new in WebKitGTK+ 1.3.13? IMPORTANT: In this release the GObject DOM Bindings contain a major change. Итак, в WebKitGTK+ сломали совместимость, и пока команда, разрабатывающая SWT не успела внести нужные изменения в SWT 3.7, а SWT 3.6 уже никогда не заработает с WebKitGTK+ 1.3.13. Получается, что использовать xulrunner 2.0 и выше мы не можем, WebKitGTK+ 1.3.13-1 тоже не модходит. Удалять новыю версию WebKitGTK+? Так я люблю максимально свежий софт, поэтому и перешёл с Ubuntu на Debian testing, а затем и на Archlinux. Удалять новую версию библиотеки ради установки старой версии - неправильно. И я пошёл на трюк, использовав такой вот скрипт для запуска Eclipse:
#!/bin/bash
export LD_LIBRARY_PATH=libwebkit-1.2.7-1-x86_64.pkg/usr/lib
./eclipse
Да, скрипт лежит прямо в корневой директории Eclipse. Я качаю архив с Eclipse для Linux 64-bit и просто разворачиваю его на специальном разделе диска. Устанавливать eclipse при помощи pacman не вижу смысла, т.к. eclipse умеет обновлять установленные модули сам, используюя собственный механизм репозиториев расширений и механизм их обновления. Cкачал вручную пакет с нужной версией WebKitGTK+, он называется libwebkit-1.2.7-1, и распаковал его в каталог с моей версией Eclipse. А при помощи LD_LIBRARY_PATH я заставил eclips загружать нужную ему версию библиотеки WebKitGTK+. Это, конечно, выглядит как грязный хак, но ведь теперь всё работает(только запускать надо Eclipse через запуск шелл-скрипта, но ведь это не такая уж большая проблема?). В общем, я боролся с коварным багом, и хоть и не по правилам, но сделал его. И Eclipse опять работает как часы:)

Комментариев нет: