访问另一个osgi包中的资源?

时间:2010-08-19 14:51:01

标签: java eclipse osgi bundle

我使用eclipse Plug-in项目向导(使用eclipse Helios)创建了两个OSGI包A和B.

在捆绑包B的清单文件中,我添加了捆绑包A作为依赖关系。此外,我已经在A中导出了包,因此它们对于B是可见的。我还在包A中有一个.properties文件,我希望它对包B可见。在包中的build.properties窗格中,AI已指定:

source.. = src/
bin.includes = META-INF/,\
               .,\
               bundle_A.properties

现在在B组中,我尝试使用以下方法加载.properties文件:

  private Properties loadProperties() {
    Properties properties = new Properties();
    InputStream istream = this.getClass().getClassLoader().getResourceAsStream(
        "bundle_A.properties");
    try {
      properties.load(istream);
    } catch (IOException e) {
      logger.error("Properties file not found!", e);
    }
    return properties;
  }

但是这会产生一个nullpointer异常(在类路径中找不到该文件)。

是否可以从捆绑包A中导出资源(就像导出包时一样)或以某种方式从B中以另一种方式访问​​A中的文件(从捆绑包B访问捆绑包A的类加载器)?

5 个答案:

答案 0 :(得分:15)

getEntry(String)上的Bundle方法用于此目的。您可以使用它从任何捆绑包加载任何资源。如果您不知道捆绑包内资源的确切路径,请参阅方法findEntries()getEntryPaths()

没有必要抓住bundle的类加载器来执行此操作。

答案 1 :(得分:3)

如果您正在编写Eclipse插件,可以尝试以下方法:

Bundle bundle = Platform.getBundle("your.plugin.id");

Path path = new Path("path/to/a/file.type");

URL fileURL = Platform.find(bundle, path);

InputStream in = fileURL.openStream();

答案 2 :(得分:2)

您是否考虑过添加一个方法来捆绑加载和返回资源的A的API?

许多人可能认为这是一个更好的设计,因为它允许更改资源的存储名称或方式,而不会破坏捆绑包A的客户端。

答案 3 :(得分:1)

您是否尝试过使用捆绑包A的BundleContext来加载资源?

答案 4 :(得分:0)

尝试使用/;如果你没有放/,类加载器将尝试从同一个包中加载资源。

this.getClass().getClassLoader().getResourceAsStream( "/bundle_A.properties")