Heritrix的Modules界面不能改变选择项的问题

时间:2021-08-25 14:37:37

在Eclipse环境中配置好我的Heritrix后,就可以使用Heritrix了。(参见:在Windows平台上配置Heritrix的Eclipse开发环境)。很快我就遇到了第一个问题(实际是两个,但是只能先解决第一个了)。我在新建Job的时候,按照书上说的,先选Jobs,再Withdefauls,再输入名字,然后”Modules”,这时候我发现我的界面和书上说的不一样。书上说这个界面里面应该是显示现在已经缺省设置的Scope,Frontier,PreProcessor,Fetcher,Extractor,Writer,PostProcessor,然后用户可以选择添加或者替换这些Class的。但是我的界面里面只显示了现在设置的Class,可以改变次序,可以删除。但是所有本来应该是添加新Class或者改变现在选择项目的功能在我的界面上都没有。例如书上说缺省有CrawlScope,可以选HostScope,我这里只有DecidingScope,没有下面的列表框可以选择其他的。我的Writer也只有ARCWriterProcessor,没有其他的。

我本想先这么试试看的,就没有改选择而是直接启动了Job。首先发现速度非常慢,抓我这个www.sitemasterkit.com,一共100来页文章用了一个小时(我自己拷都比这快,猜测可能和我在Eclipse中运行有关系,先不管它)。然后发现抓完存在本地的是一个XXXX.arc.gz的文件。先用WinZIP将其解成XXXX.arc,但是再想解这个arc文件,无论7-ZIP,WinZIP还是WinRAR都报错。我想可能是ARCWriterProcessor的问题。在工程目录中查找,发现和ARCWriterProcessor在同一个Package中还有好几个其他的Processor,尤其是MirrorWriterProcessor应该是只做镜像的,好像是我的需求。现在要想办法把它用上。

因为我知道所有Job的设置都在 order.xml里面,我先看看里面有没有关于Writer的设置。很容易找到了关于ARCWriterProcessor的部分。

<map name=”write-processors”>
<newObject name=”Archiver” class=”org.archive.crawler.writer.ARCWriterProcessor”>
<boolean name=”enabled”>true</boolean>
<newObject name=”Archiver#decide-rules” class=”org.archive.crawler.deciderules.DecideRuleSequence”>
<map name=”rules”>
</map>
</newObject>
<boolean name=”compress”>true</boolean>
<string name=”prefix”>IAH</string>
<string name=”suffix”>${HOSTNAME}</string>
<long name=”max-size-bytes”>100000000</long>
<stringList name=”path”>
<string>arcs</string>
</stringList>
<integer name=”pool-max-active”>5</integer>
<integer name=”pool-max-wait”>300000</integer>
<long name=”total-bytes-to-write”>0</long>
<boolean name=”skip-identical-digests”>false</boolean>
</newObject>
</map>

先简单试试,把ARCWriterProcessor改成了MirrorWriterProcessor。然后生成一个新Job看看。结果浏览器得到了一个java.lang.ClassCastException: java.lang.String cannot be cast toorg.archive.crawler.settings.ListType。在我的Eclipse窗口可以看到:

03/11/2008 03:52:15 +0000 WARNINGorg.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandlerendElement Unknown attribute ‘compress’ in‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 181,column: 48
03/11/2008 03:52:16 +0000 WARNINGorg.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandlerendElement Unknown attribute ‘prefix’ in‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 182,column: 43
03/11/2008 03:52:16 +0000 WARNINGorg.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandlerendElement Unknown attribute ’suffix’ in‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 183,column: 51
03/11/2008 03:52:16 +0000 WARNINGorg.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandlerendElement Unknown attribute ‘max-size-bytes’ in‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 184,column: 59

我想应该是order.xml中后面部分的属性是为ARCWriterProcessor服务的,而MirrorWriterProcessor不认。没办法,只好下决心先来解决不能选择其他的Class的问题了。希望通过界面选择合适的Writer可以帮我正确设置需要的参数。

首先需要定位是在哪里确定显示这个页面的。这个页面上有几个标志字符串,例如“SelectWriters”。在Eclipse中全局查找,发现这个页面是在webapps->admin->jobs下面的Modules.JSP生成的,其中有这么一个调用(我没用过JSP,猜想和Java语法差不多吧)

<p>
<b>Select Writers</b>
<i>Processors that write documents to archive files</i>
<p>
<%=buildModuleMap(
(ComplexType)settingsHandler.getOrder().getAttribute(
CrawlOrder.ATTR_WRITE_PROCESSORS),
Processor.class,
“Writers”)%>

看样子选择部分就是靠这个buildModuleMap来生成的,这个函数的定义在webapps->admin->includes->modules.jsp(还有一个在webapps->admin->includes->jobcredentials.jsp,但是通过加打印发现调用的是这个)。其中主要有3部分功能,第一部分用于显示现在已经选择的项目,第二部分是统计还有多少可以选择的配置项目,第三部分就是如果判断还有可以选择的配置项目,就显示让用户选择。跟踪发现就是第二部分数出的数字unusedOptions.size()是0,所以第三部分没有得到调用。再向前跟踪,发现第二部分的循环是基于函数第一句的一个变量定义来的,List availableOptions =getOptionsForType(allowableType),这里的availableOptions里面的元素个数是0,造成第二部分也没有执行。现在看起来问题就是出在getOptionsForType(allowableType)没有返回需要的列表。

进入 getOptionsForType函数,基本一眼就可以看出问题了。这个函数里面除了returnCrawlJobHandler.loadOptions(optionsFilename);一句有意义的话以外,就是前面的设置变量和后面的Exception处理了。基本猜测就是出了Exception。加打印看了一下(发现Eclipse可以直接修改代码不重启就生效,和解释语言差不多了),果然是在Classpath没有找到需要的文件。看了一下,找相关的Options文件是在Modules相对路径下的,而Modules目录是在conf目录下。在Eclipse里面设置conf为Classpath( 在Eclipse的RunDialog中,Classpath标签Table,选中User Entries,然后右边会有Advance选项,选Add ExternalFolder,把你的Conf加进去就行了)。再试,在Modules页面中的功能正常了。

简单来看,这真的是一个小问题。但是却用了我差不多4个小时。实际还是网上相关的资源太少了,例如我就没有找到一个详细一些地说如何在Eclipse下配置Heritrix的文章,只好自己写一篇了。而我实际对Eclipase和Heritrix都是新手。本文我写得这么详细,也就是希望能对万一遇到这个问题的朋友有个帮助。也希望大家能一起努力让网上的相关文章逐渐多起来。