lucene の demo で Could not find the main class: org.apache.lucene.demo.IndexFiles.
by k-ui ~ 5月 23rd, 2010. Category: ほげほげ.Luceneを使いたくて、最新のJDKと最新のAntをインストールし、Luceneをコンパイルして、Apache Lucene – Building and Installing the Basic Demo を参考に demo を動かしてみようとした。、上記のエラーが出た。
$ java -version java version "1.6.0_18" OpenJDK Runtime Environment (IcedTea6 1.8) (6b18-1.8-0ubuntu1) OpenJDK Client VM (build 14.0-b16, mixed mode, sharing) $ ant -version Apache Ant version 1.8.1 compiled on April 30 2010 $ java org.apache.lucene.demo.IndexFiles src Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/lucene/demo/IndexFiles Caused by: java.lang.ClassNotFoundException: org.apache.lucene.demo.IndexFiles at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334) Could not find the main class: org.apache.lucene.demo.IndexFiles. Program will exit.
原因は、Luceneをantでビルドしたときに warning が出ていたところあたりにある様子。
lucene-3.0.1のディレクトリにある build.xml を書き換えないといけない。build.xml の中の javac タグに属性includeAntRuntimeを書き加える。(220行目付近に一箇所)
<javac srcdir="@{srcdir}" destdir="@{destdir}" deprecation="off" includeAntRuntime="true" ← ここだよ!!! debug="on" source="${javac.source}" target="${javac.target}"> <nested/> </javac>
これで動くはず。
しかし実際はダメでした。これは別に原因があった。僕は、CLASSPATH に lucene-core-3.0.1.jar と lucene-demos-3.0.1.jar を置いてなかった為、下記のようなコマンドで demo を実行する必要があった。
$ java -cp /home/kui/lucene/lucene-3.0.1/lucene-core-3.0.1.jar:/home/kui/lucene/lucene-3.0.1/lucene-demos-3.0.1.jar org.apache.lucene.demo.IndexFiles src
これで無事 lucene の demo が動きましたとさ。
ちなみに、ダメな時の ant のエラーは下記のようでした。
[javac] /home/k-ui/lucene/lucene-3.0.1/build.xml:225: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
Java で HelloWorld さえしてない自分には大変な作業でした。半日使ってしまった悲しい。