2010-08-19 39 views
13

我已经使用eclipse插件项目向导(使用eclipse Helios)创建了两个OSGI包A和B.访问另一个osgi包中的资源?

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

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

现在捆绑BI尝试使用加载属性文件:

但是,给出了一个空指针异常(文件并没有在类路径中)。

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

回答

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(); 
+0

这在Helios中显然已弃用。 – JRSofty 2011-06-09 09:17:13

2

你有没有考虑过添加一个方法来捆绑A的API来加载和返回资源?

许多人可能认为这是一个更好的设计,因为它允许的名称或资源更改,恕不打破束A的客户

+0

这种方法在我运行插件测试时工作。但是,当我通过启动配置运行包时,无法找到.properties文件。设置pluign-test和OSGI运行配置有什么区别? – u123 2010-08-20 08:22:39

1

您是否尝试过使用捆绑A的BundleContext的加载资源的存储方式?

+0

杰普和那工作正常,我只是困惑为什么它不可能加载一个资源从另一个包使用例如: this.getClass()。getClassLoader()。getResourceAsStream( “bundle_A.properties”); 当捆绑包被指定为依赖项,并且.properties文件位于导出的包中时。 – u123 2010-08-24 15:40:50

+0

因为'this'在bundle A中。使用Bundle B中的类并且它可以工作。 – 2010-08-24 21:09:20

15

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

有没有必要抓住捆绑的类加载器来做到这一点。

+1

另请注意,不需要从软件包A导出包含资源的软件包。 – 2010-08-21 22:29:36

0

试用/;如果你不把/,类加载器将尝试从相同的包中加载资源。

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

这是错误的。它仍然只会使用bundle B的类加载器来查找捆绑B的类加载器/ – 2012-10-06 18:55:01