RCP: P2 Update两个烦人bug和解决办法

问题

Eclipse新的P2 Update机制,使用起来很方便,如果使用P2 plugin自带的UI,开发者完全不用写任何代码 即可实现application的在线更新。 但是P2 Update至少有2个已知的bug,都是打包jre相关的问题,讲清楚后,你会发现解决方案很简单,但是厘清之前,它甚至可能困恼你几天而没有头绪。(注:笔者当前使用的eclipse版本为4.3)

 

Bug1:https://bugs.eclipse.org/bugs/show_bug.cgi?id=300812

更新时更新jre目录失败,错误消息类似于

Backup of file [...]\eclipse\jre\lib\jsse.jar failed.
File that was copied to backup could not be deleted: [...]\eclipse\jre
\lib\jsse.jar.

或者

"Can't remove application_path/jre/jre/lib/charsets.jar"

这个bug是由于如果你打包产品时,勾选了Bundle JRE for this enviroment with the product。那么除了自动生成jre目录外,repository目录中也会包含jre的更新。那么,问题就来了,你打包在产品中的jre正在被使用,同时更新程序又企图backup、delete、update它,于是报错。

 

Bug2:http://www.eclipse.org/forums/index.php?&t=msg&th=162865

简单说,就是即使你去掉了对Bundle JRE for this enviroment with the product的勾选,打包时照样会生成jre目录。

 

解决方案

对于Bug1, 解决方案很简单,就是不要勾选Bundle JRE for this enviroment with the product,不自动打包jre。但是,这时候你就面临Bug2。

NOTE:

如果你是基于feature打包而不是plugin打包。那么还有一个解决办法,就是把jre打包到一个独立的feature中去,并且永远不增加这个feature的版本号,这样这个feature就不会被更新了。实际配置当然要复杂得多,而且我也还没试成功,参考https://bugs.eclipse.org/bugs/show_bug.cgi?id=300812 Comment23

 

对于Bug2,我给出的链接中有许多讨论,我试了真正有用的只有一个:那就是重装eclipse,然后永远永远不要勾选“Bundle JRE for this enviroment with the product”。

最后,如果结果是不能打包jre,那么上面的都是废话了。其实解决方案也很简单,就是把jre目录手动拷贝到application的根目录,然后在根目录的ini文件中加入以下两行:

-vm
./jre/bin

 

参考

If your Eclipse-RCP application does not want to work with update site.

posted @ 2013-08-26 08:37  Binhua Liu  阅读(2533)  评论(0编辑  收藏  举报