1

我在 Eclipse Juno 中使用 Lucene 编写了一个 Java 程序。每当我尝试运行它时,它都会出现以下错误:

Exception in thread "main" java.lang.VerifyError: Cannot inherit from final class

at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
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 parser.BuildMainIndex.setUp(BuildMainIndex.java:339)
at parser.luceneDemo.main(luceneDemo.java:10)

错误的来源,即 BuildManinIndex.java 中的行是:

        doc.add(new IntField("startTime1",startTime1,Field.Store.YES));

这里 startTime1 是文档中要索引的字段。我之前使用的是 Lucene 3.6.0,现在我使用的是 Lucene 4.3.0。我没有从 java.net.URL 导入任何东西。我不知道此错误的可能原因。请帮忙。

编辑:我编写的以下短程序。

writer=new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_CURRENT),IndexWriter.MaxFieldLength.UNLIMITED);

Document doc=new Document();
doc.add(new Field("title","XYZ",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("address","ABC Road",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("city","Mumbai",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new IntField("startTime1",900,Field.Store.YES));
doc.add(new IntField("finishTime1",1000,Field.Store.YES));
doc.add(new IntField("startTime2",9999,Field.Store.YES));
doc.add(new IntField("finishTime2",9999,Field.Store.YES));

writer.addDocument(doc);
writer.close();
4

1 回答 1

1

错误消息有点令人困惑,因为您没有继承IntField该类,而是创建了它的实例,对吗?

doc.add(new IntField("startTime1", startTime1, Field.Store.YES));

问题在于该声明的第一部分doc.add(..)DocumentLucene 版本 3.6.0 和 4.x 之间的类发生了变化-add(..)在 3.6 中接受Fieldable类 API),在 4.1.0 中接受IndexableField类 API)。

上有用的文章VerifyError。或者这个 StackOverflow 答案

此外,Lucene 3.6.0 中没有IntField,即该类来自 Apache Solr(类 API),但 Lucene 4.1.0 中有一个。您可能正在使用IntField与 Lucene 不同的 3.6 版本 - 请检查您的import语句和类路径。

更新

Joy,对您来说最简单的解决方案是删除旧的 Lucene JAR 文件/home/abhishek/mtp/stage-2/software/apache-tomcat-7.0.37/lib并放入新的文件,然后在 Eclipse 中刷新项目。

我对您的建议是切换到 Apache Maven 进行依赖管理(Eclipse 有一个 Maven 插件)。在 Eclipse 中,您创建一个“新 Maven 项目”并将依赖项添加到pom.xml文件中 - Lucene 的示例。这样您就不必将任何 JAR 文件复制到您的项目或 Tomcat 中。

祝你好运。

于 2013-06-07T06:11:33.363 回答