如何通过名称获取OSGi包的安装目录(绝对路径)?

时间:2016-01-25 22:27:23

标签: java eclipse osgi equinox

是否可以在运行时以其名称获取特定OSGi包的绝对路径?如果是,怎么样?

电子。 G。我有一个符号名为com.example.e4.rcp.todo.service的包。从另一个包但在同一个应用程序中的类中,我想确定运行时com.example.e4.rcp.todo.service的绝对安装路径。

我不知道这是否相关,但我使用的是Eclipse Equinox。

4 个答案:

答案 0 :(得分:3)

没有可靠的方法来获取此信息,因为OSGi包不需要“安装目录”。

例如,如果我按以下方式安装捆绑包,那么捆绑包中没有与文件系统有任何连接的任何内容:

var poem = "Roses are red, violets are blue\r\n\r\nSomething something darkside";
var verses = System.Text.RegularExpressions.Regex.Split(poem, "\r\n");
foreach (var verse in verses)
{
  var words = verse.Split(' ');
  Console.WriteLine(words.Count());
}

答案 1 :(得分:1)

如果要存储捆绑包拥有的某些数据,则应使用BundleContext.getDataFile(String)

答案 2 :(得分:0)

Eclipse Equinox具有FileLocator帮助程序类,可用于解析Equinox中的资源。

http://help.eclipse.org/juno/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/FileLocator.html

具体来说,FileLocator #resf可能会帮到你。但是:

  

但请注意,此API的用户不应过多考虑此方法的结果。虽然它可能在某些安装配置中始终返回文件:URL,但其他配置可能会生成jar:或http:URL。

如果您无法完全控制配置,我会谨慎地依赖它。

答案 3 :(得分:0)

在Equinox OSGi中,您可以使用FileLocator.getBundleFile(...)

File bundleFile = FileLocator.getBundleFile(bundle).getCanonicalFile();

它返回Bundle Jar文件或Bundle目录的File对象,具体取决于bundle的安装方式(打包或解压缩,就像在Eclipse插件中一样)。

我最后添加了getCanonicalFile()因为我经常遇到像/workspace/project_xyz/bin/../这样的相对路径元素。