java - 查询 Eclipse 插件中的 jar 条目

标签 java eclipse eclipse-plugin osgi

在我的 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/

相关文章:

java - 使用带有 spring 的 import.sql 将图像存储为 byte[]

java - 如何标记已弃用的 API 中使用的 Java 私有(private)方法

java - 将变量放入 Java 模式中

eclipse - Maven 的 Groovy Eclipse 编译器插件不编译任何内容

java - Eclipse 直到运行时才报告错误

android - 已升级到 SDK 版本 17,现在库无法正确链接

java - Spring Reactor 合并与 Concat

java - 谷歌眼镜中的 Hello World

命令行中的 java.lang.NoClassDefFoundError

java - 如何在 Eclipse 中显示项目/包中的所有接口(interface)?