Google Analytics

Показаны сообщения с ярлыком Eclipse. Показать все сообщения
Показаны сообщения с ярлыком Eclipse. Показать все сообщения

понедельник, 30 мая 2011 г.

Установка чистой Eclipse IDE в Linux, и доводка её ума. Часть 1



Вы знаете, что(и зачем) установлено в ващем дистрибутиве Linux, но не знаете, что и зачем запихнули разработчики в версию Eclipse для вашего ЯП? Может пришло время взять контроль и над вашей любимой IDE?

Я запланировал установить Eclipse в произвольный каталог на одном из разделов. Пусть это будет каталог "mnt/biglv/JavaApp".

Итак, мы должны найти линк для скачивания чистой версии платформы Eclipse. Мы ведь хотим установить туда только то, что мы хотим там видеть.Идём на страничку http://download.eclipse.org/eclipse/downloads/ , ищем там "Latest Release" и переходим на посвящённую ему страничку. Справа ищем "Platform Runtime Binary" и оказываемся в разделе, где присутствует набор ссылок на нужную нам платформу для разных ОС и архитектур процессоров. Для меня это  Linux (x86_64/GTK 2).

Нажимаем на ссылку(http в колонке Download), и оказываемся на странице выбора зеркала для загрузки.Можно скачать платформу для будущей IDE просто выбрав нужное зеркало, но потом файл с архивом ещё прийдётся копировать в выбранный нами каталог. Сделаем иначе, ищем слева "Filter" и "All mirrors (xml)", открываем ссылку и среди xml-тегов находим подходящую ссылку для закачки нужного нам пакета(параметр url тега mirror). Копируем ссылку на скачиваемый архив.

Заходим в терминале в каталог, в который мы собираемся качать нашу платформу для будущей IDE(допустим IDE для Java). Запускаем там команду wget с нашей ссылкой, и качаем архив Eclipse Platform Runtime.

Ну, я его уже скачал. Распаковываю командой

 tar xvfz eclipse-platform-3.6.2-linux-gtk-x86_64.tar.gz
и переименовываю получившийся каталог eclipse в eclipse-3.6.2-JDT командой
 mv -R eclipse eclipse-3.6.2-JDT

Поздравляю, у нас установлен чистый экземпляр среды разработки Eclipse. Но ему не помешает ещё небольшой тюнинг, и установка необходимых возможностей(наборов подключаемых модулей, предоставляющих определённые возможности среде). Об этом я расскажу в следующих заметках. Успехов!

понедельник, 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 опять работает как часы:)