技术开发 频道

探索Eclipse的OSGi控制台

有用的控制台命令摘要

表 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 时的情景。

Quake 控制台

图 10. Quake 控制台

0
相关文章