了解非常优秀的 OSGi (Equinox) 控制台,以及如何将其添加到 Eclipse 开发人员的工具箱中,并了解如何扩展控制台以进一步添加到工具箱中。
从 V3.0 开始,Eclipse 通过选择开放服务网关协议(Open Services Gateway Initiative,OSGi)来替换先前版本中不稳定的 Eclipse 插件技术,从而实现了一次巨大飞跃。这次转变对于用户来说几乎是透明的,因为现在所使用的插件的安装和操作看上去和以前的插件没有什么不同。
图 1. Eclipse 内的插件
由于 Eclipse 现在是在 OSGi 上构建的,因此我们在图 1 中看到的插件是功能完整的 OSGi 包。(图 2 显示了使用 OSGi 控制台运行 Eclipse 实例内的包。)通过使用 OSGi,Eclipse 支持业内认可的开放标准并且现在可以利用 OSGi 提供的功能,包括安全性、HTTP 服务、用户管理和其他功能。Eclipse 对 OSGi 的使用已经见到成效,因为我们看到插件间报告的冲突在减少而 Eclipse 的应用在持续增加。
图 2. Eclipse 内的 OSGi 包
在我们继续之前,本文假定您具有 Eclipse 和 OSGi 方面的工作经验。如果不具备的话,建议先阅读 Scott Delap 的文章 “了解 Eclipse 插件如何使用 OSGi”,然后再来研究 OSGi 控制台。
创建 OSGi 包
这次冒险的第一步是使用 插件开发环境(Plug-in Development Environment,PDE)在 Eclipse 中创建一个简单的 OSGi 包。为此,需要使用 PDE 创建一个新的插件项目(File > New > Project > Plug-in Project)。在创建新的插件项目的过程中,确保设定正确的选项。首先,选择插件目标平台作为 OSGi Framework,具体来说就是 Equinox。最后,为了简短起见,使用 PDE 提供的 Hello OSGi Bundle 模板(参见图 3)。我们现在创建好了将在本文中使用的包。
图 3. PDE Hello OSGi bundle 向导
Hello OSGi 控制台
现在我们已经有了自己的 Hello 包,可以继续并启动框架以获得 OSGi 控制台。要启动框架,我们可以利用 PDE 的 OSGi Framework 启动配置。首先,转至启动配置菜单(Run > Run ...)并为 Hello 包创建一个 OSGi Framework 启动配置(参见图 4)。此外,确保仅选择运行 Hello 包所需的必要的包。完成此操作的一种简单方法是在启动配置中按 Deselect All 键并选中 Hello 包,接下来按 Add Required Plug-ins 键。
图 4. PDE 的 OSGi Framework 启动配置
完成启动配置并准备就绪之后,可以使用启动配置对话框中的 Run 按钮来启动我们的包。完成后,应当会看到类似图 5 的结果。
在图 5 中,我们看到 Hello 包已启动(使用控制台中打印的 HelloWorld 消息,表示包已被启动)并且看到 osgi> 提示符。OSGi 提示符类似于 DOS 或者 Bash 提示符,可以在提示符处输入对 OSGi 实例起作用的命令。在本例中,发出 ss 命令,该命令将快速显示所有内容的状态。建议您在普通的 Eclipse 实例中尝试此命令,将发现所有内容只不过是隐藏着的一个 OSGi 包。要获得普通 Eclipse 实例的 OSGi 控制台,只需用 -console 参数启动 Eclipse。
图 5. 首次启动
启动和停止包
在 OSGi 动态环境中,可以轻松地启动和停止包。要测试此操作,让我们使用简单的 Hello 包。只需用 stop 命令即可停止包,然后用 start 命令启动包。您应当会看到类似图 6 的结果。
图 6. 启动和停止包
添加、删除和更新包
OSGi 系统的另一个强大的方面是能够在运行的 OSGi 实例中添加、删除和更新包 —— 所有操作均无需重新启动 Java™ 虚拟机。图 7 演示了包的安装和卸载。
图 7. 安装和卸载包
错误诊断
有时在包或插件尝试启动的初始化过程中会发生错误。OSGi 控制台提供了一个有用的命令 —— diag —— 可以帮助您调试与包初始化相关的问题。例如,让我们来检验一下图 8,在尝试启动 Hello 包时,获得一个错误。为了帮助诊断错误,对包运行 diag 命令并将看到运行时环境中缺少一个导入包。
图 8. 控制台错误诊断
有用的控制台命令摘要
表 1. 有用的控制台命令
命令
描述
start |
启动给定了 ID 或符号名称的包 |
stop |
停止给定了 ID 或符号名称的包 |
install |
为当前实例添加一个给定了 URL 的包 |
uninstall |
删除当前实例的具有给定 URL 的包 |
update |
为当前实例更新给定 URL 的包 |
active |
列出当前实例中所有活动的包 |
headers |
列出具有给定 ID 或符号名称的包的标头 |
ss |
列出在当前实例中注册的所有包的简短状态 |
services <filter> |
列出给定了正确过滤器的服务 |
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 控制台
下载
描述
名字
大小
下载方法
源代码
|
os-ecl-osgiconsole.hello.zip |
49KB
|
|
|
相关推荐
这个接口定义了如何向OSGi控制台暴露新的命令。在`com.ferry.testCommand`中,我们可以看到一个具体的自定义命令实现。通常,这个bundle会包含一个或多个类,这些类实现了`CommandProvider`接口,并提供了实际的命令...
通过OSGi控制台或自定义的管理接口,可以查看和操作这些服务。 ### 纯OSGi实现源码 除了SpringDM,Eclipse也支持纯OSGi方式的开发,即不依赖任何特定的OSGi扩展库。这种方式需要手动管理服务的注册和查找,以及...
5. 访问Eclipse OSGi控制台:Eclipse环境中的OSGi控制台为开发者提供了额外的便捷方式来管理和调试OSGi模块。 安装部分介绍: 1. 下载或升级:提供获取OSGi实现的步骤,如Equinox,并且介绍了如何下载或升级到新...
这个Demo主要展示了如何在只有Java Development Kit (JDK)的环境下启动OSGI框架,并通过`run.bat`脚本来操作OSGI控制台。下面我们将深入探讨相关的知识点。 1. **OSGI框架**:OSGI,全称为Open Services Gateway ...
可以使用OSGi控制台来查看和管理各个bundle的状态。 6. spring-depends文件:这个压缩包文件可能包含了项目中所依赖的Spring库或者其他相关依赖,用于构建和运行OSGi项目。在Eclipse中,需要将这些依赖添加到项目的...
【标题】基于Eclipse的Equinox框架开发OSGi Bundle应用 在Java世界中,OSGi(Open Services Gateway Initiative)是一种模块化系统,它允许开发者创建可独立更新和依赖管理的模块,即Bundle。Eclipse的Equinox是...
osgi.bundles=org.eclipse.osgi.services@1:start, org.eclipse.osgi.util@1:start, org.eclipse.equinox.common@1:start, ... ``` 通过可执行的 Launcher 启动时,需要在 config.ini 文件中指定 osgi.bundles 参数...
2. 安装Bundle:使用OSGI控制台(可以通过运行“console”脚本访问),输入命令“install file:/path/to/your/bundle.jar”将Bundle安装到平台上。 六、启动和使用Bundle 1. 启动Bundle:在控制台中,输入命令...
此时,在Eclipse控制台中应当出现osgi提示符,表示OSGi环境已成功搭建。 4. 新建一个OSGi项目。在Eclipse中创建一个Plug-in项目,并设置项目的名称和Target Platform。在创建过程中,需要配置bundle的Manifest文件...
1. **插件系统**:利用OSGi创建可扩展的应用程序框架,如Eclipse IDE就是基于OSGi的插件系统。 2. **分布式系统**:在多节点环境中,OSGi的动态性可以帮助构建灵活的微服务架构。 3. **设备管理**:在物联网(IoT)...
然后,通过控制台或OSGi Console命令来启动你的HelloWorld模块,你会看到预期的输出。 6. **调试和测试**:由于OSGi环境的动态性,你可以方便地进行调试和测试。比如,你可以停止模块,修改代码,然后重新启动模块...
1. **配置OSGi框架**:选择一个OSGi实现,如Apache Felix或Eclipse Equinox。下载并安装相应的运行时环境。 2. **创建bundle**:使用OSGi兼容的构建工具(如BndTools或Maven Bundle Plugin)将“myself”工程打包为...
1. 安装合适的OSGi运行时环境,如Apache Felix或Eclipse Equinox。 2. 解压`app01`文件,检查`pom.xml`或`build.gradle`文件以确定构建工具和依赖。 3. 使用构建工具(Maven或Gradle)编译源代码并打包为OSGi bundle...
1. **建立第一个Plug-in项目**:使用Eclipse自带的OSGI框架建立第一个插件项目。该插件项目会在控制台输出“HelloWorld”以表示启动成功,关闭时输出“GoodbyeWorld”。 2. **Activator类的作用**:Activator类用于...
OSGI控制台允许开发者对Bundle进行管理和监控,而编程控制则可以通过OSGI API实现对Bundle生命周期的管理。 以下是一个简单的OSGI实例,展示了热插拔功能: 1. 实例演示了如何在运行时替换现有的实现类。例如,有...
如果读者已经安装了Eclipse,那么可以直接从Eclipse安装目录中找到相应的jar文件,这个文件是org.eclipse.osgi_3.2.1.R32x_v***.jar。如果没有安装Eclipse,也可以单独从官方网站下载这个jar文件。 然后,作者建议...