目录
3.2 Bundle的Classloader的隔离机制以及类共享机制
1.简介
OSGi(Open Service Gateway Initiative),The Dynamic Module System For Java,从这个定义可见,OSGi的主要职责就是为了让开发者能够构建动态化、模块化的Java系统。此处要讲的是利用这个技术解决Jar包冲突问题,在一个maven项目中如果依赖的jar包存在版本冲突,或者其传递的依赖冲突,会被maven仲裁出一个来加载,因为其类全限定名完全一样只能加载一个。利用OSGI核心原理就是通过不同的类加载器(类似于命名空间)来隔离同一个类(全限定名)的不同版本,从而解决冲突。
2.基本概念
2.1 Bundle
Bundle就是一个特殊的jar包,特殊的在META-INF目录下的MANIFEST.MF文件中加入了OSGi特定描述。如下
2.1.1 隔离
为什么要隔离各个bundle呢?由于应用一旦臃肿,依赖很多jar包,jar包传递的依赖可能存在冲突。
核心原理是利用ClassLoader当作命名空间,每个Bundle都有自己独立于其他Bundle的ClassLoader,正因为这样,各个Bundle内部的类是隔离的。
2.1.2 交互
一个孤岛注定啥也干不了,一个独立的budle有啥用呢?引入一个bundle一定是使用方需要用到,怎样使用呢?
一个Bundle可能会用到另外Bundle的类,Bundle之间是要交互的,这是怎么实现的呢?本文主要介绍Service方式
Bundle间交互方式 | |
---|---|
1.通过Package的Export和Imoprt来进行 | 提供者Bundle对外暴露(Export)自己的一个或多个Package, 使用者Bundle则根据自己的需要导入(Import)一个或多个Package。 |