如何外包捆绑包的配置?

时间:2012-04-19 09:43:46

标签: java configuration osgi

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

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

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

是否有一些"最佳做法"我应该知道解决我的简单"问题?

2 个答案:

答案 0 :(得分:6)

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

基本上,您将实施ManagedServiceManagedServiceFactory,而ConfigurationAdmin服务会负责其余工作。

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

以这种方式外部化配置的好处在于,您可以将其与应用程序/环境保持一致 - 这样您的捆绑包就会变得与其环境无关。

答案 1 :(得分:5)

扩展@ earcam的优秀建议,我建议通过Declarative Services和Metatype绑定您的配置。这非常容易,尤其是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。