我目前正在尝试使用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
还有什么需要考虑的问题吗?
答案 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看起来很旧),我认为它应该只是注册一个具有两个特定属性的服务:
这样您的命令就不需要了解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本身。