【问题标题】:Including additional resources with OSGi bundles在 OSGi 包中包含其他资源
【发布时间】:2010-11-27 13:30:49
【问题描述】:

我正在开发一个 OSGi 包,该包将服务实现为原生可执行文件的包装器。也就是说,该服务使用ProcessBuilder 运行可执行文件,向其提供一些数据,然后检索结果。我的问题是关于打包这个捆绑包的最佳方式。本机可执行文件包括许多相关数据文件,所有这些文件都必须存在于磁盘上,工具才能运行。我找到了很多关于在 OSGi 中处理本机 DLL 的参考资料,但没有一个解决与必须存在于磁盘上的包相关联的文件,而不仅仅是可通过类路径检索。

我在想我可以将可执行文件和依赖文件直接包含在包存档中,然后在包启动时以编程方式提取到某个目录。我能想到的另一个选择是将可执行文件放在某个地方并设置一个指向它的系统属性或其他东西,但我想将配置保持在最低限度。

不特定于特定 OSGi 实现的解决方案会很好,但如果不是,我正在使用 Equinox。

谢谢!

【问题讨论】:

    标签: java osgi equinox


    【解决方案1】:

    这些附加文件是否需要可由本机代码写入?如果没有,没有什么能阻止您将任何您喜欢的文件放入包中。

    您在 OSGi 中遇到的常见问题是确定文件的路径,因为 OSGi 不假定文件系统可用(这并不像 OSGi 在嵌入式设备中开始时听起来那么奇怪)。

    您如何控制本机代码查找其相关文件的位置?你需要给它一个路径吗?

    如果你想要一个目录来复制或解压东西,那么使用:

    org.eclipse.core.runtime.Platform.getStateLocation()
    

    这为您提供了捆绑包的工作目录。

    如果你想在你的包中找到一个特定文件的路径,你可以这样做:

    org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt")))
    

    在这种情况下,它将返回一个文件 URL,指向当前包中的 /etc/readme.txt

    这两段代码都假定它们在激活器的start() 方法中。

    【讨论】:

    【解决方案2】:

    您的解决方案当然有效。但是您还必须小心停止和删除您在安装期间提取和启动的任何资源。如果可执行文件还创建了任何类型的工作文件,这可能特别难以跟踪。

    您应该这样做,因为 OSGi 的优势之一是生命周期管理,它还允许您在不留痕迹的情况下删除包和服务。为此,框架会跟踪捆绑包所做的一切。如果您在删除安装并启动它的捆绑包后保持可执行文件运行,则连接将丢失并且它可能会继续运行,直到机器重新启动(通常不是嵌入式系统的选项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2015-10-14
      • 2011-11-25
      • 2012-07-30
      • 2011-01-29
      • 2011-06-04
      • 1970-01-01
      相关资源
      最近更新 更多