当前位置: 首页 > 知识库问答 >
问题:

Karaf 将其他属性添加到现有配置文件

姚鹤龄
2023-03-14

我有一个包,它使用一个配置文件org.jemz.karaf.tutorial.hello.service.config.cfg具有一个属性:

org.jemz.karaf.tutorial.hello.service.msg="I am a HelloServiceConfig!!"

我使用ConfigAdmin的蓝图如下所示:

<cm:property-placeholder persistent-id="org.jemz.karaf.tutorial.hello.service.config" update-strategy="reload" >
    <cm:default-properties>
        <cm:property name="org.jemz.karaf.tutorial.hello.service.msg" value="Hello World!"/>
</cm:default-properties>
</cm:property-placeholder>



<bean   id="hello-service-config"
        class="org.jemz.karaf.tutorial.hello.service.config.internal.HelloServiceConfig"
        init-method="startup"
        destroy-method="shutdown">

    <property name="helloServiceConfiguration">
        <props>
              <prop key="org.jemz.karaf.tutorial.hello.service.msg" value="${org.jemz.karaf.tutorial.hello.service.msg}"/>
        </props>
    </property>
</bean>

<service ref="hello-service-config" interface="org.jemz.karaf.tutorial.hello.service.IHelloService" />

只要我可以更改属性的值并且包自动更新属性,这就很好。

我想知道是否有任何方法可以在不更改蓝图的情况下将新属性添加到我的配置文件中(这涉及再次编译/打包)。当然,我的包应该准备好处理新属性。

不确定这在OSGi是否有意义。谁能给我一点提示,告诉我如何向现有配置文件动态添加新属性,并使它们在ConfigAdmin中可用?

共有2个答案

夏学名
2023-03-14

@yodamad向我展示了我的ConfigurationAdmin服务中正在更新属性,但不幸的是,我的bundel没有收到新属性,因为在bean定义中我只是使用了一个固定属性。

最后,为了从配置文件中获取新属性,我将蓝图定义更改如下:

<cm:property-placeholder persistent-id="org.jemz.karaf.tutorial.hello.service.config" update-strategy="reload" >
</cm:property-placeholder>

<bean   id="hello-service-config"
        class="org.jemz.karaf.tutorial.hello.service.config.internal.HelloServiceConfig"
        init-method="startup"
        destroy-method="shutdown">
</bean>

<service ref="hello-service-config" interface="org.jemz.karaf.tutorial.hello.service.IHelloService" />


<reference id="hello-service-config-admin" interface="org.osgi.service.cm.ConfigurationAdmin"
           availability="optional">
    <reference-listener bind-method="setConfigAdmin"
                        unbind-method="unsetConfigAdmin">
        <ref component-id="hello-service-config"/>
    </reference-listener>
</reference>

我有一个对ConfigurationAdmin服务的引用,所以现在我可以检查我的包的所有属性,如下所示:

public void setConfigAdmin(ConfigurationAdmin cfgAdmin) {
    this.cfgAdmin = cfgAdmin;
    try {
        Configuration cfg =   cfgAdmin.getConfiguration("org.jemz.karaf.tutorial.hello.service.config");
        Dictionary<String, Object> properties = cfg.getProperties();
        Enumeration<String> en = properties.keys();
        while(en.hasMoreElements()) {
            String key = en.nextElement();

            System.out.println("KEY: " + key + " VAL: " + properties.get(key));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

由于我的“更新策略”正在重新加载,因此每当注册新的 ConfigurationAdmin 服务时,我都可以获得更新。

欢迎对我的方法发表任何评论!

贺博厚
2023-03-14

您可以在karaf shell中添加属性:

1/配置:编辑org.jemz.karaf.tutorial.hello.service.config

2/ 配置:propset

3/最后<code>配置:更新

如果您想以编程方式执行,请检查karaf源代码以查看实现

 类似资料:
  • 有没有办法通过添加额外的属性源来覆盖Spring Boot的PropertySourcesPropertyResolver并扩展Externalize配置? 我试图做的是在当前列表中添加另一个属性源,并能够使用当前机制覆盖此属性。为了扩展PropertySourcesPropertyResolver,因此当Spring映射用@ConfigurationProperties注释的类的属性并请求密钥时

  • 我们正在使用带有支持git存储库的Spring云配置服务器来为测试配置文件提供属性。我们收到了将密钥移动到vault(hashicorp)并像往常一样在属性文件中保留常规属性的要求。 在拥有vault之前,我们通过系统属性(使用)传递密钥,该属性作为常规属性源加载,应用程序按预期工作。 现在我必须有一个复合属性源来同时从属性文件和vault中获取。我不确定如何同时从vault和git中提取属性并将

  • 我正在努力定制从OIM到OUD服务器作为目标资源的身份配置。 我已经能够使用默认属性执行配置,用户身份创建成功,并且能够在Spring web应用程序中使用它进行身份验证。现在我想添加基于用户位置的授权。用户的位置在OIM,所以我想将其提供给LDAP服务器,以避免手动编辑每个身份。 我已经搜索了很多,但我无法向预配过程添加其他属性,到目前为止,我只是修改了 OIM 中的协调和预配查找,但这还不够,

  • 问题内容: 我有两个实体,消息和用户。用户与消息有一个ManyToMany关系(一个用户可以有多个消息),而消息(现在,为了使其不那么复杂)与用户有一个ManyToMany关系(可以将一条消息发送给多个用户)。 我正在使用@JoinTable加入这两个实体,但是,我想在连接表中添加一个“状态”列,以告知该消息是否是新消息,已读消息等。我当时正在考虑将该列放入Message实体中,但是,我认为这可能

  • 问题内容: 如何控制转盘中包含哪些文件?似乎没有被使用。 更新 : 我错了从源tarball安装与安装轮子之间的区别。源代码发行版包含中指定的文件,但已安装的软件包仅包含python文件。无论是通过源分发版,egg还是wheel安装,都需要采取步骤来确定应安装的其他文件。即,其他软件包文件需要package_data,而软件包外部文件(例如命令行脚本或系统配置文件)需要data_files。 原始

  • 我想将部署在karaf中的所有包的配置文件放在karaf 文件夹中。我希望当捆绑包配置文件改变时,karaf能够注意到。 我有一个包含几个特性的发行版,一个XML特性的例子。我已经尝试了几件事,例如,我将配置文件添加到如下功能中,但这不起作用。 我尝试过的一些事情: http://karaf.922171.n3.nabble.com/OSGi-bundle-configuration-file-t