2009-09-11 63 views
5

我正在开发一个OSGi捆绑软件,它将服务实现为本地可执行文件的包装。也就是说,该服务使用ProcessBuilder运行可执行文件,为其提供一些数据并检索结果。我的问题是关于打包这个包的最佳方式。本机可执行文件包含大量相关数据文件,这些文件都必须存在于磁盘上供工具运行。我发现在OSGi中处理原生DLL的引用很多,但没有一个解决与必须存在于磁盘上的捆绑软件相关联的文件,而不是仅通过类路径可检索的文件。包含OSGi捆绑包的其他资源

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

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

谢谢!

回答

2

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

您应该这样做是因为OSGi的优势之一就是生命周期管理,它允许您也可以不带痕迹地删除捆绑包和服务。为此,该框架可以追踪包裹所做的一切。如果在卸下已安装并启动它的软件包后保持可执行的运行状态,则连接会丢失,并且可能会一直运行,直到重新启动计算机(通常不是嵌入式系统的选项)。

4

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

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()方法中。

+0

OSGi服务平台核心规范版本4版本4.3提供了['BundleContext.getDataFile(String)'](https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String%29),这可能是合适的。 – 2016-04-20 20:47:43