我有一些资源(日志文件,数据库文件,单独的配置文件等),我希望能够从我的OSGi包中访问。到目前为止,我一直在使用相对文件路径来访问它们。但是,现在我的相同捆绑包在不同的环境中运行(普通的旧Felix和Glassfish)。
当然,工作目录是不同的,我希望能够使用目录已知且具有确定性的方法。据我所知,不应该假设Glassfish的工作目录,也不是规范(目前是glassfish3 / glassfish / domains / domain1 / config)。
我可以尝试将这些文件嵌入到捆绑包中,但随后它们将无法轻松访问。例如,我希望它很容易找到日志文件,而不必爆炸缓存包来访问它。另外,我不知道我可以为我的H2 JDBC驱动程序提供一个URL内容的URL。
答案 0 :(得分:2)
一个好方法是将持久性文件存储在当前工作目录的子目录中(System.getProperty(“user.dir”)或用户主目录(System.getProperty(“user.home”))
临时和特定于bundle的文件应存储在bundle的数据区(BundleContext.getData())中。然后卸载捆绑包将自动清理。如果不同的bundle需要访问相同的文件,请使用服务传递此信息。
最后一个选项实际上是长期存在的重要文件,如主要数据库应存储在/ var或Window的等效文件中。在这些情况下,我会指出Config Admin的位置。
一般来说,最好将文件捆绑在一起并将它们扩展到适当的位置。这使得管理系统变得更容易。
答案 1 :(得分:1)
你有一些选择。第一种方法是使用Configuration Admin服务指定配置目录,以便在必要时访问文件。
对于日志文件,我建议使用Ops4J Pax Logging。它允许您简单地使用像slf4j这样的日志记录API,而Pax Logging会执行日志管理。它可以使用log4j配置进行配置。
我认为您也应该将数据库安装为捆绑包。例如,我在较小的项目中使用Derby很多。 Derby可以简单地作为一个包启动,然后管理数据库文件本身。我不确定h2,但我想它可以起到同样的作用。