使用iPOJO注释自定义Felix命令

时间:2012-03-06 16:59:45

标签: annotations osgi apache-felix

我目前正在尝试使用iPOJO为Felix实现自定义shell命令。我的示例实现如下:

import java.io.PrintStream;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.shell.Command;

@Component(immediate = true)
@Provides
public class SampleCommand implements Command {


    @Override
    public String getName() {
        return "testcmd";
    }

    @Override
    public String getUsage() {
        return "testcmd";
    }

    @Override
    public String getShortDescription() {
        return "test command";
    }

    @Override
    public void execute(String line, PrintStream out, PrintStream err) {
        out.println("execute testcmd!");
    }

}

当我在Felix上部署Bundle时,我的SampleCommand被实例化并且getName()被调用。但是当我尝试在shell上执行“testcmd”时,我得到:

gogo: CommandNotFoundException: Command not found: testcmd

还有什么需要考虑的问题吗?

3 个答案:

答案 0 :(得分:8)

根据user1231484和earcam上面给出的反馈,这里是一个最小的工作示例:

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.service.command.Descriptor;

@Component(immediate = true)
@Instantiate
@Provides(specifications = ListComponentsCommand.class)
public class ListComponentsCommand {

    @ServiceProperty(name = "osgi.command.scope", value = "test")
    String scope;

    @ServiceProperty(name = "osgi.command.function", value = "{}")
    String[] function = new String[] { "test" };

    @Descriptor("test")
    public void test() {
        System.out.println("test!");
    }

}

答案 1 :(得分:5)

我不确定你是否需要再继承Command {this page看起来很旧),我认为它应该只是注册一个具有两个特定属性的服务:

  1. 范围“osgi.command.scope”属性(基本上提供命名空间,以防您的命令名称与另一个提供的命令名称相同。
  2. 字符串数组“osgi.command.function”,其方法名称作为命令
  3. 这样您的命令就不需要了解OSGi的任何信息。您以通常的方式使用打印流(这些由shell重定向)

    E.g。

    @ServiceProperty(name = "osgi.command.scope", value = "mycommands")
    @ServiceProperty(name = "osgi.command.function", value = {"execute", "add"})
    @Component(immediate = true)
    @Provides
    public class SampleCommand implements MyOwnCommand {
    
        @Override
        public void execute(String line) {
            System.out.println("execute testcmd! with line: " + line);
        }
    
        @Override
        public void add(int a, int b) {
            System.out.println(a + "+" + b + "=" + (a+b));
        }
    
    }
    

    您为此付出的唯一代价是失去了帮助和使用功能。

答案 2 :(得分:2)

您正在为Felix Shell(旧版)开发一个命令。然而,很久以来Felix现在使用Gogo(实施OSGi标准)。因此,您应该检查http://felix.apache.org/site/rfc-147-overview.html以提供新命令。

此外,您可以查看the iPOJO Arch command for Gogo。它使用iPOJO本身。