我在 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();
最佳答案
错误消息有点令人困惑,因为您没有继承 IntField
类,而是创建它的实例,对吗?
doc.add(new IntField("startTime1", startTime1, Field.Store.YES));
问题出在该语句的第一部分doc.add(..)
。
Lucene 版本 3.6.0 和 4.x 之间的 Document
类发生了变化 - 3.6 中的 add(..)
接受 Fieldable
( class API ),而在 4.1.0 中接受 IndexableField
( class API )。
有用article关于VerifyError
。或this StackOverflow answer .
此外,Lucene 3.6.0 中没有 IntField
,即该类来自 Apache Solr ( class API ),但 Lucene 4.1.0 中有一个。您可能使用的是 3.6 版本的 IntField
,它与 Lucene 的不同 - 请检查您的 import
语句和类路径。
更新
Joy,对您来说最简单的解决方案是从 /home/abhishek/mtp/stage-2/software/apache-tomcat-7.0.37/lib
中删除旧的 Lucene JAR 文件并放入新文件,然后在 Eclipse 中刷新项目。
我给你的建议是改用Apache Maven进行依赖管理(Eclipse有一个Maven插件)。在 Eclipse 中,您创建一个“新 Maven 项目”并将依赖项添加到 pom.xml
文件 - example for Lucene 。这样您就不必将任何 JAR 文件复制到您的项目或 Tomcat 中。
祝你好运。
关于java - 处理 java.lang.VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976993/