如何获取OSGi使用的所有jar路径?

时间:2012-07-03 01:41:34

标签: java osgi

我想得到所有jar路径,我可以在这些jar中搜索.class文件。我写了一个函数来搜索App主文件夹下的所有jar但遇到了一个问题 - 一些jar包已经存在但过时并没有被OSGi使用,例如。 xxxx_1.0.0.jar和xxxx_1.2.0.jar都存在,但OSGi仅使用1.2.0。如果我在主文件夹中搜索,它们将在结果列表中。

那么有没有办法获取OSGi使用的所有jar文件?然后我可以过滤掉未使用的jar文件。 感谢

加了: 我尝试使用这种方式获取所有Bundles绝对URL,但失败了:

StringBuffer sb = new StringBuffer();
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles();
for (Bundle bundle : bundles) {
    java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation();
    sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n");
}

但是重复输出了数百次:

File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar, 
File:....

使用的bundle的数量是:588,它可能是正确的,我们可以从API获得绝对的Bundles路径,但为什么它们都是相同的?我怎样才能获得真正的道路?

2 个答案:

答案 0 :(得分:3)

BundleContext#getBundles()为您提供所有捆绑包。然后,您可以比较符号名称和版本。但是,因为您同时拥有xxxx_1.0.0.jar和xxxx_1.2.0.jar,并不意味着xxx_1.0.0.jar未使用。可能存在一些需要xxx_1.0.0.jar的其他捆绑包。同样只是因为捆绑未启动并不意味着它不会在以后启动。你想要重新实现OSGi解析器。如果要清理存储库,我建议您使用存储库供应商提供的应用程序,如p2中的GC Application。

答案 1 :(得分:2)

想想捆绑...只需要做bundle.getResource(clazz.getName()。replace('。','/')+“。class”)

在重新编译之前,请查看包中:“OSGI-OPT / src /”+ clazz.getName()。replace('。','/')+“。java”,实际源代码可能在那里