无法访问Bundle Resource / File(OSGi)

时间:2011-06-05 18:38:38

标签: file resources osgi bundle

目前我正在使用Jetty和Equinox开发基于OSGi的WebApp(参见:http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit)。 到目前为止一切都很好,但我无法访问我自己的一些文件/资源​​。 位置/路径是“configuration / data / config.csv”和“configuration / data / 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 / config.csv”,“\ configuration / data / config.csv”,“/ config.csv” 。 此外,我已将文件夹添加到OSGi类路径(在MANIFEST.MF中):

Bundle-ClassPath: .,
 configuration/data/

生成的URL看起来总是像这样(或null):“configuration / CBR-Data / config.csv”,当我将它传输到File对象“D:\ configuration \ CBR-Data \ config.csv”时

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

有人有想法/提示或其他什么?我开车疯了......

2 个答案:

答案 0 :(得分:13)

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

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

使用它们的两种方法是:

  1. 直接从InputStream打开URL
  2.    
    
        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)完全符合您的要求。

答案 1 :(得分:4)

解决!!! 感谢Danail Nachev(见评论)带我走向正确的道路!在“bundleentry:// xyz”和“bundleresource://”之后进行了一些搜索后,我发现了这个邮件列表帖子:http://www.mail-archive.com/felix-dev@incubator.apache.org/msg02410.html

所以答案如下(Usging(Equinox)FileLocator):

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

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