osgi 入门

接触了osgi也这么久了,其中也走了不少的弯路。为了更好的推广osgi,并避免新手能少走一些弯路,接下来的几篇文章,我会通过几个简单的实例,来介绍一下如何快速的掌握osgi。其实,网上有不少好的文章推荐,顺便也可以比较一下。BlueDavy的osgi 实战是值得推荐的,当初也是看了之后,少走了很多弯路。参见网址:http://www.blogjava.net/BlueDavy/。ModuleFusion 也是一个不错的项目,里面集成了现有的优秀框架,包括hibernate,guice,wicket等。 参见网址:http://code.google.com/p/modulefusion/。
  废话少说,就从一个简单的Helloworld开始吧。
  要做项目,少不了工具。Eclipse,反正搞java的基本都应该有了,这里用的是最近的3.4.1版本,以前一直用3.3.1,这两天刚更新。java就是这个比较讨厌,很多东西不停的更新,然后手上的工具包也得不停的更新。osgi 实现,当然首选equinox,版本也是3.4.1。其实Eclipse里面已经包括了equinox,当然单独下载也没有问题。看了看equinox,最近又增加了不少的服务,其实很多都是用不着的,别被这些东东吓着。
  简单的介绍一下需要的bundle:
  org.mortbay.jetty_5.1.14                 jetty 容器,当然是需要的,如果你不需要外部web服务器的话。
  org.eclipse.osgi_3.4.2.                这是核心的equinox实现,也就是系统bundle
  org.eclipse.osgi.services_3.1.2            这也是必备的,作为osgi服务接口
  org.eclipse.equinox.common_3.4.0            这也是必备的,equinox的共同核心
  org.eclipse.equinox.registry_3.4.0        这是用于equinox 插件扩展的,也是必须的。plugin.xml就是这个bundle处理的
  org.eclipse.equinox.http.servlet_1.0.1        http servlet包,包括了主要的proxyServlet类,作为主要的桥接Servlet 
  org.eclipse.equinox.http.registry_1.0.1        http servlet,resource 注册服务
  org.eclipse.equinox.http.jetty_1.1.0        主要的用于启动jetty的代码
  javax.servlet_2.4.0                    servlet规范
  org.apache.commons.logging_1.0.4            用于处理日志
  以上的包都是必须的。
  其他可选的包,以后再介绍。
  好了,先在eclipse中建一个项目吧。创建plugin project而不是java project。当然你也可以转成pluign project。
  如以下的图,一直next
 

  
  提一下几个重要的文件:
  osgi bundles,必需的文件为MANIFEST.MF 大写,在META-INF下面
  plugin.xml,这是eclipse的插件文件,用于扩展使用。
  至于build.properties是用于打包的,可以不需要。
  
  修改一下相应的信息,如下图:基本上已经创建好了。
    
  简单说明一下:ID,也就是Bundle-SymbolicName 这是必须的。version 也就是Bundle-Version 也是必须的。其他可以随便。
  
  下面说明一下,我们需要几个重要的包,所以需要引入,点击Dependencies右边的import packages 的add。
  增加后,如下图
  
  说明一下,如果你需要引入相应的类,就像你在classpath中引入包一下一样。  
  由于,我们需要扩展Servlet,所以还需要http.servlets扩展,所以需要引入bundle:..http.registry。如下图:
   
  下面创建一个简单的HelloServlet

Java代码  收藏代码
  1. public class HelloServlet extends HttpServlet {  
  2.     private static final long serialVersionUID = 1L;  
  3.     @Override  
  4.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  5.             throws ServletException, IOException {  
  6.         doPost(req, resp);  
  7.     }  
  8.     @Override  
  9.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  10.             throws ServletException, IOException {  
  11.         resp.setContentType("text/html");  
  12.         resp.getWriter().print("My fist osgi application");  
  13.         resp.getWriter().close();  
  14.     }  
  15. }  
 


 接下来是关键的一步,定义扩展
 如下图
 
 说明一下:class:org.demo.HelloServlet 就是我们创建的servlet
          alias:用于浏览器访问的路径,如http://localhost:8080/hello
 
 基本已经就绪,可以启动。
 创建一个新的osgi framework 运行配置,如下图:
 
 选择上面的几个bundle,以及你创建的项目。然后运行就可以了,默认的端口为80,如果需要更改,配置参数
 org.osgi.service.http.port=端口号
 如下图:
  
 现在可以直接在浏览器中访问了,一个osgi 应用已经完成。
 在console中输入ss,可以看到下面的提示,表示你的bundles基本已经运行正常。
 Framework is launched.
id    State       Bundle
0    ACTIVE      org.eclipse.osgi_3.4.2.R34x_v20080826-1230
1    ACTIVE      org.demo.helloworld_1.0.0
2    ACTIVE      org.eclipse.equinox.registry_3.4.0.v20080516-0950
3    ACTIVE      org.eclipse.osgi.services_3.1.200.v20071203
4    ACTIVE      javax.servlet_2.4.0.v200806031604
5    ACTIVE      org.eclipse.equinox.http.registry_1.0.100.v20080427-0830
6    ACTIVE      org.eclipse.equinox.http.jetty_1.1.0.v20080425
7    ACTIVE      org.eclipse.equinox.http.servlet_1.0.100.v20080427-0830
8    ACTIVE      org.eclipse.equinox.common_3.4.0.v20080421-2006
9    ACTIVE      org.mortbay.jetty_5.1.14.v200806031611
10    ACTIVE      org.apache.commons.logging_1.0.4.v20080605-1930

posted on 2013-05-03 20:48  Java码界探秘  阅读(105)  评论(0编辑  收藏  举报

导航