问题
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 [...]eclipsejrelibjsse.jar failed.
File that was copied to backup could not be deleted: [...]eclipsejre
libjsse.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.