Хорошо известно, что RCP связка — не лучший друг Maven. Миротворец между ними — подключаемый модуль Maven Tycho . Я недавно перенес свой проект, основанный на RCP в свободное время, в Maven Tycho. Моей целью было разделить зависимости между обычным проектом Maven и проектом Tycho. Проект Plain Maven необходим для запуска тестов TestNG (TestNG не поддерживается Tycho).
Существует два подхода к автоматической обработке зависимостей проекта на основе Eclipse 4 RCP, управляемого Tycho:
-
manifest-first — этот подход следует стандартным механизмам зависимостей RCP / OSGi. Все зависимости также должны быть собраны в пакеты. Это является предпочтительным и хорошо описано в руководстве, предложенном сайтом Tycho. Он размещен на github . Но есть несколько проблем, осложняющих мою цель :
-
Необходимо найти существующий пакет или создать его для каждой зависимости. Неудобства.
-
Если бы я использовал подход, основанный на манифесте, зависимости пакета не были бы видны проектам, не относящимся к Tycho. Мне нужно иметь два набора зависимостей. Избыточность.
-
-
pom-first — это альтернативный подход, когда зависимости упаковываются в пакет с помощью maven-bundle-plugin, и это используется как зависимость от пакета проекта. Этот подход описан здесь . Проблема этого подхода:
-
Он работает только для сборки Maven и Eclipse не обнаруживает зависимости.
-
Наконец, мы получили подсказку (в последнем подходе) и нашли решение, которое, возможно, не так уж и красиво, но зависимости указаны в одном месте, и даже Maven и Eclipse могут их найти. Это использует некоторые аспекты обоих упомянутых подходов.
Я покажу здесь только конфигурацию, необходимую для моего решения. Весь проект можно найти на кодовой странице Google . Позвольте мне описать структуру Maven проектов:
discography-organizer.parent — содержит различные свойства, используемые дочерними poms. Также используется для запуска сборки всех подмодулей.
discography-organizer.dependencies.parent — здесь указаны общие зависимости
discography-organizer.dependencies.bundle — выполняет два важных шага:
-
maven-bundle-plugin для упаковки зависимостей
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.1.0</version> <extensions>true</extensions> <configuration> <instructions> <Export-Package>*; -split-package:=merge-last</Export-Package> </instructions> </configuration> </plugin>
-
maven-antrun-plugin для копирования упакованного jar со всеми зависимостями в место, где он может быть выбран проектом RCP
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <phase>package</phase> <configuration> <target> <copy tofile="${temp.dependencies.folder}/dependencies.jar"> <fileset dir="${project.build.directory}" includes="*.jar" /> </copy> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
discography-organizer.bundle — основной комплексный проект RCP, управляемый Tycho. Ожидается вызов Tycho, есть две важные настройки:
-
В конфигурации plugin.xml на вкладке «Runtime» выберите jar зависимостей, созданный discography-organizer.dependencies.bundle
-
Упакуйте основные классы проекта в банку. Это будет использовано при тестировании проекта discography-organizer.tests
а) упаковка классов приложений в банку
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <phase>package</phase> <configuration> <target> <jar destfile="${temp.dependencies.folder}/${bundle.name}-TESTING.jar" basedir="${project.basedir}/bin"/> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
б) файл pom для этой тестовой зависимости
<groupId>sk.lkrnac.discorg</groupId> <artifactId>discography-organizer.bundle</artifactId> <version>TESTING</version> <packaging>jar</packaging>
discography-organizer.tests — обычный maven проект с тестами. Это чтение тестовых классов из jar, созданного discography-organizer.bundle
<dependency> <groupId>sk.lkrnac.discorg</groupId> <artifactId>${bundle.name}</artifactId> <version>TESTING</version> <scope>system</scope> <systemPath>${temp.dependencies.folder}/${bundle.name}-TESTING.jar</systemPath> </dependency>
Вот и все. Зависимости, необходимые для основного пакета или тестовых артефактов, упакованы в файлы JAR. Этот обходной путь имеет побочные эффекты, которые мне действительно не нравятся. Зависимости безобразно упакованы в одну банку для основного комплекта. Но я могу с этим смириться, потому что этот подход позволяет мне комбинировать функции подключаемых модулей Tycho и не Tycho maven. Я планирую использовать другие функции Tycho (автоматическое построение и тесты плагинов JUnit), и у меня есть хорошая отправная точка для этого.
Если вы можете придумать какое-нибудь более простое или более элегантное решение, пожалуйста, не стесняйтесь комментировать его. благодаря