觉得这块也是蛮重要的,所以得要认真学了。
但检索到网上讲得不是很清楚,要么就是背书一样;要么 就是没深入到点子上。
这里可以说 是作为一种扩展吧,希望可以对那么有所额外的补充。
一.概念
PluginClassloader:利用self-defined的来指定具体的loader,只是名称变了,其实是URLClassLoader,因为plugin所依賴 的libs及files均转换file to url形式来加载的。
PluginRepository:plugin的管理类,可以说是代理吧,重头戏的是将所有的plugin.xml解析封装,所以它包含很多形如
PluginDescriptor,Plugin,Point等cached maps.
Plugin:在plugin.xml中,用户可以定义一个customerized的class(必须继承Plugin.java),来扩展默认的实现(默认的start(),shutdown()是不做任何事的)。所以其实就是一个plugin.xml对应一个Plugin.另外,它内置了PluginDescriptor,所以说,Plugin与PluginDescriptor是1对1关系.一个Plugin可以被安装和御载。
PluginDescriptor:与Plugin是对应的,它包含了一个plugin.xml的metadata,extension-points(只有nutch-extensinos/plugin.xml才有),exportedlibs,notexportedlibs,PluginClassloader等等。其实这此属性基本上就是xml中的属性。
ExtensionPoint:只有nutch-extensions/plugin.xml中才有此定义,它表明nutch的一个内置class或interface,用户真正扩展的是这些接口。当然了,因为一个point可以被多个customerized classes来实现,所以其中也含有若干extension(s)。
Extension:在一个plugin.xml中,可以有若干个extension元素 ;而每个元素下也可以有若干个implemention元素。这样的情况可以在若干个plugin.xml有同样的定义,那么Extension(s)可以认为是所有这些implemention(s)。即事实上,point与extension是1对多的关系。因而它包含Plugindescriptor,point,class和params等variables.
plugin.dtd:一个plugin.xml的document type definition
nutch-default.xml:包含plugin的excludes & includes plugin,加载plugins顺序等参数默认配置。
nutch-site.xml:site special configs
--举例说明--
QueryFilter:extension point
BasciQueryFilter: 具体的一个point实现之一
path-to-plugin/plugin.xml:真正的实现point(s)的所有配置文件
nutch-extension/plugin.xml:nutch core extension points,其它plugin.xml下的point值必须在这里定义过才起作用。
二. 配置/数据结构
nutch-extensions/plugin.xml
<plugin id="nutch-extensionpoints" name="the nutch core extension points" version="0.8.0" provider-name="nutch.org"> <!-- this file hosts all extension points nutch core code offers. Please not(note?) that plugins can define extension points as well to be extendable. 这里的id就是相应plugin.xml下的extension.point属性! --> <extension-point id="org.apache.nutch.clustering.OnlineClusterer" name="Nutch Online Search Results Clustering Plugin"/> <extension-point id="org.apache.nutch.indexer.field.FieldFilter" name="Nutch Field Filter"/> ... </plugin>
other plugin.xml,for example query-basic/plugin.xml:
<!--global:plugin (runtime?, requires?, extension-point*, extension*)-->
<!-- plugin:id,name,version are must;class is optiona
l -->
<plugin
id="query-basic"
name="Basic Query Filter"
version="1.0.0"
provider-name="nutch.org">
<!--运行时由classloader加载和实例的包,可以说是由ant生成的包名;
所以export表明此包应该导出的文件
-->
<runtime>
<library name="query-basic.jar">
<export name="*"/>
</library>
</runtime>
<!--运行此plugin需要用到的依赖points;这里是nutch的core point-->
<requires>
<import plugin="nutch-extensionpoints"/>
</requires>
<!--extension:此plugin实现point的extention(s),point是必须的且在nutch-extensiionpoints/plugin.xml
中有定义;id可以不唯一,也没有用到 -->
<!-- implementation:实现此point的类,both id and class are must
实际处理时会将一个implemention作一个Extention实例处理,
-->
<!-- parameter:此extention在运行时用到的KV常量,可选但对extensino唯一 -->
<extension id="org.apache.nutch.searcher.basic"
name="Nutch Basic Query Filter"
point="org.apache.nutch.searcher.QueryFilter">
<implementation id="BasicQueryFilter"
class="org.apache.nutch.searcher.basic.BasicQueryFilter">
<parameter name="fields" value="DEFAULT"/>
</implementation>
</extension>
</plugin>
nutch-site.xml
<property> <name>plugin.includes</name> <value>protocol-http|urlfilter-regex|parse-(text|html)|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-(link|opic)|urlnormalizer-(pass|regex|basic)</value> <description>NOTE:THIS VALUE MANYE HAVE BEEN CHANGED!. </description> </property> <property> <name>plugin.folders</name> <!-- crawl/产品环境--> <value>plugins</value> .... </property> ...
三.运行流程
四.小结
插件这块也是繁锁的,刚看时会很晕,很多相关的类说明不够詳細,对应关系没说清楚。
不过话又说回来 ,其实想知道一个class的功能也容易的,只要看name和其中的fields也基本上清楚了,因为无非就是一个输入,处理,输出的过程;两者看看相关的methods就有个基本。
机制特点:
*使用lazy loading原则提交效率;
*使用1:n方式,只要定义好point,就可以在xml指定多个implementions,灵活方便;
*使用缓存形式提交效率;
*支持依赖性检查,避免代码重复冗余;
*灵活的过滤机制 ,减少直接代码处理引起 的风险;
references: