Не так давно передо мной встала задача интегрировать сборку Eclipse плагинов и Eclipse RCP приложений в Hudson. Идеальным вариантом стал бы набор maven-плагинов. После непродолжительного гугления я нашел инструмент, разрабатываемый командой m2eclipse, который называется TYCHO. Сразу нужно сказать, что текущее состояние это глубокая пре-альфа. Например, для работы требуется maven-3.0, который тоже еще альфа. Поэтому текущая версия (0.4.0-DEV) распространяется вместе со встроенным допиленым maven-3.0-SNAPSHOT. (В версии 0.5.0-DEV обещают разделить, то есть можно будет пользоваться отдельным maven-3.0-SNAPSHOT и TYCHO как набором maven-плагинов, как оно собственно и задумывалось.) Состояние документации тоже пока плачевно: средняя дата статей на
wiki - весна этого года и полнота их оставляет желать лучшего. Однако, с помощью лома, гугла и такой-то матери мне удалось приспособить TYCHO для своих нужд.
Итак, скачиваем последний
development release, распаковываем и меняем переменную окружения M2_HOME на распакованную папку. Мавен у нас теперь будет жить там. Проверяем:
| Код |
user@user-desktop:~/tycho-example-workspace$ mvn --version Apache Maven 3.0-TYCHO-818442 (r818615; 2009-09-25 01:00:12+0400) Java version: 1.6.0_10 Java home: /home/user/jdk1.6.0_10/jre Default locale: ru_RU, platform encoding: UTF-8 OS name: "linux" version: "2.6.24-24-generic" arch: "amd64" Family: "unix"
|
Далее, создадим два плагина из стандартных темплейтов: один Hello, World Command, другой Hello RCP, в котором пропишем зависимость от первого. Позволю себе не описывать эту процедуру. За подробностями можно обратиться, например,
сюда. В результате должно получиться, например, такое:
| Код |
user@user-desktop:~/tycho-example-workspace$ tree -I target fixxer.test.tycho/ fixxer.test.tycho/ |-- fixxer.test.tycho.plugin | |-- META-INF | | `-- MANIFEST.MF | |-- build.properties | |-- icons | | `-- sample.gif | |-- plugin.xml | `-- src | `-- main | `-- java | `-- fixxer | `-- test | `-- tycho | `-- plugin | |-- Activator.java | `-- handlers | `-- SampleHandler.java `-- fixxer.test.tycho.rcp.plugin |-- META-INF | `-- MANIFEST.MF |-- build.properties |-- icons | |-- alt_about.gif | |-- alt_launcher.icns | |-- alt_launcher.ico | |-- alt_launcher.xpm | |-- alt_window_16.gif | `-- alt_window_32.gif |-- plugin.xml |-- splash.bmp `-- src `-- main `-- java `-- fixxer `-- test `-- tycho `-- rcp `-- plugin |-- Activator.java |-- Application.java |-- ApplicationActionBarAdvisor.java |-- ApplicationWorkbenchAdvisor.java |-- ApplicationWorkbenchWindowAdvisor.java `-- Perspective.java
|
Далее начнем прикручивать TYCHO.
1. Создадим родительский/контейнерный pom
| Код |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>fixxer.test.tycho</groupId> <artifactId>parent</artifactId> <packaging>pom</packaging> <name>Tycho Test</name> <version>0.0.1-SNAPSHOT</version> <modules> <module>fixxer.test.tycho.plugin</module> <module>fixxer.test.tycho.rcp.plugin</module> </modules> <repositories> <repository> <id>ganymede</id> <layout>p2</layout> <url>http://download.eclipse.org/releases/ganymede</url> </repository> </repositories>
<build> <plugins> <plugin> <groupId>org.codehaus.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <configuration> <resolver>p2</resolver> </configuration> </plugin> </plugins> </build> </project>
|
Обратите внимание, TYCHO может разрешать зависимости из репозитория Eclipse.
2. Создадим pom'ы для модулей
| Код |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>fixxer.test.tycho</groupId> <artifactId>plugin</artifactId> <packaging>eclipse-plugin</packaging> <name>Tycho Test Plugin</name> <version>0.0.1-SNAPSHOT</version>
<parent> <groupId>fixxer.test.tycho</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
</project>
|
| Код |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>fixxer.test.tycho</groupId> <artifactId>fixxer.test.tycho.rcp.plugin</artifactId> <packaging>eclipse-plugin</packaging> <name>Tycho Test RCP Plugin</name> <version>0.0.1-SNAPSHOT</version>
<parent> <groupId>fixxer.test.tycho</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
</project>
|
3.
| Код |
user@user-desktop:~/tycho-example-workspace/fixxer.test.tycho$ mvn clean install
|
Ждем, пока TYCHO скачает
интернет зависимости...
| Код |
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Tycho Test ........................................ SUCCESS [2.107s] [INFO] Tycho Test Plugin ................................. SUCCESS [8.730s] [INFO] Tycho Test RCP Plugin ............................. SUCCESS [1.079s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
|
Получите, распишитесь - собранные плагины в target'ах и в локальном репозитории.
Заметьте, зависимости от плагинов не нужно прописывать в pom, TYCHO прекрасно понимает Require-Bundle из манифеста, как впрочем и другие OSGi аттрибуты.
Если вы разрабатываете чистые плагины, без RCP, то на этом можно и закончить. Но победа будет неполной, если мы не соберем RCP product.
Итак, делаем еще один модуль, создаем там Product Configuration и pom.
| Код |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>fixxer.test.tycho</groupId> <artifactId>app</artifactId> <packaging>eclipse-application</packaging> <name>Tycho Test Product</name> <version>0.0.1-SNAPSHOT</version>
<parent> <groupId>fixxer.test.tycho</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<build> <plugins> <plugin> <groupId>org.codehaus.tycho</groupId> <artifactId>maven-osgi-packaging-plugin</artifactId> <configuration> <environments> <environment> <os>linux</os> <ws>gtk</ws> <arch>x86</arch> </environment> </environments> </configuration> </plugin> </plugins> </build>
</project>
|
| Код |
user@user-desktop:~/tycho-example-workspace/fixxer.test.tycho$ tree -I target fixxer.test.tycho.app/ fixxer.test.tycho.app/ |-- app.product `-- pom.xml
|
Добавляем модуль в реактор. Собираем. И... Ловим
незакрытый баг.
Что делать? Можно подождать, когда баг закроют. Можно попробовать закрыть его самому. А можно использовать следующий workaround.
Качаем RCP-SDK + Delta pack. Я использовал
эту запись в блоге. Сливаем их, добавляем необходимые плагины (мне пришлось добавить org.eclipse.core.runtime.compatibility.registry).
| Код |
user@user-desktop:~/tycho-example-workspace/fixxer.test.tycho$ mvn -Dtycho.targetPlatform=/path/to/sdk clean install
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Tycho Test ........................................ SUCCESS [0.509s] [INFO] Tycho Test Plugin ................................. SUCCESS [3.014s] [INFO] Tycho Test RCP Plugin ............................. SUCCESS [0.965s] [INFO] Tycho Test Product ................................ SUCCESS [1.540s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
|
| Код |
user@user-desktop:~/tycho-example-workspace/fixxer.test.tycho$ tree fixxer.test.tycho.app/target/ fixxer.test.tycho.app/target/ |-- app-0.0.1-SNAPSHOT-linux.gtk.x86_64.zip |-- app.product `-- linux.gtk.x86_64 `-- eclipse |-- configuration | `-- config.ini |-- launcher |-- libcairo-swt.so `-- plugins |-- com.ibm.icu_3.8.1.v20080530.jar |-- fixxer.test.tycho.plugin_1.0.0.jar |-- fixxer.test.tycho.rcp.plugin_1.0.0.jar |-- org.eclipse.core.commands_3.4.0.I20080509-2000.jar |-- org.eclipse.core.contenttype_3.3.0.v20080604-1400.jar |-- org.eclipse.core.databinding_1.1.1.M20080827-0800b.jar |-- org.eclipse.core.expressions_3.4.0.v20080603-2000.jar |-- org.eclipse.core.jobs_3.4.0.v20080512.jar |-- org.eclipse.core.runtime.compatibility.registry_3.2.200.v20080610 | |-- META-INF | | |-- ECLIPSE.RSA | | |-- ECLIPSE.SF | | |-- MANIFEST.MF | | `-- eclipse.inf | |-- about.html | |-- fragment.properties | `-- runtime_registry_compatibility.jar |-- org.eclipse.core.runtime_3.4.0.v20080512.jar |-- org.eclipse.equinox.app_1.1.0.v20080421-2006.jar |-- org.eclipse.equinox.common_3.4.0.v20080421-2006.jar |-- org.eclipse.equinox.launcher.gtk.linux.x86_64_1.0.101.R34x_v20080731 | |-- META-INF | | |-- ECLIPSE.RSA | | |-- ECLIPSE.SF | | |-- MANIFEST.MF | | `-- eclipse.inf | |-- about.html | |-- eclipse_1115.so | `-- launcher.gtk.linux.x86_64.properties |-- org.eclipse.equinox.launcher_1.0.101.R34x_v20080819.jar |-- org.eclipse.equinox.preferences_3.2.201.R34x_v20080709.jar |-- org.eclipse.equinox.registry_3.4.0.v20080516-0950.jar |-- org.eclipse.help_3.3.101.v20080702_34x.jar |-- org.eclipse.jface.databinding_1.2.1.M20080827-0800a.jar |-- org.eclipse.jface_3.4.1.M20080827-2000.jar |-- org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar |-- org.eclipse.swt.gtk.linux.x86_64_3.4.1.v3449c.jar |-- org.eclipse.swt_3.4.1.v3449c.jar |-- org.eclipse.ui.workbench_3.4.1.M20080827-0800a.jar `-- org.eclipse.ui_3.4.1.M20080910-0800.jar
|
В заключение рекомендую
исходники TYCHO. Там в тестах много примеров.