在我的 OSGi 包(一个 Eclipse 插件)中,我可以使用以下方法查询某些路径的类条目:
bundle.findEntries("<class_directory>/<package_name_as_url>/", "*.class", true)
例如,如果我的类(class)位于 bin
我的包中的目录,我想找到包 mypackage
中的所有类,然后我可以将路径写为字符串“/bin/mypackage/”,生成:
bundle.findEntries("/bin/mypackage/", "*.class", true)
但是,当这些类打包在我的包内的 jar 中时,我没有设法执行相同的操作。例如,如果 jar 是 myJar.jar
在文件夹“lib”内,我如何查询其中的所有类?我尝试了这些替代方案,但没有成功:
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)
从 URL 获取子条目。这种方法的问题在于,显然如果您需要查询的资源位于 jar 内(如我的情况),Eclipse 会将其复制到操作系统中的某个位置。
除此之外,这也是您的应用程序的潜在瓶颈,FileLocator.findEntries(bundle, path)
如果该路径不再是 bundle 的真实路径,而是操作系统中某处缓存目录的路径,则会失败。
令我惊讶的是没有直接的方法来实现这一点。
最佳答案
更好的解决方案是使用新的 BundleWiring.listResources
方法。此方法将在包类路径(包括 jar 文件)中搜索 .class
文件等资源。
关于java - 查询 Eclipse 插件中的 jar 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456617/