Java 如何将捆绑包的配置外部化?
我正在开发一个OSGi程序,它由几个捆绑包组成,有时在本地的windows开发人员计算机上运行,有时在经典的linux上运行。 目前,几个专用于资源连接的捆绑包都有自己的配置文件(属性文件),其中包含一些信息,如访问某些重要文件的路径(在两种环境中都存在) 但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,这取决于我将在哪个环境中运行程序 bundle是否有方法引用外部配置文件?一个解决方案是为每个环境创建一个片段,我只生成一次,但是我不能轻易地更改配置文件,因为它将位于片段的jar中Java 如何将捆绑包的配置外部化?,java,configuration,osgi,Java,Configuration,Osgi,我正在开发一个OSGi程序,它由几个捆绑包组成,有时在本地的windows开发人员计算机上运行,有时在经典的linux上运行。 目前,几个专用于资源连接的捆绑包都有自己的配置文件(属性文件),其中包含一些信息,如访问某些重要文件的路径(在两种环境中都存在) 但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,这取决于我将在哪个环境中运行程序 bundle是否有方法引用外部配置文件?一个解决方案是为每个环境创建一个片段,我只生成一次,但是我不能轻易地更改配置文件,因为它将位于片段的j
有一些我应该知道的“最佳实践”来解决我的“简单”问题吗?看看OSGi的ConfigurationAdmin,-这将完全满足您的需要(这是OSGi优雅的另一个例子) 基本上,您将实现一个or,其余部分由ConfigurationAdmin服务负责 与文件安装配合使用的默认设置(请参阅Angelo的注释)将扫描配置文件目录(文件名为服务ID和文件后缀.cfg)。但是ConfigurationAdmin是可插入的,因此config的后端可以是数据库等
以这种方式将配置外部化的好处是,您可以将其与应用程序/环境一起保存,这样您的捆绑包就不知道其环境了。看看OSGi的ConfigurationAdmin,-这将完全满足您的需要(这也是OSGi优雅的另一个例子) 基本上,您将实现一个or,其余部分由ConfigurationAdmin服务负责 与文件安装配合使用的默认设置(请参阅Angelo的注释)将扫描配置文件目录(文件名为服务ID和文件后缀.cfg)。但是ConfigurationAdmin是可插入的,因此config的后端可以是数据库等
以这种方式将配置外部化的好处是,您可以将其与应用程序/环境一起保存,这样您的包就不知道它们的环境了。根据@earcam的优秀建议,我建议通过声明性服务和元类型绑定您的配置。这使它变得非常简单,特别是使用Felix注释。下面是一个使用JAAS进行身份验证的服务的简化示例,它有一个可配置的JAAS领域名称。“ConfigurationPolicy.OPTIONAL”是最棒的部分。如果将其设置为“需要”,则在配置服务之前不会注册该服务
@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。扩展@earcam的优秀建议,我建议通过声明性服务和元类型绑定您的配置。这使它变得非常简单,特别是使用Felix注释。下面是一个使用JAAS进行身份验证的服务的简化示例,它有一个可配置的JAAS领域名称。“ConfigurationPolicy.OPTIONAL”是最棒的部分。如果将其设置为“需要”,则在配置服务之前不会注册该服务
@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。OSGi没有特定的功能,但这是任何应用程序、OSGi或其他应用程序都要考虑的问题,有很多最佳实践。一个是Java Preferences API,另一个是相对于当前工作目录访问的普通属性文件。OSGi没有特定的内容,但这是任何应用程序、OSGi或其他应用程序都要考虑的问题,有很多最佳实践。一个是Java Preferences API,另一个是相对于当前工作目录访问的普通属性文件;这不是它应该做的一部分。要获得此行为,请使用File Install()(可以与任何其他配置管理实现一起使用)。@AngelovanderSijpt-编辑的答案更正此问题,我认为您只需要提供
felix.cm.dir
,非常感谢您的回答!这似乎是我需要的!您提到的Felix实现没有从目录中获取配置;这不是它应该做的一部分。要获得此行为,请使用File Install()(可以与任何其他配置管理实现一起使用)。@AngelovanderSijpt-编辑的答案更正此问题,我认为您只需要提供felix.cm.dir
,非常感谢您的回答!这似乎是我需要的!谢谢你的回答。我只能接受一个答案,但你的建议仍然非常有用。非常感谢你的回答。我只能接受一个答案,但你的建议仍然非常有用。