【发布时间】:2011-12-10 12:50:48
【问题描述】:
在我的 OSGi 包(一个 Eclipse 插件)中,我可以使用以下方式查询某些路径的类条目:
bundle.findEntries("<class_directory>/<package_name_as_url>/", "*.class", true)
例如,如果我的类在我的包中的bin 目录中,并且我想在包mypackage 中查找所有类,那么我可以将路径写为字符串“/bin/mypackage/” ,产生这个:
bundle.findEntries("/bin/mypackage/", "*.class", true)
但是,当类被打包在我的包内的一个 jar 中时,我没有设法做同样的事情。例如,如果 jar 是文件夹“lib”内的myJar.jar,我如何查询其中的所有类?我尝试了这些替代方案但没有成功:
bundle.findEntries("/lib/myJar.jar!/", "*.class", true)
bundle.findEntries("/lib/myJar.jar/", "*.class", true)
如果使用字符串编写路径不适用于 JAR 中的资源,那么我如何查询我的包中作为给定资源 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) 从URL 获取子条目。这种方法的问题在于,如果您需要查询的资源在 jar 中(如我的例子),Eclipse 会将其复制到您的操作系统中的某个位置。
除了这是您的应用程序的潜在瓶颈之外,FileLocator.findEntries(bundle, path) 将失败,因为该路径不再是包的真实路径,而是操作系统中某处缓存目录的路径。
我很惊讶没有直接的方法来实现这一点。
【问题讨论】:
标签: java eclipse eclipse-plugin osgi