如何在OSGI中的Activator类中使用Eclipse接口命令提供程序

时间:2014-05-24 18:31:37

标签: java eclipse osgi osgi-bundle

我是Eclipse接口命令提供程序的新代码。我在网站上看到了一个例子

public void _say(CommandInterpreter ci) {
    ci.print("You said:" + ci.nextArgument());
}

@Override
public String getHelp() {
    return "\tsay - repeats what you say\n";
}

它用于将命令作为String并再次打印。

现在这是执行命令的另一个

String command = intcp.nextArgument();
if (command != null) {
    intcp.execute(command);
}

为什么我们使用这种execute(command)方法?以及如何使用它?它有什么例子吗?

2 个答案:

答案 0 :(得分:5)

OSGI控制台主要用于调试OSGI应用程序。实现计算器并不是一种非常方便的方法。普通的控制台应用程序会更好。无论如何,这是熟悉API的好方法。

首先,创建一个实现CommandProvider的类:

public class Calculator implements CommandProvider {

    // add prints sum of its two arguments
    public void _add(CommandInterpreter ci) {
        int a = Integer.parseInt(ci.nextArgument());
        int b = Integer.parseInt(ci.nextArgument());
        ci.println(a+b);
    }

    // quit just calls "exit"
    public void _quit(CommandInterpreter ci) {
        ci.execute("exit");
    }

    @Override
    public String getHelp() {
        return "";
    }

}

您需要在捆绑包的激活器中注册它:

public class Activator implements BundleActivator {

    public void start(BundleContext bundleContext) throws Exception {
        bundleContext.registerService(CommandProvider.class.getName(),
                new Calculator(), null);
    }

    @Override
    public void stop(BundleContext context) throws Exception {
    }
}

要实际使用这些命令,您需要使用-console命令行参数启动RCP应用程序。如果您的软件包是懒惰加载的,则需要在命令可用之前启动它:

osgi> start com.example.mybundle
osgi> add 2 2
4
osgi> quit
Really want to stop Equinox? (y/n; default=y)  y

答案 1 :(得分:0)

我想提供另一种(更好的恕我直言)方式来编写自己的命令。实现CommandProvider接口不是一个很好的方法,因为它只适用于Equinox。最好按照RFC 147中的描述去做(尽管我知道它尚未发布但无关紧要,已经描述了实现命令提供程序的方法)。

您只需要提供两个属性的OSGi服务:

  • osgi.command.scope
  • osgi.command.function

在服务类中,您可以编写通过命令调用的公共方法。这是一个简单的例子:

public final class MyCommandProvider {

    public void doAction(String id) {
        System.out.println("id=" + id);
    }

    public void doAnotherAction() {
        System.out.println("Another action");
    }
}

现在您可以注册此服务(以您想要的任何方式,例如使用Declarative Services),然后您将在OSGi控制台中编写两个命令:doAction('some string')doAnotherAction

您可以阅读更多here