- 浏览: 627017 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (334)
- java core (12)
- struts2.x (2)
- spring (3)
- hibernate (8)
- jpa (6)
- maven (2)
- osgi (5)
- eclipse (4)
- struts2.x+spring2.x+hibernate 整合 (5)
- ebs (0)
- html (0)
- vaadin (1)
- css (0)
- jquery (0)
- javascript (0)
- svn (1)
- cvs (0)
- axas2.x (0)
- eclipse+maven (9)
- annotation (0)
- 基于OSGi的动态化系统搭建 (1)
- notenet (1)
- jboss eclipse (4)
- eclipse工具 (4)
- jdk1.6+maven3.0.3+nuxeo+svn+felix+cxf+spring+springDM (6)
- spring dm (1)
- Nexus介绍 (1)
- proxool listener (0)
- oracle (4)
- mysql (8)
- 搭建你的全文检索 (1)
- hibernatehibernatehibernate (0)
- cvsearchcvsearch (0)
- mycvseach (0)
- asdfasdfasdf (0)
- propertiey (0)
- hibernate annotation (0)
- libs (0)
- icam (2)
- start 数据库配置 (0)
- jboss (1)
- 让Eclipse启动时显示选择workspace的对话框 (1)
- table表头固定 (1)
- s2s3h4 (0)
- leaver (0)
- mycvsaerchddd (0)
- 关于jboss5.0.1部署 (4)
- bookmarks (0)
- PersistenceUnitDeployment (0)
- mycom (0)
- HKEY_CURRENT_USER = &H80000001 (0)
- syspath (1)
- css div (1)
- Dreamweaver CS5 (0)
- generate (0)
- mysql查看表结构命令 (1)
- LOG IN ERROR EMAIL TO SB (0)
- struts2 handle static resource (1)
- jsf (2)
- log4j (1)
- jbpm4.4 (2)
- down: jbpm4.4 (1)
- jstl1.2 (1)
- spring annotation (1)
- java design pattern (1)
- cache (1)
- ehcache (1)
- 11111 (0)
- myge (0)
- pom.xml (0)
- springquartz (0)
- OpenStack (9)
- hadoop (2)
- nginx (1)
- hadoop openstack (1)
- os (1)
- hadoop-2.6.0 zookeeper-3.4.6 hbase-0.98.9-hadoop2 集群 (5)
- hadoop2.7.0 ha Spark (2)
- tess (0)
- system (1)
- asdf (0)
- hbase (2)
- hbase create table error (1)
- ekl (1)
- gitignore (1)
- gitlab-ci.yml (1)
- shell (1)
- elasticsearch (2)
- Azkaban 3.0+ (1)
- centos用命令 (1)
- hive (1)
- kafka (1)
- CaptureBasic (0)
- CentOS7 (1)
- dev tools (1)
- README.md (1)
- Error (1)
- teamviewerd.service (1)
- scala (1)
- spark (1)
- standard (1)
- gitlab (1)
- IDEA (0)
- ApplicationContext (1)
- 传统数仓 (1)
- redis install (1)
- MYSQL AND COLUME (1)
- java版本选择 (1)
- hue (1)
- npm (1)
- es (1)
- 版本管理 (1)
- 升级npm版本 (1)
- git (1)
- 服务器参数设置 (1)
- 调大 IDEA 编译内存大小 (0)
- CentOS8安装GitLab (1)
- gitlab安装使用 (1)
最新评论
-
ssydxa219:
vim /etc/security/limits.confvi ...
ekl -
Gamehu520:
table中无数据
hbase 出现的问题 -
Xleer0102:
为什么都是只有问没有答,哭晕在厕所
hbase 出现的问题 -
jiajiao_5413:
itext table -
CoderDream:
不完整,缺com.tcs.org.demostic.pub.u ...
struts2.3.1.1+hibernate3.6.9Final+spring3.1.0+proxool+maven+annotation
整理了一下,基本上的bundle还是那么几个:
osgi 核心:
org.eclipse.osgi_3.3.2
org.eclipse.osgi.services_3.1.2
equinox:
org.eclipse.equinox.common_3.3.0
org.eclipse.equinox.registry_3.3.1
org.eclipse.equinox.http.jetty_1.0.1 (需要更新)
org.eclipse.equinox.http.registry_1.0.1
org.eclipse.equinox.http.servlet_1.0.1
org.eclipse.equinox.preferences_3.2.1
org.eclipse.equinox.log_1.0.1
org.eclipse.equinox.preferences_3.2.1
必须的bundle:
org.mortbay.jetty_5.1.11 (需要更新)
javax.servlet_2.4.0
(可选更新)
org.apache.log4j_1.2.9
org.apache.commons.logging_1.0.4
spring bundle:
org.springframework.spring_2.5.2 (可选更新)
org.springframework.bundle.osgi.extender_1.0.2 (可选更新)
org.springframework.bundle.osgi.core_1.0.2
(可选更新)
看了看一个基本的应用就需要这么多bundle,也够呛的,这还不算上hibernate,webwork,等其他第三方jar.
OSGi 入门
。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
public class HelloServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException
{
doPost(req, resp);
}
@Override
protected void
doPost(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException {
resp.setContentType("text/html");
resp.getWriter().print("My fist
osgi application");
resp.getWriter().close();
}
}
接下来是关键的一步,定义扩展
如下图
说明一下: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
如何快速的开发一个osgi应用。下面来具体说明一下什么是osgi,以及osgi 能做什么,为什么使用osgi,以及到底osgi能带来什么益处。
首先osgi是什么,osgi是由osgi alliance 制定的一个规范。由此规范,形成了osgi框架。基本上,osgi
也就是类似于servlet规范一样,提供相应的接口。而具体的实现,由相应的平台实现,如equinox平台。
说了那么多,具体osgi能做什么呢?个人归纳了一下,包括以下几点:
1.提供更高层次的模块管理,相对于java的包来说,osgi更加倾向于模块管理。
2.提供更好的封装性,使用更加严格的类装载机制,让模块内的封装性变得更强。
3.真正的面向接口,面向服务编程,使模块之间的耦合度大大降低。
4.支持热部署,只要osgi内核运行着,其他模块可以随时更新,增加。
5.易扩展,便于使用插件的模式进行扩展。具体看看eclipse的插件体系就知道了。
简单介绍了一下osgi,下面说说osgi的几个层次:
安全层:基于java2 安全机制,增加了相应的限制和使用标准的java 许可。
模块层;定义标准的java 模型
生命周期层:提供完整的bundles生命周期管理
服务层:提供动态,简洁和持久化编程模型。
相应的实际服务接口。
主要来说说模块层,看过前面的例子应该知道,那个例子一共包括10个模块(包括系统模块)osgi
以bundle作为一个基本的模块单元。bundle主要包括需要的基础资源,包括类和其他资源文件;一个manifest文件,用于描述bundle信息,以及可选的osgi-opt目录。
manifest文件是最重要的描述文件,如果缺失,则bundle也就无法装载。
简单解释一下前面定义过的bundle
manifest;bundle 文件包括几个必须的元素:
Bundle-ManifestVersion:
2//定义了bundle遵循规范的规则,1表示r3规范 2表示r4和以后的版本
Manifest-Version: 1.0
//主要的版本号
//唯一的bundle名称,相当于在系统中的id。singleton表示是否使用单启动方式
Bundle-SymbolicName: org.demo.helloworld;singleton:=true
//以下是可选的
Bundle-Name: Helloworld Plug-in//bundel 名称
Bundle-Vendor:
zsoft//发布商
Bundle-RequiredExecutionEnvironment: J2SE-1.5//需要的执行环境
//下面是一些引用包的信息,包括包名称和版本号,只有引用了这些包,才能让classloader装载。
Import-Package:
javax.servlet;version="2.4.0",
javax.servlet.http;version="2.4.0",
org.apache.commons.logging;version="1.0.4",
org.osgi.framework;version="1.4.0"
//这是直接引用整个bundle,一般不提倡整个引用,这里是用来定义扩展
Require-Bundle:
org.eclipse.equinox.http.registry;bundle-version="1.0.100"
这里简单的描述了一下主要的几个bundle头信息,如果需要详细了解,具体参考相应的规范。本篇的内容就这些,下篇详细讲解一下osgi的类装载机制,
osgi一个最大的特色就是使用不同的ClassLoader,让多个bundle共享一个虚拟机,而每一个bundle使用单独的ClassLoader。
如下图所示:
对于资源和类的装载主要包括以下三种途径:
Boot
classpath:启动类环境,包括java.*包和相应的实现包。
Framework
classpath:osgi框架拥有一个独立的ClassLoader,用于装载框架接口类,以及相应的实现类。
Bundle
Space:每个bundle包括了与bundle相关的jar文件,以及相关的资源。
对于一个类的查询,主要通过以下途径进行查询:
1.从Parent
ClassLoader中装载
2.从Import Package中查询类路径。
3.从Required
bundles中查询类
4.自身bundle,相关ClassPath
5.相关的插件片段Fragment。
如下图
这么说起来,还是比较的抽象,还是从一个实例来具体的分析。
假设有如下Bundle,
相关的描述文件如下:
Manifest - Version: 1.0
Bundle - Name: core
Bundle - SymbolicName: org.zframework.core;singleton: = true
Bundle - ClassPath: .
Import - Package: net.sf.ehcache;version = " 1.3.0 " ,
net.sf.ehcache.config;version = " 1.3.0 " ,
net.sf.ehcache.event;version = " 1.3.0 " ,
org.osgi.framework;version = " 1.4.0 " ,
org.osgi.service.log;version = " 1.3.0 " ,
![](http://www.blogjava.net/Images/dot.gif)
Require - Bundle: org.eclipse.equinox.common;visibility: = reexport,
![](http://www.blogjava.net/Images/dot.gif)
Export - Package: org.zframework.core;version = " 1.0.0 " ,
![](http://www.blogjava.net/Images/dot.gif)
现在创建了如下的类:
import java.net.URL;
import java.util.Collection;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.osgi.framework.BundleContext;
public class EhCacheManager extends AbstractCacheManager implements
BundleContextAware {
private String cacheFile;
private BundleContext context;
private CacheManager manager;
public Cache getCache(String cacheName) {
Cache cache = manager.getCache(cacheName);
if (cache == null ) {
![](http://www.blogjava.net/Images/dot.gif)
}
return cache;
}
![](http://www.blogjava.net/Images/dot.gif)
}
假设有一个Bundle
org.zframework.model需要使用此类,描述如下:
Bundle - Name: model
Bundle - SymbolicName: org.zframework.model;singleton: = true
Bundle - ClassPath: .
Import - Package: javax.persistence;version = " 1.0.0 " ,
javax.persistence.spi;version = " 1.0.0 " ,
org.osgi.framework;version = " 1.4.0 " ,
![](http://www.blogjava.net/Images/dot.gif)
Require - Bundle: org.zframework.core
类Model
import java.net.URL;
import java.util.Collection;
import org.zframework.core.EhCacheManager ;
public class Model{
private EhCacheManager manager;
public Object getCache(String key) {
Object o = manager.getCache(key);
return o;
}
![](http://www.blogjava.net/Images/dot.gif)
}
下面简单说明一下装载过程:
在装载Model类时,
1.对于java.*类的装载,由相应的Boot
ClassLoader 装载
2.装载EhCacheManager,
1.在Import-Package中查询是否存在匹配中的org.zframework.core包声明,如果有,则委派给org.zframework.core包声明的Bundle进行装载,本例没有,则继续。
2.在Require-Bundle中查询所有的Export声明包,判断是否存在org.zframework.core匹配。本例中,应该存在。如果不存在,则执行步骤2.3
3.查询本bundle的类路径,是否有此类存在。不存在,继续2.4步骤
4.查询所有的fragments bundle(特殊的bundle)
类路径。不存在,继续2.5步骤
5.判断是否使用DynamicImport-Package: *
声明,如果是则查询所有的bundle中声明的Export包。如果还是不存在,则抛出ClassNotFound例外。
关于DynamicImport-Package:
* ,这是比较极端的设置,一般不会推荐使用,主要破坏了相关的封装性。
完整的类查询如下图:
关于类装载机制基本就是这些,对于初学者来说,这还是会有些困惑的。
相关推荐
标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...
在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理: OSGI的核心在于它的模块系统,称为“bundle”。一个bundle是一个自包含的Java模块,包含了类、资源和元数据...
OSGi的核心概念是基于Java的模块化,它的主要目标是为各种设备提供一个开放的服务平台,包括室内设备、交通工具、移动电话等,用于管理和分发应用程序和服务。 OSGi的特点主要包括: 1. **插件化(Bundles)**:...
- **模块化系统**:OSGi的核心是模块化,每个模块称为Bundle,包含代码和元数据,可以独立加载、卸载、启动和停止。 - **生命周期管理**:Bundle有安装、解析、启动、暂停、停止和卸载等状态,方便动态管理。 - **...
OSGI的核心概念是bundle,每个bundle都是一个自包含的单元,包含了运行所需的类、资源和元数据。Bundles通过导出和导入包来共享代码,这类似于Java的import语句,但更加强大和灵活。OSGI框架负责管理这些依赖关系,...
Spring OSGi 是一个将 Spring 框架与 OSGi(Open Service Gateway Initiative)容器相结合的开源项目,旨在提供一种在 ...提供的压缩包文件可能包含了入门手册和示例代码,这些资源将有助于你快速上手 Spring OSGi。
### OSGi 入门教程(mini) 关键知识点概览 #### 1. OSGi 概述 - **定义**:OSGi (Open Service Gateway Initiative) 是一种用于构建模块化 Java 应用程序的标准框架。它允许将应用程序划分为独立的、可重用的模块,...
1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和卸载等状态,...
**Spring OSGi 入门** Spring OSGi 是 Spring 框架与开放服务网关规范(OSGi)的结合,它为基于 Java 的应用程序提供了模块化开发的能力。OSGi 是一个动态的、模块化的运行时环境,使得开发者可以创建可热插拔的...
OSGi的核心是其服务注册表,它允许模块之间通过发布和查找服务来进行交互。每个OSGi模块(称为bundle)都是一个独立的JAR文件,有自己的类加载器,这确保了模块间的隔离性。开发者可以通过定义元数据来控制bundle的...
总的来说,这个压缩包提供了一个全面的OSGi学习资源集合,包括理论、实战案例和最佳实践,适合从入门到进阶的学习者。通过这些资料,你可以系统地掌握OSGi的核心概念,理解它的模块化机制,学会如何构建、部署和管理...
5. 生命周期层提供的关键接口:OSGi生命周期层通过几个核心接口来管理bundle的生命周期。这包括BundleActivator、BundleContext和Bundle三个接口。BundleActivator接口允许开发者捕捉和响应bundle的启动和停止事件。...
本教程以经典实例为基础,旨在帮助新手快速入门OSGI,同时也对经验丰富的开发者具有参考价值。 首先,理解OSGI的基本概念至关重要。OSGI框架由一组称为"bundle"的模块组成,每个bundle都是一个自包含的Java程序单元...
在OSGI入门阶段,首先要理解的是它的基本概念,如bundle(模块)、服务、生命周期管理和依赖管理。Bundle是OSGI中的核心组件,它类似于Java的JAR文件,但具有自己的元数据和生命周期。每个bundle可以导出和导入服务...
### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...
在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...
**标题:“OSGi入门”** **描述:** 这篇博客文章主要介绍了OSGi(Open Services Gateway Initiative)的基础知识,包括它的起源、概念以及在Java开发中的应用。作者通过一个实际的例子来帮助读者理解如何使用OSGi...