OSGi初始配置

来源:互联网 发布:bloodstrike 比例数据 编辑:程序博客网 时间:2024/05/29 10:03

转载至:http://longdick.iteye.com/blog/457310

OSGI(Open Services Gateway Initiative),或者通俗点说JAVA动态模块系统,定义了一套模块应用开发的框架。OSGI容器实现方案如Knopflerfish, Equinox, and Apache Felix允许你把你的应用分成多个功能模块,这样通过依赖管理这些功能会更加方便。

和Servlet和EJB规范类似,OSGI规范包含两大块:一个OSGI容器需要实现的服务集合;一种OSGI容器和应用之间通信的机制。开发OSGI平台意味着你需要使用OSGI API编写你的应用,然后将其部署到OSGI容器中。从开发者的视角来看,OSGI提供以下优势:

 

  1. 你可以动态地安装、卸载、启动、停止不同的应用模块,而不需要重启容器。
  2. 你的应用可以在同一时刻跑多个同一个模块的实例。
  3. OSGI在SOA领域提供成熟的解决方案,包括嵌入式,移动设备和富客户端应用等。

 

OK,你已经有个Servlet容器来做web 应用,有了EJB容器来做事务处理,你可能在想为什么你还需要一个新的容器?简单点说,OSGI容器被设计专门用来开发可分解为功能模块的复杂的Java应用。

 

企业应用领域的OSGI

 

OSGI规范最初是由OSGI联盟在1999年3月发起。它的主要目的是成为向网络设备传输服务管理的开放规范。核心思想是一旦你向网络设备中添加了一个OSGI服务平台,你可以在网络中的任意位置管理该设备上的服务组件。这些服务组件可以任意安装,更新或移除而不会对设备产生影响。

多年来,OSGI技术只出现在嵌入式系统和网络设备市场。现在,Eclipse使OSGI在企业开发领域焕发出新的光彩。

 

OSGI受到越来越广泛的支持

 

2003年,Eclipse开发团队开始寻找一种使eclipse成为一种功能更动态、工具更模块化的富客户端平台。最终,他们的目光锁定在OSGI框架上。Eclipse3.0,2004年6月发布,是基于OSGI技术搭建的首个Eclipse版本。

 

几乎所有企业应用服务提供商支持或计划支持OSGI。Spring框架同样支持OSGI,通过Spring DM(Spring Dynamic Modules for OSGI Service Platforms)项目,可以让我们在Spring上更方便的应用OSGI。

 

 

开源OSGI容器

 

从企业应用开发者的角度看,OSGI容器侵入性非常小,你可以方便地将其嵌入一个企业应用。举个例子来说,假设你在开发一个复杂的web应用。你希望将这个应用分解成多个功能模块。一个View层模块,一个Model层模块,一个DAO模块。使用嵌入式OSGI容器来跨依赖地管理这些模块可以让你随时更新你的DAO模块却不需要重启你的服务器。

只要你的应用完全符合OSGI规范,它就可以在所有符合OSGI规范的容器内运行。现在,有三种流行的开源OSGI容器:

 

  1. Equinox是OSGI Service Platform Release 4的一个实现。是Eclipse 模块化运行时的核心。
  2. Knopflerfish另一个选择。
  3. Apache Felix是Apache软件基金会赞助的一个OSGI容器

 

在这篇文章里我们使用Equinox作为我们的OSGI容器。

 

 

尝试开发一个Hello World bundle

 

在OSGI的领域,发布的软件是以bundle的形式出现。bundle由java class类和资源文件组成,向设备所有者提供功能,同时可以为其他的bundles提供服务。Eclipse对开发bundles提供了强大的支持。Eclipse不仅仅提供创建bundles的功能,它还集成了Equinox这个OSGI容器,你可以在其上开发和调试OSGI组件。其实所有的Eclipse插件都是使用Eclipse规范代码写的OSGI bundle。接下来,你将可以学到如何使用Eclipse IDE开发一个Hello world osgi bundle。

 

开始开发bundle

 

我们一步步的开始:

 

 

  1. 启动Eclipse,依次点 File --> New --> Project。
  2. 选择Plug-in Project,next。
  3. 输入Project Name项目名称,比如com.howard.sample.HelloWorld,Target Platform(目标平台)里的an OSGI framework,选择standard。
  4. 剩下的保持默认,next。
  5. 下个对话框也默认,next。
  6. 然后选择Hello OSGI Bundle作为模版。Finish。

Eclipse会飞快的为你创建Hello world bundle的模版代码。主要包含两个文件:Activator.java和MANIFEST.MF。

 

Activator.java的代码如下所示:

 

Java代码  收藏代码
  1. import org.osgi.framework.BundleActivator;  
  2. import org.osgi.framework.BundleContext;  
  3. public class Activator implements BundleActivator {  
  4.     public void start(BundleContext context) throws Exception {  
  5.         System.out.println("Hello world");  
  6.     }  
  7.     public void stop(BundleContext context) throws Exception {  
  8.         System.out.println("Goodbye World");  
  9.     }  
  10. }  
 

如果你的bundle在启动和关闭的时候需要被通知,你可以考虑实现BundleActivator接口。以下是定义Activator的一些注意点:

 

  1. 你的Activator类需要一个公有的无参数构造函数。OSGI框架会通过类反射的方式来实例化一个Activator类。
  2. 容器启动bundle过程中负责调用你的Activator类的start方法。bundle可以在此初始化资源比如说初始化数据库连接。start方法需要一个参数,BundleContext对象。这个对象允许bundles以取得OSGI容器相关信息的方式和框架交互。如果某一个bundle有异常抛出,容器将对该bundle标记为stopped并不将其纳入service列表。
  3. 容器关闭的时候会调用你的Activator类方法stop(),你可以利用这个机会做一些清理的操作。

 

MANIFEST.MF

 

这个文件是你的bundle的部署描述文件。格式和Jar里的MANIFEST.MF是一样的。包含的不少名值对,就像如下:

 

Xml代码  收藏代码
  1. Manifest-Version: 1.0  
  2. Bundle-ManifestVersion: 2  
  3. Bundle-Name: HelloWorld Plug-in  
  4. Bundle-SymbolicName: com.howard.sample.HelloWorld  
  5. Bundle-Version: 1.0.0  
  6. Bundle-Activator: com.howard.sample.helloworld.Activator  
  7. Bundle-Vendor: HOWARD  
  8. Bundle-RequiredExecutionEnvironment: JavaSE-1.6  
  9. Import-Package: org.osgi.framework;version="1.3.0"  
 

分别来看下:

 

Bundle-ManifestVersion

 数值为2意味着本bundle支持OSGI规范第四版;如果是1那就是支持OSGI规范第三版。

Bundle-Name

 给bundle定义一个短名,方便人员阅读

Bundle-SymbolicName

 给bundle定义一个唯一的非局部名。方便分辨。

Bundle-Activator

 声明在start和stop事件发生时会被通知的监听类的名字。

Import-Package

 定义bundle的导入包。

Hello World bundle完成了,接下来我们运行一下。

 

执行bundle

 

 

  1. 点击Run --> Run Configuration
  2. 在左边的OSGI Framework选项里右键 new ,创建一个新的OSGI Run Configuration
  3. 名字随便取好了,我们取个OSGi hello world。
  4. 你会注意到中间的窗口里Workspace项目里有一子项 com.howard.sample.HelloWorld,将其勾选上,其他的不用管。这时的状态应该如下图。
  5. 点击Run按钮。在控制台你应该可以看见点东西了。那是叫做OSGI控制台的东东。与子相伴,还有一个"Hello world"。


OSGI控制台

 

OSGI控制台是一个OSGI容器的命令行界面。你可以利用它做些诸如启动,关闭,安装bundles,更新和删除bundles等操作。现在,点击OSGI控制台所在的位置,回车,你就会发现可以输入命令了。这时的OSGI控制台应该如下图:


下面列出一些常用的OSGI命令,你可以试着和OSGI容器交互。

ss 显示已安装的bundles的状态信息,信息包括bundle ID,短名,状态等等。

start 启动一个bundle

stop  关闭一个bundle

update  载入一个新的JAR文件更新一个bundle

install  安装一个新的bundle到容器中

uninstall  卸载一个已在容器中的bundle



可能出现的问题:

转载至:http://blog.csdn.net/reaganjava/article/details/8923054

 

eclipse 调试时出现!MESSAGE Could not find bundle: org.eclipse.equinox.console解决办法

在用ECLIPSE调试OSGI时出现异常错误无法开打OSGI>

[html] view plaincopy
  1. !SESSION 2013-05-13 22:50:24.171 -----------------------------------------------  
  2. eclipse.buildId=unknown  
  3. java.version=1.7.0_21  
  4. java.vendor=Oracle Corporation  
  5. BootLoader constants: OS=win32ARCH=x86WS=win32NL=zh_CN  
  6. Command-line arguments:  -dev file:C:/Documents and Settings/Administrator/Documents/workspace-sts-3.2.0.RELEASE/.metadata/.plugins/org.eclipse.pde.core/New_configuration/dev.properties -os win32 -ws win32 -arch x86 -consoleLog -console  
  7.   
  8. !ENTRY org.eclipse.osgi 4 0 2013-05-13 22:50:25.000  
  9. !MESSAGE Could not find bundle: org.eclipse.equinox.console  
  10. !STACK 0  
  11. org.osgi.framework.BundleException: Could not find bundle: org.eclipse.equinox.console  
  12.     at org.eclipse.osgi.framework.internal.core.ConsoleManager.checkForConsoleBundle(ConsoleManager.java:211)  
  13.     at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:297)  
  14.     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)  
  15.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  16.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
  17.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
  18.     at java.lang.reflect.Method.invoke(Unknown Source)  
  19.     at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)  
  20.     at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)  
  21.     at org.eclipse.equinox.launcher.Main.run(Main.java:1438)  
  22.     at org.eclipse.equinox.launcher.Main.main(Main.java:1414)  

但是选种org.eclipse.equinox.console时还是会报错,那时因为OSGI组建之间存在依赖关系,要使用org.eclipse.equinox.console必须要有它需要依赖的OSGI组建,因此在调试时,除了选择自己编写的OSGI组建还要选择

[html] view plaincopy
  1. org.apache.felix.gogo.command  
  2. org.apache.felix.gogo.runtime  
  3. org.apache.felix.gogo.shell  
  4. org.eclipse.equinox.console  

问题解决成功出现OSGI>

[html] view plaincopy
  1. osgi> ss  
  2. "Framework is launched."  
  3.   
  4.   
  5. id  State       Bundle  
  6. 0   ACTIVE      org.eclipse.osgi_3.8.2.v20130124-134944  
  7. 1   ACTIVE      BundleBase_1.0.0.qualifier  
  8. 2   ACTIVE      BundleCnService_1.0.0.qualifier  
  9. 3   ACTIVE      BundleEnService_1.0.0.qualifier  
  10. 8   ACTIVE      org.apache.felix.gogo.runtime_0.8.0.v201108120515  
  11. 9   ACTIVE      org.apache.felix.gogo.shell_0.8.0.v201110170705  
  12. 10  ACTIVE      org.apache.felix.gogo.command_0.8.0.v201108120515  
  13. 11  ACTIVE      org.eclipse.equinox.console_1.0.0.v20120522-1841  
  14. osgi>   


0 0
原创粉丝点击