查询Eclipse插件中的jar条目

时间:2011-12-10 12:50:48

标签: java eclipse eclipse-plugin osgi

在我的OSGi包(eclipse插件)中,我可以使用以下内容查询某些路径上的类条目:

bundle.findEntries("<class_directory>/<package_name_as_url>/", "*.class", true)

例如,如果我的类位于我的包中的bin目录中,并且我想查找包mypackage中的所有类,那么我可以将该路径写为字符串“/ bin / mypackage /“,产生这个:

bundle.findEntries("/bin/mypackage/", "*.class", true)

但是,当我的包中的jar打包时,我还没有设法做同样的事情。例如,如果文件夹'lib'中的jar是myJar.jar,我如何查询其中的所有类?我尝试了这些替代方案但没有取得任何成功:

bundle.findEntries("/lib/myJar.jar!/", "*.class", true)
bundle.findEntries("/lib/myJar.jar/", "*.class", true)

如果使用字符串来编写路径不适用于JAR中的资源,那么我如何查询我的bundle中作为给定资源URL的子项的条目,而不是使用像“/ bin / mypackage /”这样的普通字符串“或”/lib/myJar.jar!/“如上例所示? (这样的URL指向我需要查询的JAR)。

我知道我可以使用:

JarFile jarFile = (JarFile) resolvedURL.getContent();

然后

jarFile.entries()

获取Jar中的条目,但我对这个解决方案不满意,因为:1)我想找到一种通用的方法来独立地询问捆绑资源,如果它们在JAR中或不是(不是有趣的污染用if条件的代码)。 2)使用该解决方案,我无法使用模式自动过滤资源,例如“* .class”。

提前感谢您的任何帮助或反馈!

更新

显然没有一种简单/有效的方法可以做到这一点(!) - 虽然我很想对此做错 - 。我在这里找到了关于如何在IPath中转换URL的讨论:

http://www.eclipse.org/forums/index.php/mv/tree/88506/#page_top

(在他们建议使用Platform.asLocalURL().getPath()的讨论中,现在恰好被弃用了,我尝试使用等效的FileLocator.toFileURL().getPath

获得IPath后,您可以使用FileLocator.findEntries(bundle, path)从网址获取子条目。这种方法的问题在于,如果您需要查询的资源位于jar内(如我的情况),Eclipse会将其复制到您的操作系统中的某个位置。 除了这是您的应用程序的潜在瓶颈之外,FileLocator.findEntries(bundle, path)将失败,因为该路径不再是捆绑包的真实路径,而是操作系统中某处的缓存目录的路径。

我很惊讶没有直接的方法来实现这一点。

1 个答案:

答案 0 :(得分:2)

更好的解决方案是使用新的BundleWiring.listResources方法。此方法将搜索包类路径,包括jar文件,以获取.class文件等资源。