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

在进行Eclipse插件开发时,有一种应用场景是,需要在插件项目中设置存放有例如配置文件、模板文件的资源文件夹。本文介绍的问题是,插件项目打包发布后,无法访问资源文件夹中的资源文件。

问题重现:

在插件项目的根目录下有模板资源文件夹,需要在插件运行时访问这些资源。在插件开发中,通过"Run as -- Eclipse Application"方式测试插件,可以正常访问,但是生成jar包后发布运行,却无法定位到这些资源文件(表现为,指向该资源文件的URL对象为空)。

问题代码(目的是插环件境中定位FreeMarker模板文件位置,本例中模板文件路径为Project_HOME(插件工程根目录)/resources/*.ftl):

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.csdn.net/soszou/article/details/8034482

本文问题解决方案:

1)项目开发中的资源文件夹如图:

插件Classpath配置如图:

以"Run as -- Eclipse Application"方式测试插件时可以正常访问,但打包发布后,运行时得到的资源URL如图:

2)解决方法:打开MANIFEST.MF的编辑器,在"Runtime"编辑页,将资源文件夹(本文中为"resources")配置进入Classpath,如图:

结果为:

添加后,可以发现"resources"文件夹的图标发生改变,如图:

打包发布后,运行时得到的资源URL如图:

3)结论:

必须将资源路径配置到Bundle的类加载路径中,才能保证Bundle能够定位、访问这些资源。其实可以通过插件加载icons目录下的图片文件的机制,联想到其他资源文件的加载。在Eclipse API中可以通过如下方式获取插件项目中的图片资源:

public static ImageDescriptor getImageDescriptor(String path) {
	return imageDescriptorFromPlugin(PLUGIN_ID, path);
}

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

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

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

全文完。

时间: 2024-10-19 15:14:22

Eclipse插件开发 RCP生成jar包后获取jar包中的Plugin/Bundle文件资源——以FreeMarker为例的相关文章

java中通过包名获取该包下的所有class

前面做的在mybatis通过注解自动创建更新表结构的项目,其中在spring加载完毕之后需要去获取所有实体类的class,用来获取实体类属性上的注解,进而分析表结构达到创建修改表结构的目的. 所以就需要一个功能,通过包名获取该包下的所有class,那么直接贴代码: package com.sunchenbin.store.utils; import java.io.File; import java.io.FileFilter; import java.io.IOException; impor

ios如何获取在 NsData 中下载的音频文件?

ios如何获取在 NsData 中下载的音频文件? 标签: ios  Objective-C 发布时间: 2014/12/12 7:48:06 在我的项目我有 Url 的音频......看看我的代码... ViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface ViewController : UIViewController<AVAudioPlayer

有关打包成可执行jar包后引用jar包中配置文件问题

一 问题由来 有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用.比如说这样: 如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面. 假如说我们用File来读取文件: BufferedReader reader = new BufferedReader(new FileReader(new File("r

Eclipse中将JNI生成的so打包成jar的步骤

说明:新人,对java不熟,见谅. 1. 新建工程,添加好native support,写好对应的文件(包括cpp文件,so文件和对应的java文件,此处称对应的java文件为SoJAR.java,). 2. 右键单击该SoJAR.java文件,选择Export,选择java中的JAR file. 之后设置好路径,一路finish.便可生成对应的jar文件. 3. 将生成的SoJAR.jar文件放到新的工程的libs目录下(老版本的可能步骤比较复杂,我用的Eclipse 23,不需要别的设置,直

用Apktool获取别人APP中的图片及布局资源进行学习

当我们看到一款UI布局很漂亮的APP,想要了解别人是怎么实现的时候,就可以通过Apktool工具来反编译别人的apk,从而获取图片及布局资源来进行学习. 其实我们下载到的Android 应用,是可以直接把后缀名改成zip的,然后解压zip就可以得到对应的文件目录 其中,res为所有资源文件,META-INF为签名信息,classes.dex为java源码编译后生成的字节码. 原以为这样轻松的就可以拿到别人的布局源码了,实则不然,点开res/layout下的一个布局文件看看 然后发现里面都是XML

Eclipse插件开发学习笔记【3】--- 添加视图和透视图

一.添加视图 视图是Eclipse插件开发中一个重要的扩展点,我们需要做的是在Eclipse插件项目中插入一个视图. 首先,新建一个插件项目,命名为addView,选择Hello Word模板,其他默认设置. 包结构如图所示: 双击plugin.xml文件,选择扩展选项卡,点击添加org.eclipse.ui.views扩展点. 右键新建一个category和view属性如图所示: 右键src添加类,输入类名FirstView,继承超类ViewPart,包addperspective.views

Linux内核--网络栈实现分析(六)--应用层获取数据包(上)

本文分析基于内核Linux 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7541907 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 上篇博文分析了传输层从网络层获取数据包后将

项目打jar包后无法获取配置文件的路径问题

项目打jar包后无法获取配置文件的路径问题 今天在开发中做一个java项目,要求读取配置文件中的信息,当项目打jar包以后就找不到配置文件了,问题最后解决了,拿出来跟大家分享一下. 方式一:getResource(这种方式在war包好用,在jar包不好用): public static void main(String[] args) { String path=App.class.getClassLoader().getResource("config.properties").ge

解决eclipse中java项目导出成jar包后读写UTF-8文件中文乱码问题

最近遇到了一个小麻烦,就是在eclipse环境中读写UTF-8格式的txt文件时很正常,但是当导出成jar包后,通过点击来读写文件时出现了部分中文乱码问题. 解决办法: 开始时用的是FileReader和FileWriter来读写的,后来改成用InputStreamReader和OutputStreamWriter后问题解决 关键代码: BufferedReader reader; BufferedWriter writer; //reader = new BufferedReader(new