前言
kettle遵循着插件机制,基于插件使得kettle整个结构非常清晰,耦合性低,移植性强,特别是对kettle进行二次开发尤其方便,根据了解,扩展step类型的插件比较多,具体步骤可以参考:http://blog.csdn.net/d6619309/article/details/50020977 。通过了解插件的加载流程,不仅kettle的原理有深一层的认识,还有助于在进行二次开发遇到问题的时候进行定位(例如,最近遇到个情况就是通过kettle api创建资源库,但在使用spoon工具保存转换到该资源库时出错,其实就是因为资源库中step类型与实际中step插件不一致导成的,造成不一致的原因是因为通过api创建资源库时kettle环境中加载不到某些插件信息),本文是基于kettle5.x,插件类型很多,选取StepPluginType类型为例进行描述。
PluginRegistry了解
PluginRegistry是一个提供所有访问所有kettle插件的单例。可以通过它注册插件类型以及插件,还可以查询每种类别的插件,挑几个以下会用到的属性进行说明
-
Map< Class< ? extends PluginTypeInterface>, List> categoryMap:插件类型->该类型插件的类目,category对应spoon工具左侧的插件种类,如:‘输入’,’输出’等
-
List< PluginTypeInterface> pluginTypes:保存了kettle的插件类型,在环境初始化的时候会把所有类型添加到该list里面。
-
Map< Class< ? extends PluginTypeInterface>, List> pluginMap:插件类型->该类型的具体插件,例如:StepPluginType->[表输入,表输出…]
插件加载–PluginRegistry.init()
- 注册PluginRegistryPluginType插件类型,并获得该类型的插件并加载初始化,最后保存到List extensions,可以不关注该步骤
- 调用registerPluginType(StepPluginType)方法进行注册:
- 把StepPluginType添加到pluginMap中,如果StepPluginType未注册,则初始化一个空的List用来保存该插件类型的具体插件
- 把StepPluginType添加到categoryMap中,如果StepPluginType未注册,则初始化一个空的List来保存该插件类型的类目
- 把插件类型注册之后,根据该类型查找所有该类型的具体插件,它会通过3种方式来加载:
- registerNatives():查找原生的step插件。首先加载kettle-steps.xml(该配置文件在kettle-engine模块中)获取里面所有step配置,可以在环境变量中设置“KETTLE_CORE_STEPS_FILE”来覆盖默认的kettle-steps.xml;然后调用
registerPluginFromXmlResource()
,解析出step所有的属性,根据属性构造出来个Plugin对象;接着,把该插件信息保存到pluginMap与categoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。 - registerPluginJars():根据jar包注册插件(通过注解方释来描述插件)。首先,Windows下先会默认从
[plugins, plugins\steps, C:\Users\Administrator\.kettle\plugins, C:\Users\Administrator\.kettle\plugins\steps]
这几个目录中查找StepPluginType类型的插件jar包;然后,调用handlePluginAnnotation():通过注解解析出所有插件相关的描述属性,并构造Plugin对象;接着,把该插件信息保存到pluginMap与categoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。 - registerXmlPlugins():根据xml配置文件注册插件。首先,Windows下先会默认从
[plugins, plugins\steps, C:\Users\Administrator\.kettle\plugins, C:\Users\Administrator\.kettle\plugins\steps]
这几个目录中查找StepPluginType类型插件的配置文件:xxxplugin.xml;然后,解析节点内容,并调用registerPluginFromXmlResource(),解析出step所有的属性,根据属性构造出来个Plugin对象;接着,把该插件信息保存到pluginMap与categoryMap对应插件类型的value(List)中;最后 ,触发该插件类型的添加、改变插件的事件 。 - 还可以从环境变量中读取“KETTLE_PLUGIN_CLASSES”的值,从中加载指定的插件,该方法对调试模式非常有利,可以通过在eclipse中启动spoon时添加VM arguments:
DKETTLE_PLUGIN_CLASSES=org.pentaho.di.trans.steps.gpload.GPLoadMeta,org.pentaho.di.core.database.PALODatabaseMeta //以逗号隔开