如何构建Eclipse RCP应用程序以便其功能可以自动更新?

时间:2012-04-27 14:00:52

标签: eclipse eclipse-plugin eclipse-rcp p2 tycho

我正在构建一个由几个功能组成的RCP应用程序。

我的RCP应用程序配置为每次启动时检查更新。我目前的问题是我需要在构建时“安装”我的某个功能,以便在自动检查更新期间更新,而不必强制用户手动安装它。我需要此功能独立于系统中的其他功能进行更新。

所以,回顾一下,我只是在寻找一种很好的自动化方式,在RCP应用程序中安装一个功能,使其独立于其他功能进行更新,并且不需要RCP应用程序的用户手动安装。

3 个答案:

答案 0 :(得分:5)

经过长时间的搜索,我找到了答案。这是一种kludge,但我愿意做任何事情。我的解决方案取决于我构建的RCP应用程序包含p2应用程序org.eclipse.equinox.p2.director的事实。我想如果您的RCP应用程序不包含此应用程序,您可以参考另一个Eclipse安装以启动Director。我这样做就是为了避免Eclipse的实例位于我的构建机器上。

我使用了p2-dev邮件列表,Paul Webster回答了我的问题。 (谢谢保罗)

他建议使用ant启动p2 director应用程序,将IU安装到我构建的RCP应用程序中。

这是他在p2-dev邮件列表上的答案 http://dev.eclipse.org/mhonarc/lists/p2-dev/msg04735.html

这是我提出的蚂蚁目标。

<target name="install_IU">
  <path id="launcher.paths">
    <fileset
       dir="${app.dir}"
       includes="plugins/org.eclipse.equinox.launcher_*" />
  </path>
  <property
      name="launcherPath"
      refid="launcher.paths" />
  <echo>-installIU ${iu.id} </echo>
  <java 
      jar="${launcherPath}"
      failonerror="false"
      dir="${app.dir}"
      timeout="900000"
      fork="true"
      output="${basedir}/director.log"
      resultproperty="directorcode">
      <arg line="-application org.eclipse.equinox.p2.director" />
      <arg line="-noSplash" />
      <arg line="-installIUs ${iu.id}" />
      <arg line="-repository ${iu.repo}" />
      <arg line="-destination ${app.dir}" />
      <arg line="-bundlepool ${app.dir}" />
  </java>

  <zip destfile="${app.zip}"
    basedir="${app.dir}"/>
</target>

我把它放在同一项目中的一个ant文件中,该项目通过Tycho生成我的Eclipse RCP应用程序。 Tycho在一个名为“target”的目录中生成我的构建工件,所以我上面的ant目标的参数看起来像这样......

<target name="modify_x86">
  <antcall target="install_IU">
    <param name="iu.id" value="com.mydomain.the.feature.i.want.to.install.feature.feature.group"/>
    <param name="iu.repo" value="http://mydomain.com/thep2repository/where/i/deploy/the/feature/to/install"/>
    <param name="app.dir" value="${basedir}/target/products/com.mydomain.myRCPapplication/win32/win32/x86"/>
    <param name="app.zip" value="${basedir}/target/products/com.mydomain.myRCPapplication-win32.win32.x86.zip"/>
  </antcall>
</target>

我为我的RCP应用程序构建的每个平台提供了更多这些目标。

希望这有帮助。

更新:2014年5月8日。托比亚斯引起了我的注意,我应该将接受的答案从这一个更改为具有添加到Tycho 0.20.0中的新功能的答案更简约的时尚。所以,新接受的答案是现在这个问题的正确解决方案。

答案 1 :(得分:2)

与此同时,Tycho明确支持此用例。从Tycho 0.20.0开始,您可以将RCP的Tycho安装功能与产品分开。通过这种方式,可以独立于产品更新(甚至卸载)这些功能。

要单独安装功能,只需将属性installMode="root"添加到产品文件中的相应功能标记即可。例如:

<features>
   <feature id="org.eclipse.platform"/>
   <feature id="updatable.feature" installMode="root"/>
</features>

有关详细信息,请参阅this documentation page

答案 2 :(得分:1)

在我找到这里记录并接受的答案之前,我试过并尝试以下方式解决了这个问题:

我尝试将功能放在产品定义中。这个功能已成功安装,但它使我无法独立于RCP应用程序中的其他功能进行更新。

我有一个正在运行的p2接触点命令。它使用p2.inf文件向RCP应用程序中的可用更新站点添加存储库。它看起来像这样......

instructions.configure=\
 org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:0,name:My Feature Name,enabled:true);\
 org.eclipse.equinox.p2.touchpoint.eclipse.addRepository(location:http${#58}//myUpdateSsite/myFeature,type:1,name:My Feature Name,enabled:true);\\

我尝试添加这样的一行来安装该功能,但是当我运行mvn clean install时,我的tycho构建失败

instructions.configure=\
 org.eclipse.equinox.p2.touchpoint.eclipse.installFeature(feature:My Feature Name,featureId:com.my.domain.my.feature.id,version:1.0.0);

以下是来自maven / tycho

的一些错误消息
An error occurred while configuring the installed items session context was:
(profile=DefaultProfile, phase=org.eclipse.equinox.internal.p2.engine.phases.Configure, operand=null --> 
[R]{my.domain.my.rcp.product.plugin 1.1.6.20120427-1346}, 
action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.InstallFeatureAction).
Installable unit contains no artifacts: [R]my.domain.my.rcp.product.plugin 1.1.6.20120427-1346.

我的直觉告诉我,这个错误消息说我的RCP应用程序插件缺少一些能告诉p2在构建时找到我要安装的功能的地方。我想???