0%

Tycho:用Maven构建Eclipse Plugin项目

Tycho以一组maven插件的形式,支持Eclipse的plug-ins, features, update sites (based on p2) 、products等类型工程的构建。

Tycho是一个Maven插件,目标是使用Maven构建Eclipse插件,OSGI Bundle等工程。

如果说Maven的出现是一群Java程序员受不了繁琐的插件依赖管理,受不了冗长的ant build.xml文件而创造出来的,
那Tycho则是一群Eclipse、OSGi插件开发人员受不了重复地配置类似的Maven pom.xml而创造出来的。

Tycho以一组maven插件的形式,支持Eclipse的plug-ins, features, update sites (based on p2) 、products等类型的工程,
表现为不同的maven打包类型(packaging):

  • eclipse-plugin
  • eclipse-feature
  • eclipse-test-plugin
  • eclipse-repository
  • eclipse-target-definition

父工程

基于OSGi的工程通常会划分很多模块,对于Maven来说,一般通过一个父工程(parent)来管理所有模块的构建。父工程的packaging类型为pom.

为了使用Tycho,需要在父工程的pom文件中增加一些配置。

增加Tycho插件

父工程中定义的插件可以在所有子工程中使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<properties>
<tycho-version>0.16.0</tycho-version>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>

定义bundle仓库

比如,基于Eclipse 4.3(Kepler)的RCP应用,使用了Texo、GeminiJPA等插件,需要如下的仓库定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<repositories>
<repository>
<id>Kepler</id>
<url>http://download.eclipse.org/releases/kepler</url>
<layout>p2</layout>
</repository>
<repository>
<id>Texo</id>
<url>http://download.eclipse.org/modeling/emft/texo/updates/interim</url>
<layout>p2</layout>
</repository>
<repository>
<id>GeminiJPA</id>
<url>http://download.eclipse.org/gemini/jpa/updates</url>
<layout>p2</layout>
</repository>
<repository>
<id>EclipseLink</id>
<url>http://download.eclipse.org/rt/eclipselink/updates/</url>
<layout>p2</layout>
</repository>
</repositories>

定义目标

定义不同的目标平台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<configuration>
<environments>
<environment>
<os>linux</os>
<ws>gtk</ws>
<arch>x86</arch>
</environment>
<environment>
<os>macosx</os>
<ws>cocoa</ws>
<arch>x86_64</arch>
</environment>
</environments>
</configuration>
</plugin>

如果要发布比较复杂的目标,比如Eclipse Product的发布,需要单独构建eclipse-target-definition类型的子工程。

为现有工程生成pom

Tycho提供了一个工具,可以为现有的Eclipse Plugin、Feature等工程生成pom文件,从而将其整合到Tycho的管理之下。

该工具也是基于maven的,只需要在工程文件夹执行命令:

1
mvn org.eclipse.tycho:tycho-pomgenerator-plugin:generate-poms -DgroupId=thinkinside.tangle

生成的pom文件举例如下:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns=" http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>thinkinside.tangle</groupId>
<artifactId>tangle-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>

由于种种原因,Eclipse Plugin工程的配置内容分散在多个文件中,包括:

  • OSGi的配置文件:MANIFEST.MF
  • 插件工程构建文件:build.properties
  • 插件定义文件:plugin.xml
  • 产品描述文件:.product

这些文件中的配置项有重复,开发人员要保证各文件中的相关配置的一致性。

Tycho在生成pom文件时,会检查这些配置文件,将其中的配置项写入pom文件中。

Tycho的逻辑是以上述标准的配置文件优先。比如,在pom文件中没有定义依赖关系,而是以MANIFEST.MF中定义的依赖为准。

如果现有工程已经有了pom文件,还可以使用Tycho进行更新:

1
mvn org.eclipse.tycho:tycho-versions-plugin:update-pom -Dtycho.mode=maven

“目标定义”子工程

前面提到,如果要发布比较复杂的目标,比如Eclipse Product的发布,需要单独构建eclipse-target-definition类型的子工程。

在”目标定义”子工程中创建.product文件,然后在pom文件中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<build>
<plugins>
<plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-p2-director-plugin</artifactId>
<version>${tycho-version}</version>
<executions>
<execution>
<!-- install the product for all configured os/ws/arch environments
using p2 director -->
<id>materialize-products</id>
<goals>
<goal>materialize-products</goal>
</goals>
</execution>
<!-- (optional) create product zips (one per os/ws/arch) -->
<execution>
<id>archive-products</id>
<goals>
<goal>archive-products</goal>
</goals>
</execution>



</executions>
</plugin>
</plugins>
</build>

“目标定义”子工程中还可以使用”目标定义文件(Target Definition, *.target)“进行复杂的配置。
可以参考这里的说明,也可以查看GitHub上的例子的例子。

Test工程

与专门的测试工具Pax Exam相比,Tycho test使用起来会更简单。当然前提是测试由Tycho构建的OSGi应用。

Tycho将一个”Fragment”工程包装成Maven工程,可以在其中编写测试代码,然后使用”JUnit Plug-in Test”执行测试。

对比Maven-Bundle-Plugin

Maven-Bundle-Plugin提供了与Tycho不同风格的另一种构建OSGi的maven插件。关于二者的对比,可以参考这里