osgi学习-equinox

刚开始学习时,总是想把osgi放在tomcat运行,然后通过http访问osgi中的bundle服务。

换一种角度,可以把osgi框架当做类似于tomcat的容器,区别在于tomcat运行的是普通的java程序或javaweb程序。osgi框架上运行的就是bundle。

对于习惯开发tomcat上运行的程序的开发人员,学习osgi框架时,需要用有别于普通java程序的开发模式


1.eclipse开发osgi应用



1.eclipse开发osgi应用-equinox
1.1新建plug-in project
若找不到plug-in project,参见附录安装插件








1.2 添加页面
在src下面新建html页面,如webroot/hello.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>a test page</title>
</head>
<body>Hello, This is a test page!</body>
</html>



1.3 添加依赖环境
“Required Plug-ins”栏 添加
javax.servlet包
org.eclipse.equinox.http包

“Imported Packages”栏 添加
org.osgi.service.http包



若没有org.eclipse.equinox.http包,则下载后将org.eclipse.equinox.http*.jar放大eclipse/plugins下,重启eclipse
org.eclipse.equinox.http包下载地址:http://archive.eclipse.org/equinox/drops/R-3.6.2-201102101200/



1.4 注册web页面-编码
在创建plug-in project工程中,生成了Activator,在该类中注册http服务
package firstosgiweb;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;

public class Activator implements BundleActivator {
	 private ServiceReference serviceReference;
	 private HttpService httpService;
	 private static BundleContext bc;
	
	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext context) throws Exception {
		System.out.println("Hello World!!");
		bc = context;
		registerResource();
	}
	
	private void registerResource() {
		try {
			serviceReference = bc.getServiceReference(HttpService.class
					.getName());
			if (serviceReference != null) {
				httpService = (HttpService) bc.getService(serviceReference);
				httpService.registerResources("/demo", "webroot", null);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext context) throws Exception {
		System.out.println("Goodbye World!!");
		unregisterResource();
	}
	
	private void unregisterResource() {
		try {
			httpService.unregister("/demo");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}



1.5 配置运行环境并运行
1.5.1 runtime添加bin/




1.5.2 右键项目 配置Run Configuration
新建osgi运行实例


配置bundles标签,选择
javax.servlet
org.eclipse.equinox.http
org.eclipse.osgi
org.eclipse.osgi.services


配置VM Arguments,添加http服务端口:
-Dorg.osgi.service.http.port=8080



1.5.3 运行



访问http://localhost:8080/demo/hello.html


控制台会输出Hello World!! 信息,但可能回报org.osgi.framework.BundleException: Could not find bundle: org.eclipse.equinox.console
这是因为缺少相应的依赖环境,在Run Configurations中设置添加除org.eclipse.osgi以外的,如下4个bundles
org.eclipse.equinox.console 
org.apache.felix.gogo.command 
org.apache.felix.gogo.runtime 
org.apache.felix.gogo.shell 



保存后 右键项目run as-OSGI Framework


osgi>ss
显示的9个bundle即为Run Configuration-bundle标签中添加的9个bundle

其他osgi命令:
stop 3   // 停止bundle,访问页面提示404

start 3   // 启动bundle

之前学习servicemix时,这些命令或多或少接触一些,有种似曾相识的感觉。servicemix集成了osgi framework(Felix)



附录:
安装plug-in开发插件:
You need to install the Plugin Perspective
Usually you can try to get it via:
1. Help->Install New Software
2. "Work With:" -> "--All Available Sites--"
3. type "Plug-in搜索" into the filter box
4. Open "General Purpose Tools" (may be called differently in your eclipse version!)
5. install "Eclipse Plug-in Development Environment"
6. restart!






参考网站:
Explore Eclipse's OSGi console
https://www.ibm.com/developerworks/library/os-ecl-osgiconsole/index.html

利用OSGi开发WEB应用
http://blog.csdn.net/flanet/article/details/7921370

OSGi的几个命令
http://rickqin.blog.51cto.com/1096449/1077222

OSGi笔记-几个原理问题
http://blog.csdn.net/yanical/article/details/6087633

使用 Equinox 开发 OSGi 应用程序
https://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-osgi/index.html

猜你喜欢

转载自newjava-sina-cn.iteye.com/blog/2377863