5

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

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

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

谢谢!

4

2 回答 2

4

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

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

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

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

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

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

如果要查找捆绑包中特定文件的路径,可以执行以下操作:

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

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

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

于 2009-09-15T11:44:33.853 回答
2

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

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

于 2009-09-13T08:38:30.360 回答