设为首页 收藏本站
查看: 748|回复: 0

[经验分享] Eclipse插件开发 RCP生成jar包后获取jar包中的Plugin/Bundle文件资源——以FreeMarker为例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-10-23 11:50:48 | 显示全部楼层 |阅读模式
  在进行Eclipse插件开发时,有一种应用场景是,需要在插件项目中设置存放有例如配置文件、模板文件的资源文件夹。本文介绍的问题是,插件项目打包发布后,无法访问资源文件夹中的资源文件。       问题重现:
       在插件项目的根目录下有模板资源文件夹,需要在插件运行时访问这些资源。在插件开发中,通过"Run as -- Eclipse Application"方式测试插件,可以正常访问,但是生成jar包后发布运行,却无法定位到这些资源文件(表现为,指向该资源文件的URL对象为空)。
       问题代码(目的是插环件境中定位FreeMarker模板文件位置,本例中模板文件路径为Project_HOME(插件工程根目录)/resources/*.ftl):
1
2
3
4
5
6
7
8
cfg = new Configuration();
URL url = Activator.getDefault().getBundle().getResource("resources");
//log.info("resources url: " + url);  // 测试代码,其中log为private static Logger log = LoggerFactory.getLogger(FreeMarkerUtil.class);
//log.info("resources path: " + url.toString());
String resourcesPath = FileLocator.toFileURL(url).getPath();
File resourcesDir = new File(resourcesPath);
cfg.setDirectoryForTemplateLoading(resourcesDir);  // FreeMarker定位资源的方法随应用场景不同调用不同API,详见FreeMarker手册
Template template = cfg.getTemplate(templateName, "UTF-8");  // templateName为相对于resources路径,如templateName="a.ftl",则其路径为Project_HOME/resources/a.ftl



问题原因解析:
       Eclipse API通过这些资源相对于Plugin/Bundle的路径,获取这些资源的绝对路径的方法。Eclipse API通过IBundle接口获取位于在Bundle文件目录中的资源,也就是说,必须将资源路径配置到Bundle的类加载路径中,才能保证Bundle能够定位、访问这些资源。有关Eclipse API、Bundle等概念和插件资源等相关知识的深入内容,推荐阅读:http://blog.iyunv.com/soszou/article/details/8034482

      本文问题解决方案:
      1)项目开发中的资源文件夹如图:
wKiom1RHz1vA9yvPAAAlkRxpmGw766.jpg
          插件Classpath配置如图:
wKiom1RHzbGSWYunAAGKrWTNsms996.jpg
         以"Run as -- Eclipse Application"方式测试插件时可以正常访问,但打包发布后,运行时得到的资源URL如图:
wKioL1RHz7iDDYO5AACCGeIJ3Dk163.jpg
        2)解决方法:打开MANIFEST.MF的编辑器,在"Runtime"编辑页,将资源文件夹(本文中为"resources")配置进入Classpath,如图:
wKiom1RHzhrAnsgCAAJO8b3pffQ874.jpg
        结果为:
wKioL1RHzpDA8ImwAAFwOuPWjiA367.jpg
        添加后,可以发现"resources"文件夹的图标发生改变,如图:
wKiom1RH0NHh08eUAAAkVVvNfBo764.jpg
       打包发布后,运行时得到的资源URL如图:
wKiom1RHzpSgWjq9AAD6V3trytg491.jpg

        3)结论:
        必须将资源路径配置到Bundle的类加载路径中,才能保证Bundle能够定位、访问这些资源。其实可以通过插件加载icons目录下的图片文件的机制,联想到其他资源文件的加载。在Eclipse API中可以通过如下方式获取插件项目中的图片资源:
1
2
3
public static ImageDescriptor getImageDescriptor(String path) {
    return imageDescriptorFromPlugin(PLUGIN_ID, path);
}



        或
1
Image image = Activator.getImageDescriptor("icons/workset.gif").createImage();



        这是因为插件项目已经默认将icons配置进入了Classpath中,在"MANIFEST.MF"文件编辑器的"build.properties"页中可以发现,如图:
wKiom1RHzwLSFK9sAAOOwlu0gLo066.jpg

       按照本文中的解决方案操作之后,可以发现,resources文件夹也被添加到了bin.includes中了,如图:
wKiom1RHzxuSTmNCAAOp7wJ1sig226.jpg

全文完。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-26540-1-1.html 上篇帖子: centos 编译安装python2.7.8 带zlib 下篇帖子: Maven+Myeclipse8.6的安装和配置 开发 资源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表