现在的位置: 首页 > 综合 > 正文

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

2014年09月05日 ⁄ 综合 ⁄ 共 4172字 ⁄ 字号 评论关闭

在Eclipse环境中配置好我的Heritrix后,就可以使用Heritrix了。(参见:在Windows平台上配置Heritrix的
Eclipse开发环境)。很快我就遇到了第一个问题(实际是两个,但是只能先解决第一个了)。我在新建Job的时候,按照书上说的,先选Jobs,再
With
defauls,再输入名字,然后”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 to
org.archive.crawler.settings.ListType。在我的Eclipse窗口可以看到:

03/11/2008 03:52:15 +0000 WARNING
org.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandler
endElement Unknown attribute ‘compress’ in
‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 181,
column: 48

03/11/2008 03:52:16 +0000 WARNING
org.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandler
endElement Unknown attribute ‘prefix’ in
‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 182,
column: 43

03/11/2008 03:52:16 +0000 WARNING
org.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandler
endElement Unknown attribute ’suffix’ in
‘file:/E:/Heritrix/src/conf/profiles/default/order.xml’, line: 183,
column: 51

03/11/2008 03:52:16 +0000 WARNING
org.archive.crawler.settings.CrawlSettingsSAXHandler$SimpleElementHandler
endElement 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可以帮我正确设置需要的参数。

首先需要定位是在哪里确定显示这个页面的。这个页面上有几个标志字符串,例如“Select
Writers”。在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函数,基本一眼就可以看出问题了。这个函数里面除了return
CrawlJobHandler.loadOptions(optionsFilename);一句有意义的话以外,就是前面的设置变量和后面的
Exception处理了。基本猜测就是出了Exception。加打印看了一下(发现Eclipse可以直接修改代码不重启就生效,和解释语言差不多
了),果然是在Classpath没有找到需要的文件。看了一下,找相关的Options文件是在Modules相对路径下的,而Modules目录是在
conf目录下。在Eclipse里面设置conf为Classpath( 在Eclipse的Run
Dialog中,Classpath标签Table,选中User Entries,然后右边会有Advance选项,选Add External
Folder,把你的Conf加进去就行了)。再试,在Modules页面中的功能正常了。

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


抱歉!评论已关闭.