有用的控制台命令摘要
表 1. 有用的控制台命令
| 命令 | 描述 |
|---|---|
| start | 启动给定了 ID 或符号名称的包 |
| stop | 停止给定了 ID 或符号名称的包 |
| install | 为当前实例添加一个给定了 URL 的包 |
| uninstall | 删除当前实例的具有给定 URL 的包 |
| update | 为当前实例更新给定 URL 的包 |
| active | 列出当前实例中所有活动的包 |
| headers | 列出具有给定 ID 或符号名称的包的标头 |
| ss | 列出在当前实例中注册的所有包的简短状态 |
| services |
列出给定了正确过滤器的服务 |
| diag | 在给定 ID 或符号名称的包上运行诊断程序 |
还有很多其他 OSGi 命令可用。这里列出的命令是我认为最有用的命令。要获得所有命令的列表,只需在控制台中键入 help。
扩展控制台
人们说 Eclipse 的绝妙之处就在于它的可扩展性。控制台是以类似方式扩展的。这是十分重要的,因为作为一名开发人员,您可能向用户提供某种服务。通过扩展控制台,您可以使高级用户或管理员能够调试关于服务的问题。
控制台不使用熟悉的扩展点,它具有一种简单的可扩展性机制。让我们通过几个示例来说明控制台的可扩展性。
uname,OSGi 样式
使用过 UNIX? 风格的系统的人都会熟悉 uname 命令,该命令将打印关于运行的操作系统的名称、版本和其他信息。在 OSGi 上下文中,有各种不同风格的 UNIX 的方法就可以有 OSGi 控制台的不同实现(例如 Apache Felix、Knopflerfish 等等)。
扩展 OSGi 控制台的最重要部分是 CommandProvider 接口。希望扩展控制台的客户机必须实现此接口。实现此接口后,下一步是启动带有 "_" 的方法名称。这些方法将表示控制台中可用的命令。就这么简单!参见清单 1 中的示例。
清单 1. OSGi uname
包和存在主义public class Activator implements BundleActivator, CommandProvider {private BundleContext context;public void start(BundleContext context) throws Exception {this.context = context;Hashtable properties = new Hashtable();context.registerService\(CommandProvider.class.getName(), this, properties);}public String getHelp() {StringBuffer buffer = new StringBuffer();buffer.append("\tuname - returns framework information\n");return buffer.toString();}public void stop(BundleContext context) throws Exception {}public void _uname(CommandInterpreter ci) throws Exception {String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);String version = context.getProperty(Constants.FRAMEWORK_VERSION);String osName = context.getProperty(Constants.FRAMEWORK_OS_NAME);String osVersion = context.getProperty(Constants.FRAMEWORK_OS_VERSION);System.out.println("\n " + vendor + " " + version + " (" + osName + " " +osVersion + ")");}}
包本身可能从未质疑过自己的存在,这里提供了一个简单示例,它将打印出一个包是 vanilla 包还是 Eclipse 插件。(记住,两者都还是包!)清单 2 通过添加新方法并修改 getHelp() 方法来构建先前的示例。
清单 2. 修改 getHelp()
...public String getHelp() {StringBuffer buffer = new StringBuffer();buffer.append("\twhatami - \returns whether the bundle is a plug-in or not\n");buffer.append("\tuname - returns framework information\n");return buffer.toString();}public void _whatami(CommandInterpreter ci) throws Exception {try {long id = Long.parseLong(ci.nextArgument());Bundle bundle = context.getBundle(id);URL url = bundle.getEntry("plugin.xml");if(url != null) {System.out.println("\n I'm \(" + bundle.getSymbolicName() + ") a plug-in");}else {System.out.println("\n I'm \(" + bundle.getSymbolicName() + ") not a plug-in");}} catch (NumberFormatException nfe) {System.out.println("\n Error processing command");}}...
图 9 中显示了我们的工作结果。
图 9. 扩展控制台的结果
结束语
本文演示了如何使用 OSGi 控制台以及如何扩展控制台。在此过程中,我们查看了控制台以及如何扩展控制台的几个示例。您现在已经更加熟悉控制台并且知道了如何在日常的 Eclipse 开发中使用控制台。使用控制台可能甚至会让您回想起玩 Doom and Quake 时的情景。

图 10. Quake 控制台