OSGi / Equinox:如何将资源URI转换为包名?

时间:2012-08-09 14:24:00

标签: url classpath osgi equinox

在类路径上查找资源后,我得到了这个URL:

bundleresource://23.fwk1186515174/com/google/inject/Injector.class

如何找出提供资源的捆绑包?

[编辑] 我正在尝试调试我在类路径上有重复类的问题。这是我正在使用的代码:

private void debugClassPath() {
    String resource = "com/google/inject/Injector.class";
    try {
        Enumeration<URL> urls = getClass().getClassLoader().getResources( resource );

        while( urls.hasMoreElements() ) {
            System.out.println(urls.nextElement());
        }

        System.out.println("---");

        urls = XtextRunner.class.getClassLoader().getResources( resource );

        while( urls.hasMoreElements() ) {
            System.out.println(urls.nextElement());
        }
    } catch( IOException e ) {
        e.printStackTrace();
    }
}

这为com.google.inject.Injector提供了几个网址,我想知道哪些包将它们添加到类路径中。

3 个答案:

答案 0 :(得分:0)

一种hacky方法是解析URL,但这只适用于在Equinox上运行时。根据{{​​3}}的来源,URL方案右侧的整数('23')是包ID。如果您有BundleContext(检查您的Activator),那么您可以使用BundleResourceHandler找到与该ID相关的捆绑包。

然而,这可能会有更好的方法。你如何在类路径上查找资源?

答案 1 :(得分:0)

没有标准的方法可以做到这一点。但是,对于Equinox,通过查看URL处理程序如何在权限中对其进行编码,有一种特定于实现的方式(可能会在将来的版本中进行更改,因为它是一种特定于实现的方式)。

答案 2 :(得分:0)

OSGi网址保证层次结构。因此,只需将com/google/inject/Injector.class替换为META-INF/MANIFEST.MF,并将资源作为清单(或文本文件)读取。那里的信息告诉你你正在看哪个包。

重复的类只能在拆分包中发生,这被认为是糟糕的(非常糟糕的imho)练习。在OSGi中,拆分包需要Require-Bundle重新导出或Bundle-Classpath。没有这些,生活会轻松得多......

相关问题