这种插件被称之为Bundle,Bundle可以被动态地加载和卸载,动态升级也就可以被实现了(有点像Erlang的OTP提供的热代码替换,不过OTP和Erlang结合更紧密),通过使用OSGi,Java应用就可以实现良好的模块化...OSGi框架规范提供了一个通用的安全的Java框架,Bundle服务应用的部署、扩展全都依赖于该框架。 OSGi体系架构: ?...至于配置方面,因为ONOS使用了Karaf作为其OSGi框架,这使得动态模块载入成为可能,同时Karaf提供了诸如允许使用标准JAX-RS API去开发REST API使其更安全、运行时方便日志级别的设置和容易扩展的...通过北向API通讯,而network-facing模块使用南向API与core通讯,通过层层分离,实现模块化。...Application: 应用程序通过AdminService和其他服务接口聚合消息,被Manager使用和操作。应用程序的功能多种多样,比如显示网络拓扑、节点等。
这种设计下,Bundle的类加载遵循以下核心规则: 本地类优先原则:当类加载请求发生时,首先检查当前Bundle的类路径 导入包委派机制:对于声明在Import-Package中的类,委派给导出该包的Bundle...类空间(Class Space)的实现原理 OSGi通过"类空间"概念实现逻辑隔离,每个Bundle的类空间由三部分组成: 本地类路径(Bundle-ClassPath) 显式导入的包(Import-Package...现代OSGi容器如Knopflerfish提供了增强型诊断工具: 类来源追踪功能 Bundle依赖图谱可视化 类加载路径记录器 依赖地狱的新形态 虽然解决了传统JAR冲突,但可能出现包级依赖死锁。...与Java模块系统的比较 Java 9引入的JPMS模块系统与OSGi在类隔离方面存在显著差异: 隔离粒度:JPMS基于模块,OSGi基于Bundle(可包含多个包) 可见性控制:JPMS使用exports...OSGi架构的现代启示 虽然完整的OSGi容器使用率在下降,但其类加载思想仍在持续影响现代架构: Spring Boot的Fat Jar解决方案借鉴了Bundle的资源隔离概念 微服务架构中的sidecar
在OSGi中,每个Bundle都有自己的类加载器,这些类加载器也遵循双亲委派模型,以确保Bundle之间的隔离和安全性。然而,OSGi对双亲委派模型进行了一些扩展,以实现更灵活的类加载和卸载机制。...这种机制的主要用途是允许在一个线程中运行的代码使用不同于创建该线程时所使用的类加载器来加载类和资源。这对于在Web服务器(如Tomcat)中实现插件化、热部署等功能非常有用。...下面是如何在OSGi中打破双亲委派模型的一些步骤: 创建OSGi Bundle:首先,你需要使用适当的工具(如Maven的Bundle插件)创建一个OSGi bundle。...定义导出和导入的包:在你的bundle的manifest文件中,你需要定义哪些包应该被导出(供其他bundles使用)和哪些包应该被导入(从你的bundles中使用)。...使用OSGi类加载器:在OSGi环境中,你的代码将自动使用bundle的类加载器来加载类。
如何定义 Bundle Bundle 是 OSGi 中的基本组件,其表现形式仍然为 Java 概念中传统的 Jar 包。...前面已经了解了 Bundle 的概念和作用。但是要真正使用 Bundle,需要使用生命周期层的API,来和OSGi框架的生命周期层进行交互。...在标准的Java编程中,可以通过将jar包放到classpath中来使用它。而bundle则不是这样,Bundle只有在被安装(install)到一个OSGi框架的运行实例中才能用起来。...下图为 Bundle 生命周期的状态转移图: 重要接口 生命周期层的API主要是由以下三个核心接口来组成的:BundleActivator,BundleContext 和 Bundle。...Bundle:在逻辑上表示了一个bundle,OSGi环境中的一个物理bundle对应了一个bundle对象。该对象中包含了bundle的基本信息和bundle生命周期的控制接口。
“Basic OSGi Bundle”对话框,是模板需要输入的Bundle启动和停止时列印的消息内容,在此保留默认,点“Finish”。...在左侧的包浏览面板中可以看到OSGi工程的结构,“Plug-in Dependencies”下是OSGi插件运行需要的组件,src目录下是自动生成的源代码,simplewebosgi.Activator...是 Bundle生成周期管理类,可以监听组件的启动和停止动作。...与普通Java工程所不同的是向导会生成“META-INF”目录以及其下的文件 MANIFEST.MF文件,此文件会随插件的发布一起被打到jar包中,定义了Bundle的标识、版本、名称、运行环境等内容。...右边是可视化的配置管 理器,在这里可以定义插件,配置插件运行所依赖的组件及需要导入的包,运行时环境,编译构建配置等。
模块层 模块层定义了一个模块化Java模型,对Java部署模式的一些缺点进行了改进,并对bundle(bundle为OSGi中的组件模型,可以简单认为是增加了元数据的Jar包) 之间包的共享有严格的规定...模块层独立于生命周期层和服务层,使用时可以不需要生命周期层和服务层。生命周期层提供了对模块层的bundle 进行管理的API,而服务层提供了bundle之间的通信模型。...生命周期层 生命周期层为bundle 提供了生命周期管理API,为bundle提供了一个运行时模型,定义了一个bundle 如何启动、停止、安装和卸载。...另外,生命周期层也提供全面的事件API,允许bundle去控制和操作服务平台。...使用Gemini Blueprint编写的代码更易于测试,同时与OSGi API是松耦合的。
Poc之后,我选择放弃OSGI TIPS: 如贵司允许重构老系统或者允许使用OSGI的第三方框架改造所带来的投入成本,并且评估之后ROI乐观,那么还是可以使用的。...spring3以后,好像就没有人维护osgi的版jar包了,想要使用更高版本,只能自己生成bundle....,而且不提供osgi版本,造成我们现有项目大部分业务需要重构,工作量巨大(等同于重写service) 问题 如何在不使用第三方框架的情况下提供rest service暴露?...SpringMVC单体应用,如何将每一个controller中的所有methods封装为bundle中的bean services 对外统一暴露而不是one by one?...如何在Bundle使用Spring Annotation/是否可以使用?
OSGI优缺点 使用OSGI构建Java应用优点比较明显,主要体现在以下几个方面: 1、基于OSGI的应用程序可动态更改运行状态和行为。...在OSGI框架中,每一个Bundle实际上都是可热插拔的,因此,对一个特定的Bundle进行修改不会影响到容器中的所有应用,运行的大部分应用还是可以照常工作。...2、OSGI是一个微核的系统,所谓微核是指其核心只有为数不多的几个jar包。基于OSGI框架的系统可分可合,其结构的优势性导致具体的Bundle不至于影响到全局,不会因为局部的错误导致全局系统的崩溃。...使用OSGI的缺点如下: 1、每个Bundle都由单独的类加载器加载,与一些Java EE项目中使用比较多的框架整合比较困难,如Spring MVC、Struts2等,例如笔者尝试在OSGI应用中整合...在插件中可以定义独立依赖包了,再也不用在主程序中定义依赖包了。 可以完美解决插件包与插件包、插件包与主程序因为同一框架的不同版本冲突问题了。各个插件可以定义同一依赖的不同版本框架。
Java 类加载器 启动类加载器 (Bootstrap ClassLoader) 是 Java 类加载层次中最顶层的类加载器,负责加载 JDK 中的核心类库,如:rt.jar、resources.jar...和 servlet container 桥接起来,并且提供了一系列的 bundle 可以将 Equinox OSGI 应用嵌入到现有的 web 服务器中(eg..../index.html 总结 本文从 Java 类加载器说起,探讨了 OSGI 的类加载器原理并对 Equinox 中的 Servletbridge 原理实现进行了详细的研究,同时扩展到使用这一原理如何在...Spring boot 应用中嵌入 OSGI 开发和 Spring boot 应用如何与 OSGI 插件之间进行相互调用。...使用一个例子来对这一系列的使用做了进一步的讲解。并对它的实现方法做了进一步的探讨,这些探讨对于将 OSGI 应用嵌入到任何其他的系统中是一个启发和帮助,希望有兴趣的读者可以做进一步的了解和实现。
OSGi 服务平台向 Java 提供服务,这些服务使 Java 成为软件集成和软件开发的首选环境。...OSGi 技术提供允许应用程序使用精炼、可重用和可协作的组件构建的标准化原语,这些组件能够组装进一个应用和部署中。...OSGi 中的插件被称为 Bundle,每个 Bundle 是一个 Java 的 JAR 文件,每个 Bundle 里面都包含一个元数据文件 MANIFEST.MF,这个文件包含了 Bundle 的基本信息...例如,Bundle 的名称、描述、开发商、classpath,以及需要导入的包和输出的包等,OSGi 核心系统会将这些信息加载到系统中用于后续使用。...生命周期层精确地定义了 Bundle 生命周期的操作(安装、更新、启动、停止、卸载),Bundle 必须按照规范实现各个操作。 2.3.4 服务层(Service) 服务层实现插件通信功能。
项目中使用osgi架构,在处理xml解析的实现中使用了jdk自带的Javax.xml.bind包。...:(这里shade包是继承了jaxb的api,impl,runtime等包的合集) com.ruijie.osgi.thirdparty 2.3.1.v202203241600 原因分析 在引入的包中...猜测由于OSGi的隔离机制,在跨bundle使用过程中读取不到该配置文件。 解决 由于jaxb-api提供了SPI的扩展机制,基于他的实现很多,所以集成了如下的依赖解决该问题: api实现需要的依赖 --> com.ruijie.osgi.thirdparty <artifactId
JFace又是一种基于SWT的UI不见的API。Eclipse就是用这个开发出来的,它提供了Eclipse强大的扩展性,因此可以让用户任意的插入自己想要的插件,开发自己的IDE。 ...1 红色部分是我们的工具栏 2 蓝色部分是视图 3 黄色部分是编辑器 通常我们使用编辑器,进行代码操作,或者业务操作。在视图,进行一些资源的查看等。...4 使用插件模板,创建一个插件工具 ? 选择hello world.这是一个工具栏的按钮。 5 下一步,进行按钮的信息设置。 ? ...1 导入了插件所需要用到的jar包 2 导入了插件依赖的库 3 源文件 4 插件按钮图片 5 插件的配置信息 MANIFEST.MF 插件的捆绑信息 Manifest-Version: 1.0...SymblicName 是我们插件的包名 version 是插件的版本 Activator 是插件的激活类 Vendor 是插件开发者的信息 Bundle 是插件以来的库
resolution:="optional" Unresolved requirement: Import-Package: com.sun.xml.bind.api...: org.eclipse.persistence.moxy; bundle-version="2.7.1.v20171221-bd47e8f" at org.eclipse.osgi.container.Module.start....metadata\.plugins\org.eclipse.core.resources找到.projects文件 2.打开.projects文件,删除该目录下所有工程里的.markers.snap和....失败原因:.projects文件下所有工程里只找到了.markers文件,删除后Eclipse依然打不开 将configuration\org.eclipse.osgi\.manager路径下的.fileTableLock...当然还有一些是因为jdk版本的问题,我没有动我的jdk所以应该不是这个问题了 好了,说一下我是怎么解决的,经历过上面的种种操作,我把电脑关机,上午关机一直到晚上才打开,点击Eclipse发现可以打开了,我也懵逼中,
OSGI:以java为技术平台的动态模块化规范。OSGI拥有许多优秀特性,如动态性、模块化和可扩展力。它在OpenDaylight中被引用为后端技术框架。...OSGI就像建筑行业的装配式技术那样去组装和管理这些feature: 在OSGI中部署的最小单位是bundle(bundle就相当于一个普通的jar包),它就像预制的建筑构件,比如墙板、楼板、楼梯、阳台...它包含项目对象模型、标准集合、项目生命周期、依赖管理系统和用来定义生命周期阶段中插件和目标的逻辑。 在OpenDaylight里,Maven扮演着构件工厂的角色。...该maven工程生成了bundles和bundle aggregator。...Bundles分别是api, artifacts, cli,features, impl,it,karaf,src; bundle aggregator即为pom.xml。
简介 OSGi中的每个模块(称为Bundle)与普通的Java类库区别并不太大,两者一般都以JAR格式进行 封装[2],并且内部存储的都是Java的Package和Class。...不涉及某个具体的Package时,各个Bundle加载器都是平级的关系,只有具体使用到某 个Package和Class的时候,才会根据Package导入导出定义来构造Bundle间的委派和依赖。...如果一个类存在于Bundle的类库中但是没有被Export,那么这个Bundle的类加载器能找到这个类, 但不会提供给其他Bundle使用,而且OSGi框架也不会把其他Bundle的类加载请求分配给这个...加载方式从简单的树形变成平面网状 经典类加载结构 OGSI网状导入 在OSGi中,加载器之间的关系不再是双亲委派模型的树形结构,而是已经进一步发展成一种更为复杂的、运行时才能确定的网状结构。...否则,Import列表中的类,委派给Export这个类的Bundle的类加载器加载。 否则,查找当前Bundle的Classpath,使用自己的类加载器加载。
这些 SPI 的接口由 Java 核心库来提供,如 JAXP 的 SPI 接口定 义包含在 javax.xml.parsers 包中。...OSGi 已经被实现和部署在很多产品上,在开源社区也得到了广泛的支持。Eclipse 就是基于 OSGi 技术来构建的。 原理: OSGi 中的每个模块(bundle)都包含 Java 包和类。...模块可以声明它所依赖的需要导入 (import)的其它模块的 Java 包和类(通过 Import-Package),也可以声明导出( export)自己的包和类,供其它模块使用(通过 Export-Package...也就是说需要能够隐藏和共享一个模块中的某些 Java 包和类。这是通过 OSGi 特有的类加载器机制来实现的。OSGi 中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的 Java 包和类。...当它需要加载所导入的 Java 类时,它会 代理给导出此 Java 类的模块来完成加载。模块也可以显式的声明某些 Java 包和类,必 须由父类加载器来加载。
osgi和双亲委派模式不同,他是一个基于网状的互相组合依赖的加载。 Osgi的加载步骤是这样的: 如果类或者资源是在包java.*中,那么交由父级类加载器代理完成,否则,搜索过程进入第二步。...如果包中类或者和资源所在的包由其他bundle通过是使用Require-Bundle从一个或多个其他bundle进行导入的了,那么请求交由其他那些bundle的类加载器完成,按照根据在bundle的manifest...如果包中类或者资源所在的包由bundle导出,或者包由bundle导入(使用Import-Package或者Require-Bundle),查找结束,即类或者资源没有找到。...否则,如果类或者资源所在的包是通过使用DynamicImport-Package进行导入,那么试图进行包的动态导入。导出者exporter必须符合包约束。...如果找到了合适的导出者exporter,然后建立连接,以后的包导入就可以通过步骤三进行。如果连接建立失败,那么请求失败。 如果动态导入建立了,请求交由导出bundle的类加载器代理。
4、开发简单 OSGi 技术并不是组件化的一个标准,它也指定了组件是如果安装和管理的,这个API已经被很多挺管理代理的模块所使用。...标准化管理API很容易在现有和未来的系统中集成OSGi技术。 5、动态更新 OSGi 组件模块是一个动态的模块,模块可以在不需要停止整个系统的情况下被安装、启动、停止、更新和卸载。...7、透明性 软件包和服务在OSGi环境中是最高级的。管理API不但提供了对软件包内部状态的访问而且也也提供了如何去和其他包做对接。...15、非侵入 在一个OSGi的环境中,不同软件包均有自己的环境设置,不同应用实际是都可以使用虚拟机提供的所有设施,OSGi对此并无任何限制。...一是OSGi API应该使用能在所有环境中都有效的类;二是如果bundle包含了在某个执行环境中无效的代码,那么这个bundle就不能在该环境中启动。在OSGi规范中,这两个问题都得到了解决。
;bundle-version="1.6.100", org.slf4j.api;bundle-version="1.7.2", io.jfxcef;bundle-version="76.0.0"...bundle遵循规范的规则 1:OSGI的R3规范 2:OSGI的R4/R5规范 Bundle-Name bundle名称 Bundle-SymbolicName 唯一的bundle名称 相当于系统...singleton表示是否使用单启动方式 Bundle-Version bundle版本号 Bundle-Activator Activator类路径 bundle启动和停止时,分别会加载该类的start...()和stop() Bundle-Vendor 发布商 Require-Bundle 依赖的其他bundle 一旦声明依赖某个bundle,意味着可以直接使用所有从这个bundle中导出的所有package...设置lazy标识延迟加载该bundle Export-Package 对外暴露的Package Import-Package 引用包的信息 只有引用了这些包,才能让classloader装载 Fragment-host
虚拟化版本中的OVSDB neutron bundle支持使用VXLAN和GRE隧道部署OpenStack和CloudStack的网络虚拟化。...2、VTN Manager(Virtual Tenant Network):VTN manager是网络虚拟化的一种解决方案,实现了一个使用AD-SAL的控制器的OSGI bundle,可以管理OpenFlow...VTN manager还可以使用OVSDB-enhanced VTN。Neutron bundle可以使用OVSDB插件进行添加端口等操作。...实际的操作流程是VTN manager的Neutron组件调用前者的核心功能,使用OpenFlow(1.0)插件逐个配置OpenFlow交换机。 使用所有的bundle创建网络 ?...该图帮助读者理解所有bundle中的控制流。