加载外部插件,为了避免依赖冲突,需要自定义类加载器,然后用自定义类加载器创建reader类,最后类加载器要换回原本的。

getJarLoader
首先获取pluginConf,pluginConf是在一开始生成configuration就已经注册了。内容就是插件下面的plugin.json文件内容。

plugin.json(pluginConf) 中最主要的是name和class,name跟job配置中一致,class是对应的要加载的类的全限定路径名。

生成jarLoader
优先从_jarLoaderCenter_缓存中获取,要是没有就创建并放到缓存中。

jarLoader会加载对应路径下面的所有jar。这里的jar和libs里面的依赖jar都会加载。

缓存当前的classLoader
ClassLoaderSwapper负责缓存classLoader,只有两个方法,一个缓存当前classLoader,一个还原成缓存的classLoader。

加载JobPlugin

可以看到使用对应的jarLoader来加载job类,因为是内部类,所以名称是{plugin类名}$Job

还原缓存的classLoader
为什么要新建一个jarLoader来加载plugin对应的类和依赖类?

java类加载是双亲委派模型:要是一个类加载器要加载,它不会先加载,而是交给它的父级类加载器来加载,只有父加载器无法加载才会到子加载器加载,这样保证相同名称的类只会被加载一次。
但是在datax插件开发,一方面datax插件jar和datax的框架jar是隔离的,在运行的时候只会加载相应的插件,而不是加载全部插件,另一方面会碰见jar之间依赖版本冲突的情况,比如common的版本不一致、hbase版本不一致不能启动。
2481

被折叠的 条评论
为什么被折叠?



