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

如何将包配置/属性文件放在/etc karaf文件夹中

柯天宇
2023-03-14

我想将部署在karaf中的所有包的配置文件放在karaf etc文件夹中。我希望当捆绑包配置文件改变时,karaf能够注意到。

我有一个包含几个特性的发行版,一个XML特性的例子。我已经尝试了几件事,例如,我将配置文件添加到如下功能中,但这不起作用。

<feature name="gc-backbone-mqtt" version="${linksmart.gc.version}">
    <feature version="${linksmart.gc.version}">gc-backbone-router</feature>
    <bundle>mvn:org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.0.0</bundle>
    <feature version="${linksmart.gc.version}">gc-type-tunnelled</feature>
    <configfile finalname="/etc/mqttBackboneProtocol.cfg">mvn:eu.linksmart.gc/backbone.mqtt.impl/${linksmart.gc.version}/mqttprotocol.properties</configfile>
    <bundle>mvn:eu.linksmart.gc/backbone.mqtt.impl/${linksmart.gc.version}</bundle>
</feature>

我尝试过的一些事情:

http://karaf.922171.n3.nabble.com/OSGi-bundle-configuration-file-td4025438.html

教程第2部分-使用配置管理服务

我不想复制带有如下所示特定路径的文件:

有人知道怎么做吗?

更新

为了实现配置文件部署etc文件夹中,以便可以在外部重新配置捆绑包,我分3步完成:

构建配置文件:(工作)

为了使配置文件可由Maven寻址,我在bundle pom中添加了以下部分。通过这种方式,配置文件被部署在存储库上:

啪.xml

 <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-artifacts</id>
                        <phase>package</phase>
                        <goals>
                            <goal>attach-artifact</goal>
                        </goals>
                        <configuration>
                            <artifacts>
                                <artifact>
                                    <file>src/main/resources/mqttprotocol.properties</file>
                                    <type>cfg</type>
                                    <classifier>configuration</classifier>
                                </artifact>
                            </artifacts>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

将文件部署在karaf etc (Works)中

要在karafetc文件夹中部署配置文件,我添加了

特点.xml

    <feature name="gc-backbone-mqtt" version="${linksmart.gc.version}">
        <feature version="${linksmart.gc.version}">gc-backbone-router</feature>
        <bundle>mvn:org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.0.0</bundle>
        <bundle>mvn:org.apache.felix/org.apache.felix.fileinstall/3.2.8</bundle>
        <configfile finalname="/etc/MQTTBackboneProtocol.cfg">mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}/cfg/configuration</configfile>
        <feature version="${linksmart.gc.version}">gc-type-tunnelled</feature>          <bundle>mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}</bundle>
    </feature>

捕获配置更改:(不工作)

为了捕获配置文件的更改,我添加了您建议的代码(@Donald_W)。问题是,我只收到文件在文件夹部署上的通知,但不在。我调试此代码,我发现对于 etc中的文件,专门称为这些文件的“侦听器”。我不知道我怎么能成为部署在中的文件的监听者


共有2个答案

夏谦
2023-03-14

找到了。

正如我在更新中提到的,第1步(使用maven构建配置文件)和第2步(部署配置文件<code>etc<code>)正在工作,但捆绑包和配置文件没有连接。显然,原因是配置文件安装时使用了另一个PID作为正在向其注册的服务。为了解决这个问题,我将<code>ManageService

 Hashtable <String, Object> properties = new Hashtable<String, Object>();
 properties.put(Constants.SERVICE_PID, "MQTTBackboneProtocol");
 context.registerService (ManagedService.class.getName(),this , properties);

其中,这是实现 ManageService 的类,并且 PID 必须与 etc 中部署的配置相同,在这种情况下,由于功能定义“MQTTBackboneProtocol”将配置文件指示为:

<configfile finalname="/etc/MQTTBackboneProtocol.cfg">mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}/cfg/configuration</configfile>
侯英达
2023-03-14
匿名用户

您可以使用内置在Karaf中的Felix文件安装程序,当文件在<code>etc</code>下更改时,它会给您回调。

一旦您将实现<code>ArtifictInstaller

<dependency>
    <groupId>org.apache.felix</groupId>
    <artifactId>org.apache.felix.fileinstall</artifactId>
    <version>3.4.2</version>
    <scope>provided</scope>
</dependency>

示例代码(使用iPojo,但Blueprint/DS也可以工作)如下:

package com.example.deployer.internal;

import org.apache.felix.fileinstall.ArtifactInstaller;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Instantiate()
@Component(name = "propsDeployer")
@Provides(specifications = ArtifactInstaller.class)
public class PropsDeployer implements ArtifactInstaller {
    Logger logger = LoggerFactory.getLogger(JsonDeployer.class);

    @Override
    public void install(File artifact) throws Exception {
        logOutput("Installing",artifact);
    }

    @Override
    public void update(File artifact) throws Exception {
        logOutput("Updating",artifact);
    }

    @Override
    public void uninstall(File artifact) throws Exception {
        logger.info("Uninstalling artifact: {}", artifact.getName());
    }

    @Override
    public boolean canHandle(File artifact) {
        return artifact.getName().endsWith(".props");
    }

    private void logOutput(String action, File artifact) throws IOException {
        logger.info(action + " artifact: {}", artifact.getName());
        Properties props = new Properties();
        FileReader in = null;
        try {
            in = new FileReader(artifact.getCanonicalFile());
            props.load(in);
        } finally {
            if (in != null) {
                in.close();
            }
        }

        // Do whatever you want here:

        for(Object key: props.keySet()) {
            logger.info(action + " Property received: {} {}",key,props.get(key));
        }
    }
}

应该给你这样的输出:

2015-04-27 20:16:53,726 | INFO  | ime/karaf/deploy | PropsDeployer                     | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating artifact: my.json
2015-04-27 20:16:53,728 | INFO  | ime/karaf/deploy | PropsDeployer                     | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating Property received: myprop myval
2015-04-27 20:16:53,728 | INFO  | ime/karaf/deploy | PropsDeployer                     | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating Property received: hello world

您将需要一个唯一的文件扩展名。.cfg将被您说不想使用的 ConfigurationAdmin 服务捕获。

.props这样的东西(如上所述)可以做到这一点。

作为题外话,你真的应该看看如何使用< code>ConfigurationAdmin。它非常强大。karaf内置了管理配置的命令,您所做的任何更改都将保存到< code >中。cfg文件。

 类似资料:
  • > “在”webinf“标记中包括name=”${war.dir}/groupquoteui.properties“,但它不起作用。 标记中还包含=“${war.dir}/groupquoteui.properties”。 还有这个在“webinf”文件夹里: 那么我应该做些什么来将这个文件包含到WAR的WEB-INF目录中。包括所有其他目录和web.xml文件。

  • Section " SetFileAttributes" SetFileAttributes "C:\demo" HIDDEN ;设置文件夹属性为隐藏 SetFileAttributes "C:\demo\demo.txt" HIDDEN|READONLY ;设置文件属性为隐藏,只读 SetFileAttributes "C:\demo\demo.txt" NORMAL ;恢复

  • 问题内容: 有点卡在这里。我有一个带有3个配置文件的pom。Theese配置文件具有不同的版本名称。我要在构建特定配置文件时将该版本名称注入属性文件。 我的个人资料: 和filter.properties看起来像这样: 怎么做?我通过命令构建项目: 问题答案: 您需要做的是在POM文件的部分中添加一个新部分。 像这样: 这将在指定文件的指定文件夹()内部查找,并在遇到定义的变量时更改文件。 因此,

  • 问题内容: 我正在使用Eclipse构建Java项目,该项目是使用Maven构建的。我使用的是旧项目中的一些再生代码,这些类之一在JAR文件夹中查找具有特定名称的文件,然后解析该文件的文本。在此特定示例中,它将查找具有Java接口名称的文件,然后从文件内部获取实现的类名称。 因此,基本上我想做的是 在JAR的“ META-INF / services”文件夹中包含一个文件名(X)和一行文本(Y)的

  • 我正在Eclipse中处理一个Java项目,该项目是使用Maven构建的。我使用的是一个旧项目中回收的代码,其中一个类在JAR的文件夹中查找具有特定名称的文件,然后解析该文件的文本。在这个特定的例子中,它查找一个名为Java接口的文件,然后从文件中获取实现的类名。 所以基本上,我要做的是在JAR的“META-INF/services”文件夹中包含一个文件,文件名为(X),一行文本为(Y)。我猜这应

  • 我对Springs@Configuration和@Conditional annotation是新手。我在问自己,在我的maven文件夹结构中,这些配置java文件应该放在哪里。 到目前为止,我将所有配置xml文件放入src/main|test/Resources/但是使用这种新方法,不再有xml文件。 谢啦