想把nutch-1.2的源码加载到MyEclipse中,所有的文件都加载成功了,而且在MyEclipse中也没有错误,然后运行Crawl.java类出现了下面的错误。
org.apache.nutch.plugin.PluginRuntimeException: java.lang.ClassNotFoundException: org.apache.nutch.net.urlnormalizer.basic.BasicURLNormalizer at org.apache.nutch.plugin.Extension.getExtensionInstance(Extension.java:170) at org.apache.nutch.net.URLNormalizers.getURLNormalizers(URLNormalizers.java:172) at org.apache.nutch.net.URLNormalizers.<init>(URLNormalizers.java:128) at org.apache.nutch.crawl.Injector$InjectMapper.configure(Injector.java:70) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:88) at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64) at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) at org.apache.hadoop.mapred.MapRunner.configure(MapRunner.java:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:88) at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:64) at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:117) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:354) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307) at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)
通过跟踪代码发现:是因为Extension类中getExtensionInstance()方法的Class extensionClazz = loader.loadClass(getClazz());这条语句出现了错误。这是一句很标准的使用ClassLoader加载类实例的语句,他不会出现错误,只能是被加载的插件出现了错误。
通过学习ClassLoader使用方法知道,被加载的类必须被编译成为.class的文件才可以,我的plugin目录下的所有类都还没有编译所以出现了上面的错误,通过将plugin中的所有类编译成.class类之后,再运行上面的代码问题就得到了解决。
下面是ClassLoader的使用方法:
一般的class都是由系统类加载器、或者其父加载器或者bootstartup加载器加载的,但在应用中可以指定类的加载器,然后将生成的class对象造型为具体的类。
public class LoadClass {
}
}