1

我正在开发一个由几个捆绑包组成的 OSGi 程序,这些捆绑包有时在本地 Windows 开发计算机上运行,​​有时在经典 linux 上运行。目前,一些专用于资源连接的包都有自己的配置文件(属性文件),其中包含一些信息,例如访问一些重要文件的路径(在两种环境中都存在)。

但是,由于两个执行环境的路径不同,我必须在编译前手动更改配置,具体取决于我要在哪个环境中运行我的程序。

捆绑包有没有办法引用外部配置文件?一种解决方案可能是为我只生成一次的每个环境创建一个片段,但我将无法轻松更改配置文件,因为它将位于片段的 jar 中。

是否有一些我应该知道的“最佳实践”来解决我的“简单”问题?

4

2 回答 2

6

看看 OSGi 的 ConfigurationAdmin [1][2] - 这将完全满足您的需求(并且是 OSGi 优雅的另一个示例)。

基本上,您将实现一个ManagedServiceManagedServiceFactory,而 ConfigurationAdmin 服务负责其余的工作。

与文件安装一起使用的Felix 实现的默认设置(参见 Angelo 的评论)将扫描配置文件的目录(文件名是服务 ID 和文件后缀 .cfg)。但是 ConfigurationAdmin 是可插拔的,因此 config 的后端可以是数据库等。

以这种方式将您的配置外部化的好处是您可以将其与应用程序/环境一起保存——因此您的包变得不知道它们的环境。

于 2012-04-19T09:55:05.990 回答
5

扩展@earcam 的出色建议,我建议通过声明式服务和元类型绑定您的配置。它真的很容易,尤其是使用 Felix 注释。下面是一个使用 JAAS 进行身份验证的服务的简化示例,它具有可配置的 JAAS 领域名称。“ConfigurationPolicy.OPTIONAL”是很棒的部分。如果将其设置为 REQUIRE,则在配置之前不会注册服务。

@Component(
        name = "com.example.authprovider",
        label = "Example authentication interceptor",
        description = "Blocks unauthenticated access to REST endpoints",
        specVersion = "1.1",
        metatype = true,
        policy = ConfigurationPolicy.OPTIONAL
)
@Service
@References({
        ...
})
@Properties({
        @Property(name="jaasRealm", value = "default", label="JAAS Realm",
                description = "the JAAS realm to use to find LoginModules to authenticate this login"),
        ...
})
public class Foo implements ... {
    ...
}

如果您采用这种方法并使用像 Apache Karaf 这样的元类型友好容器,那么您将在管理 Web 控制台中免费获得自动生成的配置 UI。

于 2012-04-20T12:32:13.143 回答