weblucene在windows下安装编译[转]

这几天刚刚开始接触weblucene,首先第一个问题就是安装,这对于我这个刚刚开始用java的人就成了一个大问题,经过几番周折终于完成了,并且初步尝试了一些很有用的东西:javacc, ant,tomcat 这些基本东东的安装,环境变量的设置,以及ant的基本语法,并借初步接触了xml。原来xml就是一种很好用很通用的脚本语言,很多其他的工具(如ant编译器)建立在它的基础上,而语法则是ant自己定义的(呵呵,现在我自己是这样理解的)。在整个过程中,我每遇到一个问题首先是上网查查别人的经验,这样做确实比自己翻书快得多。但也会造成理解不透彻的结果,就是得到了结果,却不知道为什么这样做就可以,为什么自己先前的做法就不可以,而且网上的人提供的方法也不尽正确。

首先上面讲的:

输入:ant build,就是错的,应该只输入ant然后回车。还是再看一次那篇ant快速入门吧:http://www.54bk.com/more.asp?name=tjdream&id=19364

快速入门

下面用一个最简单也是最经典的例子-HelloWorld来感受一下Ant吧。

//HelloWorld.java

package com.sharetop.antdemo;

public class HelloWorld  {

 public static void main( String args[] ) {

  System.out.println("Hello world. ");

 }

}

要让Ant编译这个文件,首先需要编写一个Build配置文件。在一般情况下,这个文件被命名为build.xml。

<?xml version="1.0" encoding="UTF-8" ?>

<project name="HelloWorld" default="run" basedir="." >

<property name="src" value="src"/>

<property name="dest" value="classes"/>

<property name="hello_jar" value="hello.jar" />

<target name="init">

<mkdir dir="${dest}"/>

</target>

<target name="compile" depends="init">

<javac srcdir="${src}" destdir="${dest}"/>

</target>

<target name="build" depends="compile">

<jar jarfile="${hello_jar}" basedir="${dest}"/>

</target>

<target name="run" depends="build">

<java classname="com.sharetop.antdemo.HelloWorld" classpath="${hello_jar}"/>

</target>

</project>

来看一下这个文件的内容,它描述了以下信息:工程的名字为HelloWorld,工程有四个target,分别是init、compil、build和 run,缺省是run。compile只有一个任务javac,源文件位于src目录下,输出的类文件要放在classes目录下。build的任务是 jar,生成的jar文件为hello.jar,它打包时以classes为根目录。而run则是执行这个HelloWorld类,用hello.jar 作为classpath。这四个target之间有一个依赖关系,这种关系用depends来指定。即如果Target A依赖于Target B,那么在执行Target A之前会首先执行Target B。所以从下面运行缺省Target(run)的输出看,这四个Target的执行顺序是:init→compile→build→run。文件目录结构 如图1所示。HelloWorld.java文件在src\com\sharetop\antdemo子目录下。

图1 ant_demo应用的目录结构

在命令行输入命令:ant,然后运行,可以看到如下输出:

如果配置文件名不是build.xml,比如是build_front.xml,那么,可以使用-buildfile命令参数指定:

G:\myDoc\ant_demo>ant -buildfile build_front.xml

也可以单独执行指定的某个target,比如,只编译不打包执行,可以使用下面输入命令即可:

G:\myDoc\ant_demo>ant compile

在相应的目录下会找到编译出的HelloWorld.class文件。

再看看上面的build.xml配置文件,文件开头定义了3个属性,分别指定了源文件输出路径、类文件输出路径和生成的Jar文件名,后面对这些路径的引用都通过一个${property name}来引用。所以,要注意这样一个原则“目录的定义与目录的引用应该分开”。

所以,如果想要<project default..>生效的话,就直接输入ant然后回车,万万不可再加上多余的build了。这样,因为开始默认的project default只是“usage”(usage这个target的含义其实是打印教本的帮助信息,然后就会显示“Please rename build.properties.default to build.properties”等信息,所以现在明白了为什么要将这个文件的名字改过来了。(以前觉得作者很高深的,怎么会想到该这个呢。)上面那位 作者还做了一些多余的工作,比如自己手工建立build和classes两个文件夹,有将src手工复制到build下面,其实只要看看 build.xml文件就会发现这部分工作已经做了,只要设法让整个编译过程执行就行了。首先我将default改成了“jar”(其实应该让 jardoc等完整的执行,我想如果想这样可以增加一个“all”taget吧,现在先这样了),这样就可以执行整个编译过程了。但发现:

mkdir dir="${build.src}"/>

    <mkdir dir="${build.dest}"/> 

    <!-- copy src files -->

    <copy todir="${build.src}">

      <fileset dir="${src.dir}"/>

    </copy>

这部分代码并没有被执行,屏幕上提示找不到classes文件。这就是为什么作者要手工加上这个包以及copy src的原因。注意一下:<target name="prepare-src" depends="javacc" >后面紧跟的if=…(关于if和unless的含义参考:

http://www.youren.com/Article/programme/java/else/200503/3058.html。只要去掉这部分的判定就行了。所以这样就不用手工操作了,可以一口气编译成功了。

另外,还知道了ant脚本中各个target的含义。见:

http://www.yzcc.com/yzcc/ftbtwqgrvk/10325367491.html#。

每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。

任务1:usage 打印本脚本的帮助信息(缺省)
任务2:clean <-- init 清空初始化环境
任务3:javadoc <-- build <-- init 生成JAVADOC
任务4:jar <-- build <-- init 生成JAR
任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc
而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。

注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名 为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外 部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。

另注:有一些格式中要将windows下的路径写出E:\\lucene\\....形式,但xml中就写成:

E:/webapp/WEB-INF/build,.代表当前目录。在cmd下.同样代表当前路径,..代表上层路径,../../表示上两层路径。还不 太明白的是怎样设置ant中的if和unless后面的启动标志为设置状态和非设置状态,以及weblucene如何使用,明天再研究一下吧,今天实在不 行了。呵呵,睡觉了。

今天又有不小的收获,当然是以长时间坐在电脑前面饱受辐射为代价的,不过还是很有成就感的。终于,weblucene完全编译并建立索引成功了!而且根本 不是像很多人说的那样,这个版本的weblucene的文件不全,只要设置好环境变量,就都能找到了。因为weblucene中的一些在lucene基础 上没有进行修改的原始程序只提供了class文件,没有在包内重新发布代码,它们在weblucene\webapp\WEB-INF\lib下面的各 个.jar文件,应该把它们都加到classpath中。其实,weblucene把这些工作都设在了一个名为index.sh的批处理文件里了。只是并 没有把它改成适合windows运行的版本。而我又用惯windows,一时也看不出“index.sh”文件根本就是linux下的格式,所以才会反反 复复的做了很多无用功。应将其改成windows下的批处理文件“index.cmd”,当然里面的书写格式也要改过来。这样只要运行这个批处理文件就可 以完成环境变量配置和建立索引(即运行IndexRunner)的全过程了。

    呵呵,还有一点小常识,刚知道的,如果在批处理的文件最后加上“halt”就可以让一闪而过的dos窗口不关闭了,从而可以看清楚上面的运行信息了。当 然,在命令行下运行批处理文件也可以。如果在命令行下输入:批处理文件名 >保存信息的文件名,就可以把dos下全部信息输入到这个自动创建的文件中了。

对于昨天留下的那个问题,如何设置build.xml文件中的if后面的条件标志生效的问题也找到了答案。如标志变量为:javacc.present, 只要输入命令:ant  –Djavacc.present=true  jar即可。其实,其中的true可为任何东西,即使是“false”也可。这样一次编译就可成功了。

同样,在进行search时也可以自己建立一个批处理文件,起到把weblucene\webapp\WEB-INF\lib中的各个.jar文件加到 classpath中的作用,和完成运行SearchRunner的作用。其中最后一句运行语句是java SearchRunner -i 你的路径+\weblucene\webapp\WEB-INF\var\blog\index -f "FullIndex" -k "java"。(含义:-i表示自己指定索引保存路径,这样后面的一串路径才将作为保存路径生效,“java”是要搜索的关键词)

我在运行IndexRunner和IndexSearcher时还遇到了一个很傻的问题,不知为什么索引生成的路径总不是我指定的路径,检查了半天 weblucene代码,也没发现有什么默认路径的机制,后来才恍然大悟,原来时我的路径中有“Apache Group”一段,因为空格的原因,java把它当成了两个参数。呵呵

好了,至此weblucene完全安装编译成功了。

AddThis Social Bookmark Button

相关文档(Relevant Entries)
Lucene 基础指南
Beef up Web search applications with Lucene
Compass--在Lucene之上作了什么增强?
Lucene基本使用介绍
为lucene加入简单中文分词
用Lucene检索数据库
在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介
Lucene全文检索实践
WoW Powerleveling
Posted on March 27, 2007 7:02 PM | | | Comments (0) | | TrackBacks (0)

引用地址(TRACKBACKS)
 
TrackBack URL for this entry:
http://www.wujianrong.com/mt-tb.cgi/4942

发布评论(ADD YOUR COMMENTS)
 
感谢您参与评论;发表您的意见时请保持文章的相关性;不相关的或是单纯宣传的内容可能会被删掉。您的E-mail只是用来确认您发表的文章,不会出现在网页上。
Please keep your comments relevant to this blog entry. Email addresses are never displayed, but they are required to confirm your comments.

称呼(Name):      记住我的个人信息(Remember)
邮箱(Email):
网址(URL):
评论(Add your comments):

相关内容
广告计划