【问题标题】:Querying jar entries in an Eclipse plugin在 Eclipse 插件中查询 jar 条目
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 感谢@BJ 的回答。我试过了,但我仍然需要在 listResources 方法中提供一个路径,而且我遇到的问题与我原来的问题相同:如何查找仅包含在特定 Jar 中的条目(资源)。
    • 为什么你只需要查看 Bundle-ClassPath 上特定 JAR 中的条目?看来您真的只想知道所有 *.class 资源,按顺序,沿着完整的 Bundle-ClassPath 而不考虑它们来自哪个 Bundle-ClassPath 条目。
    • 嗨@BJ,我试图从谷歌扩展反射框架,以便在依赖于外部 jar 库的 Eclipse 插件中使用时使其工作。长话短说:对于这个任务,我需要为符合我的 Bundle 的不同 jar 创建一种目录结构。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2014-04-17
    • 2012-01-13
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多