Osgi 什么';从独立于启动器的包访问文件系统的正确方法是什么?

Osgi 什么';从独立于启动器的包访问文件系统的正确方法是什么?,osgi,Osgi,我有一些资源(日志文件、数据库文件、单独的配置文件等),我希望能够从我的OSGi捆绑包中访问这些资源。到目前为止,我一直使用相对文件路径来访问它们。然而,现在我的相同包在不同的环境中运行(普通的老Felix和Glassfish) 当然,工作目录是不同的,我希望能够使用一种方法,其中目录是已知的和确定的。据我所知,Glassfish的工作目录不应该被假定,也没有被指定(glassfish3/Glassfish/domains/domain1/config) 我可以尝试将这些文件嵌入到包中,但这样它

我有一些资源(日志文件、数据库文件、单独的配置文件等),我希望能够从我的OSGi捆绑包中访问这些资源。到目前为止,我一直使用相对文件路径来访问它们。然而,现在我的相同包在不同的环境中运行(普通的老Felix和Glassfish)

当然,工作目录是不同的,我希望能够使用一种方法,其中目录是已知的和确定的。据我所知,Glassfish的工作目录不应该被假定,也没有被指定(glassfish3/Glassfish/domains/domain1/config)


我可以尝试将这些文件嵌入到包中,但这样它们就不容易访问了。例如,我希望很容易找到日志文件,而不必分解缓存包来访问它。另外,我不知道我能不能给我的H2 JDBC驱动程序一个指向捆绑包中某个内容的URL。

这里有一些选项。第一种方法是使用Configuration Admin服务指定配置目录,以便在必要时可以访问文件

对于日志文件,我建议使用Ops4J Pax日志。它允许您简单地使用slf4j之类的日志API,Pax logging负责日志管理。可以使用log4j配置对其进行配置


我认为你也应该把DB作为一个包来安装。例如,我在较小的项目中经常使用Derby。Derby可以简单地作为一个包启动,然后管理数据库文件本身。我不确定h2是否正确,但我想它也可以起到类似的作用。

一个好方法是将持久性文件存储在当前工作目录(System.getProperty(“user.dir”)或用户主目录(System.getProperty(“user.home”)的子目录中

临时文件和特定于捆绑包的文件应存储在捆绑包的数据区域(BundleContext.getData())中。卸载捆绑包将自动清理。如果不同的捆绑包需要访问相同的文件,请使用服务传递此信息

最后一个选项是非常长寿的至关重要的文件,如主要数据库,应该存储在/var或窗口的等效文件中


一般来说,将文件打包并扩展到适当的位置是一个好主意。这使得管理系统更容易。

请澄清这个问题。严格来说,打包不应该总是期望访问文件系统……它可能部署到没有文件系统的设备上。如果您有aske比那些系统更糟糕的问题,不是吗?数据库和配置文件需要独立于当前用户可读(不同的用户可能会启动应用程序)我猜当前的工作目录不能假设在每次OSGi框架启动时都是相同的??我不是一个真正的Linux专家,不知道在/var中我将把数据放在哪里,也不知道窗口的等价物是什么。是否有某种通用的Java方法来获取这个目录?我很喜欢放置文件的想法需要共享的文件需要一个固定的位置,如/var/myapp。但是,将它们作为捆绑包交付并使用config admin控制此位置和内容通常是一个非常好的主意。