背景及解决方案
咱们假如一个状况,hbase的reader是1.0版本的,hbase的writer是2.0版本的,所以他们依赖的jar包版本也不统一,如果间接一起加载到JVM虚拟机,那就会有jar包的抵触。
为了防止抵触,就须要给每个插件都设置一个本人的类加载器(类加载的程序参考之前的jvm – 类的加载),这样不同版本的jar包就不会抵触。
上面用streamreader的job初始化具体的解说这个流程。
JarLoader
JarLoader是每个插件的类加载器,为了防止反复的生成,会通过map的模式寄存在内存jarLoaderCenter中,key就是plugin.pluginType.pluginName,value就是JarLoader。
pluginType是一个枚举,包含reader、writer、transformer、handler,pluginName就是插件的名称。比方streamreader的key就是plugin.reader.streamreader。
每次获取类加载器的时候,就会从jarLoaderCenter中获取,如果有对应的key-value,就返回JarLoader,如果没有,就创立一个JarLoader,并存入jarLoaderCenter再返回JarLoader。
JarLoader创立
如果jarLoaderCenter没有对应的JarLoader,就会创立一个JarLoader。
首先是获取门路path,就是读取reader.streamreader的plugin.json配置文件中生成的path信息。
在创立JarLoader的时候,就会把path门路的jar文件以及子门路的jar文件都退出退出到class path中,所以每个插件所须要的jar包在通过JarLoader加载的时候是互相隔离的,这样就防止的jar包抵触。
比方加载的时候,streamreader除了把streamreader-0.0.1-SNAPSHOT.jar加载进来,也会加载libs以下的包。
ClassLoaderSwapper
因为咱们须要在不同的中央应用不同的类加载器,所以在应用之前就须要对类加载器进行切换。
比方以后(用黄色代表)的类加载器是A,咱们当初应用类加载B。
咱们首先把以后的类加载器存起来,放入紫色(storeClassLoader)中暂存。而后再把须要应用的类加载B放入黄色中,代表以后应用的类加载是B。
而后就能够应用B进行类加载,当应用完后,就须要把暂存在紫色的类加载器进行还原。