无法访问捆绑资源/文件(OSGi)



目前我正在使用Jetty和Equinox开发一个基于OSGi的WebApp(请参阅:http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit)。到目前为止一切都很好,但我无法访问自己捆绑包的一些文件/资源。位置/路径为"configuration/data/config.csv"one_answers"configuration/ddata/data.zip"。我测试了所有东西:

context.getBundleContext().getBundle().getEntry("config.csv");
context.getBundleContext().getBundle().getResource("config.csv");
this.getClass().getClassLoader().getResource("config.csv");
context.getBundleContext().getDataFile("config.csv");

当然,所有可能的路径变体,如:"configuration/data/config.csv"、"/configuration/data/connfig.csv"、。此外,我已经将文件夹添加到OSGi类路径中(在MANIFEST.MF中):

Bundle-ClassPath: .,
 configuration/data/

生成的URL看起来总是这样(或为空):"configuration/CBR Data/config.csv",当我将其传输到文件对象"D:\configuration\CBR Data\config.csv"时。

但我真正不明白的是,我的一个DS的属性文件加载得很完美:
<properties entry="configuration/dsconfig.properties"/>

有人有什么想法/建议吗?我开车疯了。。。

您正在正确地从捆绑包中检索资源。我建议熟悉getEntry()、getResource()和getDataFile()之间的区别。

因为方法会返回正确的URL,这意味着资源的位置是正确的,问题在于如何读取它们。

使用它们的两种方法是:

  1. 直接从URL打开InputStream

    URL configURL = context.getBundleContext().getBundle().getEntry("configuration/data/config.csv");
    if (configURL != null) {
        InputStream input = configUrl.openStream();
        try {
            // process your input here or in separate method
        } finally {
            input.close();
        }
    }
   
  1. URL转换为File。不建议使用这种方法,因为它假设Bundle部署为目录(而不是归档)。但是,如果您必须处理需要使用File对象的遗留库,这将非常有用。要转换为File,您不能使用URL.getPath()方法,因为Equinox有自己的URL格式。您应该使用org.eclipse.core.runtime.FileLocator类来解析为FileFileLocator.getBundleFile(Bundle)正是你想要的

已解决!!!感谢Danail Nachev(见评论),他把我带到了正确的道路上!经过一番搜索ndleentry://xyz"one_answers"bundleresource://"我发现了这个邮件列表帖子:http://www.mail-archive.com/felix-dev@孵化器.apache.org/msg02410.html

因此答案如下(Using(Equinox)FileLocator):

URL configURL = context.getBundleContext().getBundle().getResource("config.csv");
File configFile = new File(FileLocator.toFileURL(configURL).getPath());

但是(在邮件列表中也被问到)如果有其他解决方案不仅适用于Equinox,那会很有趣吗?

相关内容

  • 没有找到相关文章

最新更新