Статьи

Обмен зависимостями между проектом RCP Tycho Driven и Plain Maven

Хорошо известно, что 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 — выполняет два важных шага:

  1. 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>
  2. 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, есть две важные настройки:

  1. В конфигурации plugin.xml на вкладке «Runtime» выберите jar зависимостей, созданный discography-organizer.dependencies.bundle

  2. Упакуйте основные классы проекта в банку. Это будет использовано при тестировании проекта 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), и у меня есть хорошая отправная точка для этого.

Если вы можете придумать какое-нибудь более простое или более элегантное решение, пожалуйста, не стесняйтесь комментировать его. благодаря