2

在类路径上查找资源后,我得到了这个 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();
    }
}

这给了我几个 URL com.google.inject.Injector,我想弄清楚哪些包将它们添加到类路径中。

4

3 回答 3

0

一种 hacky 方法是解析 URL,但这仅在 Equinox 上运行时有效。根据BundleResourceHandler的来源,URL 方案右侧的整数 ('23') 是捆绑 ID。如果您有 BundleContext(检查您的 Activator),那么您可以使用getBundle(long)找到具有该 ID 的捆绑包。

但是,可能有更好的方法来做到这一点。你如何在类路径中查找资源?

于 2012-08-09T16:10:18.477 回答
0

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

于 2012-08-09T17:04:24.003 回答
0

OSGi url 保证层次结构。因此,只需将资源替换com/google/inject/Injector.classMETA-INF/MANIFEST.MF清单(或文本文件)并将其读取。那里的信息告诉您正在查看哪个捆绑包。

重复的类只能发生在被认为是不好的(非常糟糕的恕我直言)做法的拆分包中。在 OSGi 中,拆分包需要Require-Bundle重新导出或Bundle-Classpath. 没有这些,生活会轻松很多......

于 2012-08-13T07:32:20.783 回答