【问题标题】:How can I obtain the installation directory (absolute path) of an OSGi bundle by its name?如何通过名称获取 OSGi 包的安装目录(绝对路径)?
【发布时间】:2016-01-25 22:27:22
【问题描述】:

是否可以在运行时通过其名称以特定 OSGi 包的绝对路径形式获取安装目录?如果是,怎么做?

E. G。我有一个符号名称为com.example.e4.rcp.todo.service 的捆绑包。从不同包中但在同一个应用程序中的类,我想在运行时确定com.example.e4.rcp.todo.service 的绝对安装路径。

我不知道这是否相关,但我正在使用 Eclipse Equinox。

【问题讨论】:

  • 你的“包的安装目录”是什么?
  • 这真的只是 OSGi 还是 Eclipse RCP 或插件? Eclipse 有在其他包中查找对象的方法。
  • 你能解释一下你的意思以及你想用它做什么吗?在 OSGi 中,没有安装目录。每个捆绑包最多有一个目录用于该捆绑包的便签本。您可以通过bundle.getBundleContext().getDataFile(path) 获得。

标签: java eclipse osgi equinox


【解决方案1】:

没有可靠的方法来获取此信息,因为 OSGi 包不需要有“安装目录”。

例如,如果我以下列方式安装一个包,那么与文件系统有任何连接的包将没有任何关联:

context.installBundle("urn:mybundle", new URL("http://...").openStream());

【讨论】:

    【解决方案2】:

    如果你想存储bundle拥有的一些数据,你应该使用BundleContext.getDataFile(String)

    【讨论】:

      【解决方案3】:

      Eclipse Equinox 具有 FileLocator 帮助器类,可用于解析 Equinox 中的资源。

      http://help.eclipse.org/juno/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/FileLocator.html

      具体来说,FileLocator#resolve 可能会帮助您。然而:

      但请注意,此 API 的用户不应过多地假设此方法的结果。虽然它可能会在某些安装配置中始终返回 file: URL,但其他配置可能会导致 jar: 或 http: URL。

      如果您无法完全控制配置,我会谨慎地过度依赖它。

      【讨论】:

        【解决方案4】:

        在 Equinox OSGi 中,您可以使用 FileLocator.getBundleFile(...)

        File bundleFile = FileLocator.getBundleFile(bundle).getCanonicalFile();
        

        它返回 Bundle Jar 文件的 File 对象或 Bundle 目录,具体取决于捆绑包的安装方式(像在 Eclipse 插件中一样打包或解包)。

        我在末尾添加了getCanonicalFile(),因为我经常遇到像/workspace/project_xyz/bin/../ 这样的相对路径元素。

        【讨论】:

          猜你喜欢
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多