如何在OSGI Declarative Services Annotations中使用java属性文件

时间:2016-09-09 02:26:21

标签: java properties annotations osgi declarative-services

我试图使用bndtools来创建我的OSGI程序。这是我之前的代码,它可以与felix控制台一起使用。

package com.buaa.ate.service.data.command;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.apache.felix.service.command.CommandProcessor;
import com.buaa.ate.service.api.data.Publisher;

@Component(
        service=PublishCommand.class,
        property={
                CommandProcessor.COMMAND_SCOPE + ":String=example",
                CommandProcessor.COMMAND_FUNCTION + ":String=publish",  
        }
)
public class PublishCommand {

    private Publisher publishSvc;
    @Reference
    public void setPublisher(Publisher publishSvc) {
        this.publishSvc = publishSvc;
    }
    public void publish(String content) {
        publishSvc.start();
        long result = publishSvc.publish(content);
        System.out.println(result);
        publishSvc.stop();
    }
}

现在,我想更改这样的注释:

package com.buaa.ate.service.data.command;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.apache.felix.service.command.CommandProcessor;
import com.buaa.ate.service.api.data.Publisher;

@Component(
        service=PublishCommand.class,
        properties="com/buaa/ate/service/data/command/config.properties"
)
public class PublishCommand {

    private Publisher publishSvc;
    @Reference
    public void setPublisher(Publisher publishSvc) {
        this.publishSvc = publishSvc;
    }
    public void publish(String content) {
        publishSvc.start();
        long result = publishSvc.publish(content);
        System.out.println(result);
        publishSvc.stop();
    }
}

这是我的属性文件: config.properties

它的内容是这样的:

osgi.command.scope\:String:example
osgi.command.function\:String:publish

当我运行程序时,输入命令'发布内容',然后问题发生:

'gogo: CommandNotFoundException: Command not found: publish'

那么,我该怎么办才能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

好吧,我只是意识到修复这个问题很容易。这是osgi javadoc的一部分:

  

属性

     

public abstract java.lang.String [] property

     

此组件的属性。   每个属性字符串都指定为“key = value”。属性值的类型可以在键中指定为键:type = value。该类型必须是组件描述的属性元素的type属性支持的属性类型之一。

     

要指定具有多个值的属性,请使用多个键值对。例如,“foo = bar”,“foo = baz”。

     

参见:   “组件描述的属性元素。”

     

默认:{}

所以我将'type'属性添加到config.properties,然后代码可以正常工作。这是当前的属性文件: current properties file

它的内容是这样的:

Iterator<E> it = keys.iterator();

该计划现在可以很好地运作。