上一篇中讲了怎么在Equinox中嵌入Http容器和添加Http服务。
这一篇讲另半部分:怎么在HTTP容器(如Tomcat)中嵌入Equinox。
一、入门
Equinox工程里已经提供了一个专门用于连接Servlet容器和Equinox容器的war包,可以从以下位置下载:
http://eclipse.org/equinox/server/downloads/bridge.war
把它放在Tomcat的webapp下,启动Tomcat,解开后得到的目录结构为:
可以看到这其中已经有一个eclipse的目录结构,和平时添加插件一样,只要把我们新建的bundle放到plugins目录下,即可。
安装完这个war后,启动tomcat,待tomcat启动后,在console上按几下回车,就可以得到osgi控制台了,如下:
测试一下:把上一篇文章中得到的bundle放到plugins目录下,然后重启tomcat,再试式ss命令,看看是否已经安装成功。
可以看到,要在Http容器里嵌入Equinox非常简单。
不过有一个比较重大的问题:插件不会自动更新,例如一旦tomcat启动后,再有新的插件扔进plugins目录下,它不会被自动加载和启动,必须把tomcat重启,才能生效。
二、自动加载
我也不知道怎么配置就可以自动加载,然后我又想要这个功能,没办法就只能自己写了。
假设在eclipse下定义一个新的目录deploy,每隔一段时间就去扫描这个deploy目录,如果有文件或文件夹,就试图把它(它们)作为一个bundle去安装、启动,然后它bundle从deploy目录下移到plugins目录下。
所以,我们需要有一个新的插件,用来扫描deploy目录并且安装和启动找着的bundle;然后我们把这个插件让到plugins里,让它随着tomcat启动而启动。
剩下的事情就是怎么实现这个bundle了。
1.定期扫描
new Thread() {
@Override
public void run() {
File deployFolder = getDeployFolder();
File pluginsFolder = getPluginsFolder();
while (Activator.context != null) {
try {
sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
deployAllUnder(deployFolder, pluginsFolder);
}
}
}.start();
2.安装和启动
private void deployAllUnder(File deployFolder, File pluginsFolder) {
File[] listFiles = deployFolder.listFiles();
for (File f : listFiles) {
try {
System.out.println("installing bundle" + f.getName() + " ...");
Bundle installBundle = context.installBundle("file:"
+ f.getAbsolutePath());
System.out.println("Installed Bundle " + f.getName()
+ " successful");
moveInstalled2Plugins(f, pluginsFolder);
removeInstalledFile(f);
System.out.println("Starting bundle " + f.getName() + " ...");
installBundle.start();
System.out.println("Started bundle " + f.getName());
} catch (BundleException e) {
System.out.println("Failed to install " + f.getName());
e.printStackTrace();
}
}
}
3.移动和删除
private boolean moveInstalled2Plugins(File f, File pluginsFolder) {
return f.renameTo(new File(pluginsFolder, f.getName()));
}
private boolean removeInstalledFile(File f) {
if (f.isFile()) {
return f.delete();
} else if (f.isDirectory()) {
File[] listFiles = f.listFiles();
for (File sub : listFiles) {
boolean removeFile = removeInstalledFile(sub);
if (!removeFile) {
return false;
}
}
return f.delete();
}
return true;
}
4.得到deploy和plugins目录
private File getDeployFolder() {
String location = context.getBundle().getLocation();
URI uri = URI.create(location.replace("\\", "/"));
File file = new File(uri.getSchemeSpecificPart());
File eclipseFolder = file.getParentFile().getParentFile();
File deployFolder = new File(eclipseFolder, DEPLOY_FOLDER_NAME);
if (!deployFolder.exists() || !deployFolder.isDirectory()) {
deployFolder.mkdir();
}
return deployFolder;
}
private File getPluginsFolder() {
String location = context.getBundle().getLocation();
URI uri = URI.create(location.replace("\\", "/"));
File file = new File(uri.getSchemeSpecificPart());
return file.getParentFile();
}
完了以后,以后每次有新的bundle,只需要放到deploy目录下即可,过一会就会被扫描到并且被自己安装和启动。
- 大小: 3.3 KB
- 大小: 9.1 KB
分享到:
相关推荐
OSGI 在 J2EE 环境下的应用越来越广泛,目前在 Servlet 应用中使用 OSGI 有两种方式:Servlet Container in OSGI 和 OSGI in Servlet Container. 前一种:和普通的 OSGI bundle 开发差不多,而后一种:Equinox 提供...
第三部分由原型构建转向实际的产品开发,主要介绍了OSGi和Equinox中用来构建成熟的OSGi应用必不可少的API——服务器端、声明式服务和发布工程,以及如何用它们来解决实践中的一些问题;第四部分呈现了动态性的最佳...
OSGi and Equinox, Creating Highly Modular Java Systems
深入理解OSGi:Equinox原理、应用与最佳实践.pdfOSGi应用开发
OSGi与Equinox 创建高度模块化的Java系统 This first part of the book introduces OSGi and Equinox, Eclipse’s implementation of the OSGi standard. Chapter 1outlines the history and context of OSGi. Its ...
OSGi and Equinox:Creating Highly Modular Java Systems
Equinox开发OSGi应用程序
资源名称:OSGi与Equinox 创建高度模块化的Java系统内容简介:阅读本书,首先你很快就会使用Eclipse bundle工具创建第一个基于OSGi的系统,进而转向复杂的产品开发。接下来,你将掌握一些用于创建具有特殊模块化、...
给出了可用插件bridge和一个可用osgi例子,可以帮助学习osgi的同学学习部署osgi程序到tomcat中。
maven-osgi-plugin-launcher-framework-equinox-1.0.15.jar
OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码。 网上已很难找到源码,是按照书中描述编写的,可直接导入Eclipse运行。
《深入理解OSGi Equinox原理、应用与最佳实践 》完整版。OSGI相关书籍,非扫描版!!!高清文字版!!!
最近整OSGI,整的心情很是不爽,尤其最近搞equinox命令行下的bundle调试,搞两下就很厌倦输入java -jar equinox.jar -console,然后可怜的去加载一个个bundle,虽然通过config.ini可以一把加载相应需要的bundle,但是每次...
深入理解OSGi:Equinox原理、应用与最佳实践源代码,同时附带equinox-SDK-3.8源代码。
OSGi与Equinox 创建高度模块化的Java系统 第5章 源码。 按照书中描述编写,导入Eclipse可以直接运行。
OSGi_with_Eclipse_Equinox_-_Tutorial
本教程就将演示如何在 Eclipse 环境下利用 Equinox 框架进行 OSGi 应用开发。首先解释了实现上述应用程序所必需了解的基本概念和基础知识,并结合示例代码演示 OSGi 开发的一些重要技术,最后探讨了基于 OSGi 应用...
我实现的《使用Equinox开发OSGI应用程序》全部功能的代码和分发包,工程师基于Eclipse3.3的