使用Tycho构建OSGi插件项目

使用Tycho构建OSGi插件项目

自动构建OSGi Plugin项目,一直以来就是个头疼的问题。直到 Tycho 的出现,这些都不在成为问题了。用它你可以很轻松来构建Eclipse插件(Eclipse Plugin) , Eclipse features , Eclipse的更新站点(Update Site)以及可以直接执行的Eclipse产品(Eclipse Product) Tycho插件将会直接使用Eclipse项目中MANIFEST.MF中所包含的依赖信息。这样依赖pom.xml文件就会很小。

Tycho简介

TychoSonatype所倡导的基于Maven的构建系统,其目的在于以一种可重现的方式开发Eclipse插件。在编译插件时,Eclipse会稍微有所不同,因为OSGiJAR之间建立了过滤器;所以当a.jar依赖于b.jar的时候,它不一定能够看到b.jar中所有的包。在历史上,Eclipse一直使用Ant作为PDE构建的基础——实际上,当你在IDE中构建Eclipse插件时,它会生成并自动删除一个build.xml文件,“build.properties”实际上会直接应用到Ant构建之中。

令人遗憾的是,基于Ant的构建往往难以调试,并且依赖解析的方式很复杂且难以进行搭建。另外一方面,对于Java和其他应用来讲,Maven都是事实上标准的构建工具,它具有内置的依赖解析和缓存机制,能够在任何的机器上运行标准的构建。

Tycho是一系列的Maven插件,类似于之前基于Ant的构建,但是会通过P2仓库进行解析并使用P2依赖(而不是中央仓库)。插件可以获取和使用build.properties来理解PDE的文件结构,并调用Eclipse的编译器(必要的OSGi过滤器已经就绪)来产生一个编译后的插件。要形成一个产品、特性(feature)或仓库会有多个独立的插件,所以可以使用已有PDE插件,并且抛弃掉Ant构建的复杂性并将其替换为几个相对简单的Tycho插件。

最好的一点在于Eclipse平台正在转移到全部使用Tycho进行构建,将其作为通用构建基础设施(Common Build Infrastructure)的一部分。现在可以检出Eclipse平台,然后只执行一条Maven命令就能进行构建。再加上,使用Gerrit(以及将来的GitHub)来接受开发者的贡献,这会使得Eclipse成为更为开放的社区并且将会鼓励更多的开发人员来提供贡献。

 

环境准备

         在介绍使用Tycho来构建OSGi插件产品之前,假设已经进行了以下准备工作:

安装Maven

         下载最新的Maven,并设置M2_HOME,将Maven/bin添加至对应的环境变量中。

安装Eclipse

         推荐使用Eclipse4系列,因其内置了m2eclipse插件,本文中使用的是Juno版本。

 

使用Tycho构建Plugins

         在插件目录中,添加pom.xml,如下图中的工程:com.yonyou.nc.codevalidator.rule-api中所示:

 

 

pom.xml文件中的内容如下:

 

 

         其中groupIdmaven中的命名类似,用于将插件包进行分类操作时使用,artifactId用来作为插件的唯一名称,要与MANIFEST中的Bundle-SymbolicName一致,versionMANIFEST.MF中的Bundle-Version一致。

         packaging是使用Tycho的重点,确定该插件使用eclipse插件的方式进行打包操作,下面还会介绍到,当打包类型不同时,该选项的值也会不同。

         如果此时运行mvn package,将会得到一个错误信息:”Unknown packaging: eclipse plugin”,为了解决这个问题,需要添加Tycho作为build plugin:

 

<build>

    <plugins>

      <plugin>

        <groupId>org.eclipse.tycho</groupId>

        <artifactId>tycho-maven-plugin</artifactId>

        <version>${tycho.version}</version>

        <extensions>true</extensions>

      </plugin>

      <plugin>

          <groupId>org.eclipse.tycho</groupId>

          <artifactId>tycho-p2-repository-plugin</artifactId>

          <version>${tycho.version}</version>

       </plugin>

       <plugin>

        <groupId>org.eclipse.tycho</groupId>

        <artifactId>target-platform-configuration</artifactId>

        <configuration>

          <environments>

            <environment>

              <os>linux</os>

              <ws>gtk</ws>

              <arch>x86</arch>

            </environment>

            …

        </configuration>

      </plugin>

    </plugins>

  </build>

 

 

         重新执行后,会发现另外一个错误:“Unsatifiable error”,这是因为我们没有添加对应的repository,以致于无法找到对应的eclipse bundle,需要添加Juno release repository:

<repositories>

    <repository>

      <id>juno</id>

      <url>http://download.eclipse.org/releases/juno</url>

      <layout>p2</layout>

    </repository>

</repositories>
 

         现在运行mvn package,就可以将该bundle进行构建(注意,连上外网,并且不能有其他非eclipse bundle的依赖才能构建成功)。构建成功后,该bundlejar包会放在target目录下。

使用Tycho构建FeaturesUpdate Sites

         使用Tycho来构建FeaturesUpdate Sites其实与构建插件比较类似,只不过packaging类型不同而已。

Features:  <packaging>eclipse-feature</packaging>

Update Sites:  <packaging>eclipse-repository</packaging>

   在构建feature时不需要特别注意,但是如果想要构建updatesite时,必须摒弃由eclipse自动生成的文件样式,新建category文件,整理后的updatesite工程如下图所示:



 

 

category.xml文件内容类似:

 

<?xml version="1.0" encoding="UTF-8"?>
<site>
   <feature id="com.yonyou.nc.codevalidator.plugin.feature" version="0.0.0">
      <category name="com.yonyou.nc.codevalidator.category"/>
   </feature>
   <feature id="com.yonyou.nc.codevalidator.plugin.domain.feature" version="0.0.0">
      <category name="com.yonyou.nc.codevalidator.domain.category"/>
   </feature>
   <category-def name="com.yonyou.nc.codevalidator.category" label="NC规则检查插件"/>
   <category-def name="com.yonyou.nc.codevalidator.domain.category" label="NC领域规则集合"/>
</site>

 

 

         当项目中Features比较多并且数量比较大时,管理这些所有的pom.xml就比较复杂,此时我们可以使用Maven提供的继承结构,创建一个parent项目,放置在所有bundle的目录上层。

 

 
 

         这样就可以在最外层parent上定义插件版本,依赖仓库等公共信息,而在各子插件中,FeaturesUpdate Sites中仅定义差异的部分即可,当版本进行变动时,就可以仅修改parent中的版本号,此时上一节中介绍的rule-api简化成以下内容,注意需要声明parent

 

 

         而在parent中可以定义各module,用来在parent进行一键式构建,此时parentpackaging类型为pom

 

 

         注意module声明的顺序,以依赖的顺序为准,否则在构建过程中会报错。

 

搭建Nexus私服

NexusOSS版是完全免费的Maven私服。很多企业都在使用它来构建团队内部的私服。在默认情况下Nexus OSS版是不支持eclipse 推出的p2这个仓库的,而Tycho就是依赖这种仓库。所以为了能和Tycho配合工作我们让Nexus加上这种能力,万幸的是sonatype已经开发出了nexus-p2-repository-plugin nexus-p2-bridge-plugin这两个插件,他们为Nexus加上这两种能力。我们只需要安装这两个插件就好了。

插件安装目录:/nexus目录/nexus/WEB-INF/plugin-repository/,安装完成后启动nexus,用管理员登录对Repository进行管理,添加一个p2 proxy repository,使用junop2下载路径作为URL:

 

 

         然后添加一个p2-groupconfiguration,将上一步骤中添加的juno p2 repository加入到该分组中。

 

 

         这样,在原有的Repository就可以设置为刚配置的p2-group地址,当p2-group不存在对应的eclipse bundle时,会从远程的路径中获得。

<repositories>

    <repository>

      <id>juno</id>

      <url>http://localhost:8081/nexus/content/groups/p2-group</url>

      <layout>p2</layout>

    </repository>

</repositories>
 

部署构建至私服

         如何将我们构建的bundle包发布至私服中?这里我们在构建中额外添加deploy命令来完成此项操作,mvn package deploy

         首先需要在Nexus中创建一个自己私有的仓库,步骤为Repositorys->Add->Hosted Repository,在页面的下半部分输入框填入Repository IDRepository Name即可,如果要将构建部署至私服中,需要在构建的pom.xml文件增加distributionManagement配置项,

<distributionManagement>

    <repository>

        <id>local-nexus-release</id>

        <name>Internal Releases</name>

    <url>http://localhost:8090/nexus/content/repositories/releases/</url>

    </repository>

</distributionManagement>
 

         其中的URL即为私服的Hosted仓库地址。配置完成后,执行mvn deploy,部署应该仍然不会成功,根据提示信息,Return code is: 401,这是因为发布者没有权限,需要将用户认证信息添加至maven/conf/settings.xml中,属于全局配置:

<server>

      <id>local-nexus-release</id>

      <username>admin</username>

      <password>admin123</password>

</server>
 

         注意此时serverid与配置的repository id要保持一致,usernamepasswordnexus私服中有部署权限的用户,可以在security->users中找到,如果第二次执行 mvn deploy 又失败,这次失败原因是Return code is: 400,原因是在创建仓库时在configuration中的Deployment Policy设置为了Disable Redeploy,修改为Allow Redeploy即可。

 

猜你喜欢

转载自brandnewuser.iteye.com/blog/2017219