之前发表了一篇博客,是nutch在crawl的时候无论如何都找不到crawl类,今天解决了。之前的环境是cygwin模拟的linux环境,我以为是cygwin的问题,所以干脆装了一个linux虚拟机来跑nutch,依然找不到crawl类,所以我怀疑cygwin的环境下出现的这个问题也应该用以下解决办法。
问题解决的重要办法 :读源码 - 读 nutch1.4/src/bin/nutch 文件的源码
切入点 :crawl类找不到是报的classloader not found ,说明JAVA的路径没问题,也就是java是可以运行的,是classloader不能找到crawl,而根据java的classloader加载规则应该是在classpath中去找crawl类的 所以很明显跟nutch文件中配置的classpath是什么样子的很有关系。请看下面nutch文件的配置。
NUTCH1.4 HOME 下的目录树结构 (里面的build包应该是木有的 请淡定 具体怎么出来的请继续看文章)
NUTCH_HOME的配置 (这个配置的意思就是说NUTCH_HOME=你目前执行 bin/nutch 命令的所在目录 因为nutch1.4解压后的目录树格式的特殊情况,在nutch1.4解压包下面有个src包,这个包下才有bin包,所以要在src下面才能运行bin/nutch 那么下面读出来的就是NUTCH_HOME=nutch1.4/src了 ,这样是绝对不对的,因为src包和conf包还有一些其他的配置文件都是同级的在nutch1.4包下的,也就是NUTCH_HOME应该也必须是nutch1.4,不应该在src下的 不知道大家听明白了没有 就是说这里NUTCH_HOME=nutch1.4 我后来改过来了 所以你们看我把原来的给注释掉了 自己写上NUTCH_HOME=/usr/local/nutch/nutch1.4)
CLASSPATH的配置 (crawl类以及其他需要的类都在这个下面读取 所以classpath很重要,通过下面可以看见1.先对CLASSPATH赋值,然后如果local是true的话,当然前面的一系列操作导致local是true,那么就把NUTCH_HOME下的lib中的所有JAR包拷贝到classpath下面,这下明白了吗??如果NUTCH_HOME/lib下面有Crawl类的话,那肯定会被拷贝到classpath下的,也肯定会找到的,所以之前nutch的home就是错的,也就是肯定找不到lib,因为src下面哪有lib啊!!所以NUTCH HOME改过来了就好多了,当然我说的是好多了,因为问题还没完呢,更要命的是下载的NUTCH1.4解压后lib中空无一物,根本就没有JAR包,更别提crawl的JAR包了,所以怎么搞这些JAR包去呢?请往下面继续看 )
*生成NUTCH1.4.JAR - 自己动手 丰衣足食
NUTCH1.4下的src文件下有个JAVA文件,这里是所有类的源码,大家可以看见,crawl类是有的,但没被编译放到Classpath下,但NUTCH1.4下面是有个build.xml文件的,所以,我们用ANT自己可以build出来一个JAR包,然后丢到NUTCH1.4下就好了,因为前面我们已经说了,NUTCH1.4就是NUTCH_HOME
装ANT大家会吧?如果不会的话网上一找一大堆很简单的。
用ANT构建build.xml的过程中会出现各种问题,这时候我要提醒一句,因为Ant编译的过程中涉及包的操纵,所以有权限的问题,就是Sudo,你不可能自己写sudo吧,所以最好都切换到root下哈。
构建好后大家发现NUTCH1.4下lib下根本就木有JAR包,是因为JAR们都在Build/lib下呢 用CP命令拷贝过去就搞定了
问题解决。
运行CRAWL命令可能还存在其他问题,包括跟HADOOP集成的问题,回来我再写篇博客再说,希望这对大家有帮助!