ThR*_*R37 1 java configuration osgi
我正在开发一个由几个捆绑包组成的OSGi程序,我有时在我的本地Windows开发计算机上运行,有时在经典的Linux上运行.目前,几个专用于资源连接的捆绑包有自己的配置文件(属性文件),其中包含一些信息,例如访问某些重要文件的路径(存在于两个环境中).
但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,具体取决于我将运行程序的环境.
bundle有没有办法引用外部配置文件?一个解决方案可能是为我只生成一次的每个环境创建一个片段,但是我将无法轻松更改配置文件,因为它将位于片段的jar中.
是否有一些我应该知道的"最佳实践"来解决我的"简单"问题?
看看OSGi的ConfigurationAdmin [1],[2] - 这将完全符合您的需求(并且是OSGi优雅的另一个例子).
基本上,您将实现ManagedService或ManagedServiceFactory,ConfigurationAdmin服务负责其余部分.
与File Install一起使用的Felix实现的默认设置(请参阅Angelo的注释)将扫描配置文件的目录(filename是服务ID和文件后缀.cfg).但是ConfigurationAdmin是可插拔的,因此配置的后端可以是数据库等.
以这种方式外部化配置的好处在于,您可以将其与应用程序/环境保持一致 - 这样您的捆绑包就会变得与其环境无关.
扩展@ 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 ... {
...
}
Run Code Online (Sandbox Code Playgroud)
如果您采用这种方法并使用像Apache Karaf这样的Metatype友好容器,那么您将在管理Web控制台中免费获得自动生成的配置UI.
| 归档时间: |
|
| 查看次数: |
2601 次 |
| 最近记录: |