1.2 插件(Plugin)
Nutch中的插件实际上是一系列自定义逻辑的容器,而这些自定义逻辑为Nutch的核心功能提供扩展和为其它插件提供扩展API。一个插件要提供一个或者一组扩展。而对于扩展点来说(ExtensionPoints)来说,这些扩展都可以被看做是一组可以被动态加载的监听器。每一个具体的插件都扩展自基类Plugin,而这些实例又被用于去管理相关功能的生命周期。插件打开与关闭都由Nutch的插件管理系统来操作。
1.4 扩展点(ExtensionPoint)
扩展点提供了一类具体功能扩展的元信息,它包含了具体的扩展。lemo@debian:~/Workspace/java/Apache/Nutch/nutch-1.3$ bin/nutch plugin Usage: PluginRepository pluginId className [arg1 arg2 ...]
bin/nutch plugin protocol-http org.apache.nutch.protocol.http.Http -verbose -timeout 10 http://www.baidu.com
public static void main(String[] args) throws Exception { if (args.length < 2) { System.err .println("Usage: PluginRepository pluginId className [arg1 arg2 ...]"); return; } // 生成Nutch的配置 // 这里主要使用的参数是plugin的目录名,还有plugin.includes包含哪些要读取的plugin Configuration conf = NutchConfiguration.create(); // 根据配置生成一个插件仓库,并且对其进行初始化 PluginRepository repo = new PluginRepository(conf); // args[0] - plugin ID // 根据插件ID得到特定的插件描述符 PluginDescriptor d = repo.getPluginDescriptor(args[0]); if (d == null) { System.err.println("Plugin '" + args[0] + "' not present or inactive."); return; } // 从插件描述符对象中得到类加载器 ClassLoader cl = d.getClassLoader(); // args[1] - class name Class clazz = null; try { // 加载对应的类 clazz = Class.forName(args[1], true, cl); } catch (Exception e) { System.err.println("Could not load the class '" + args[1] + ": " + e.getMessage()); return; } Method m = null; try { // 得到特定的main方法 m = clazz.getMethod("main", new Class[] { args.getClass() }); } catch (Exception e) { System.err.println("Could not find the 'main(String[])' method in class " + args[1] + ": " + e.getMessage()); return; } String[] subargs = new String[args.length - 2]; System.arraycopy(args, 2, subargs, 0, subargs.length); // 这里是运行插件的main方法 m.invoke(null, new Object[] { subargs }); }