是否可以在运行时以其名称获取特定OSGi包的绝对路径?如果是,怎么样?
电子。 G。我有一个符号名为com.example.e4.rcp.todo.service
的包。从另一个包但在同一个应用程序中的类中,我想确定运行时com.example.e4.rcp.todo.service
的绝对安装路径。
我不知道这是否相关,但我使用的是Eclipse Equinox。
答案 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)
具体来说,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/../
这样的相对路径元素。