在类路径上查找资源后,我得到了这个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
提供了几个网址,我想知道哪些包将它们添加到类路径中。
答案 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
。没有这些,生活会轻松得多......