Java 如何将捆绑包的配置外部化?

Java 如何将捆绑包的配置外部化?,java,configuration,osgi,Java,Configuration,Osgi,我正在开发一个OSGi程序,它由几个捆绑包组成,有时在本地的windows开发人员计算机上运行,有时在经典的linux上运行。 目前,几个专用于资源连接的捆绑包都有自己的配置文件(属性文件),其中包含一些信息,如访问某些重要文件的路径(在两种环境中都存在) 但是,由于两个执行环境中的路径不同,我必须在编译之前手动更改配置,这取决于我将在哪个环境中运行程序 bundle是否有方法引用外部配置文件?一个解决方案是为每个环境创建一个片段,我只生成一次,但是我不能轻易地更改配置文件,因为它将位于片段的j

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

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

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


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

看看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
,非常感谢您的回答!这似乎是我需要的!谢谢你的回答。我只能接受一个答案,但你的建议仍然非常有用。非常感谢你的回答。我只能接受一个答案,但你的建议仍然非常有用。